2016-04-28 209 views
2

我正在研究一个程序,需要将两个文件合并并将联合文件写入新文件。问题是输出文件包含这样的字符\xf0或者如果我改变了一些编码,结果就是那样的\u0028。输入文件被编码为utf8。我如何可以打印输出文件的字符像"è""ò""-"关于字符编码的Python问题

我已经做了这样的代码:

import codecs 
import pandas as pd 
import numpy as np 


goldstandard = "..\\files\file1.csv" 
tweets = "..\\files\\file2.csv" 

with codecs.open(tweets, "r", encoding="utf8") as t: 
    tFile = pd.read_csv(t, delimiter="\t", 
         names=['ID', 'Tweet'], 
         quoting=3) 

IDs = tFile['ID'] 
tweets = tFile['Tweet'] 

dict = {} 
for i in range(len(IDs)): 
    dict[np.int64(IDs[i])] = [str(tweets[i])] 


with codecs.open(goldstandard, "r", encoding="utf8") as gs: 
    for line in gs: 
     columns = line.split("\t") 
     index = np.int64(columns[0]) 
     rowValue = dict[index] 
     rowValue.append([columns[1], columns[2], columns[3], columns[5]]) 
     dict[index] = rowValue 

import pprint 
pprint.pprint(dict) 
ndic = pprint.pformat(dict, indent=4) 
f = codecs.open("out.csv", "w", "utf8") 
f.write(ndic) 
f.close() 

,这就是例子输出

desired: Beyoncè 
    obtained: Beyonc\xe9 
+0

你为什么漂亮打印?这会产生*表示*,并且字符串表示会为任何不可打印或非ASCII码点生成'\ xhh'转义序列(字面上4个字符,其中两个是十六进制)。 –

回答

3

你是生产的Python字符串文字,这里:

import pprint 
pprint.pprint(dict) 
ndic = pprint.pformat(dict, indent=4) 

漂亮打印对于生成调试输出非常有用;对象通过repr()传递给使不可打印和非ASCII字符容易区分和再现的:

>>> import pprint 
>>> value = u'Beyonc\xe9' 
>>> value 
u'Beyonc\xe9' 
>>> print value 
Beyoncé 
>>> pprint.pprint(value) 
u'Beyonc\xe9' 

é字符是Latin-1的范围内时,ASCII范围之外,因此它被表示语法当在Python代码中使用时会再次产生相同的值。

如果要将实际字符串值写出到输出文件,请勿使用pprint。在这种情况下,你必须做你自己的格式。

此外,熊猫数据帧将保存字节串,而不是unicode对象,所以在这一点上你仍然有未解码的UTF-8数据。

就我个人而言,我甚至不打扰在这里使用熊猫;你似乎想写CSV数据,所以我简化了你的代码,而不是使用csv模块,而且我实际上并不打算在这里解码UTF-8(这对于这种情况是安全的,因为它既是输入又是输入输出完全是UTF-8):

import csv 

tweets = {} 
with open(tweets, "rb") as t: 
    reader = csv.reader(t, delimiter='\t') 
    for id_, tweet in reader: 
     tweets[id_] = tweet 

with open(goldstandard, "rb") as gs, open("out.csv", 'wb') as outf: 
    reader = csv.reader(gs, delimiter='\t') 
    writer = csv.reader(outf, delimiter='\t') 
    for columns in reader: 
     index = columns[0] 
     writer.writerow([tweets[index]] + columns[1:4] + [columns[5]) 

注意,你真的想避免使用dict作为变量名;它掩盖了内置类型,我用tweets代替。

+0

您好,感谢您的帮助,我注意到,现在有那样json.dump输出 \\ u201c 对于印刷我改变了他的代码: 那样json.dump(UNICODE(字典),json_file,ensure_ascii = False,indent = 4) 没有unicode它不会打印(错误) –

+0

@ForceITA:'unicode(dict)'将通过调用对象上的'repr()'将整个字典转换为单个'unicode *第一*。你真的不想那样。我现在看到了这个问题,您正在使用'index = np.int64(columns [0])'作为字典键,而JSON要求您使用字符串替代键。 –

+0

@ForceITA:更新代码,将所有键首先转换为字符串。 –