2013-07-08 97 views
1

从csv读取unicode字符时遇到问题。 CSV文件原本Unicode的标签要素:从CSV读取Unicode

  1. "[u'Aeron\xe1utica']"
  2. "[u'Ni\u0161']"
  3. "[u'K\xfcnste']" ...

从中我不得不删除U '' 标签给一个CSV与

  1. Aeron\xe1utica
  2. Ni\u0161
  3. K\xfcnste ....

现在我想读的CSV和输出入与字符的文件,即

  1. Aeronáutica
  2. Niš
  3. Künste ....

我试图在csv docs使用UnicodeWriter,但它给人的输出作为第二列表

这里同样是我所做的读写:

c = open('foo.csv','r') 
r = csv.reader(c) 
for row in reader: 
p = p + row 
#The elements in p were ['Aeron\\xe1utica', 'Ni\\u0161', 'K\\xfcnste'...] 
c = open('bar.csv','w') 
c.write(codecs.BOM_UTF8) 
writer = UnicodeWriter(c) 
for row in p: 
writer.writerow([row]) 

我也试过codecs.open ('','','UTF-8'),但它没有帮助

+2

不,你*不*需要删除'u'。这些是Unicode值,你*想*统一码值。 –

+1

当读取带有编码字符的CSV时,为什么不使用'UnicodeReader'? –

+1

澄清:是否[u'Aeron \ xe1utica']是文件中的文字 - 如果不是 - 是什么? –

回答

0

看起来你已经将Python列表直接写入了CSV文件,导致了[...]字面语法,而不是正常的列。然后,您再次删除了大部分可能用于使用Unicode字符串将信息转回到Python列表的信息。

你剩下的是Python unicode文字,但没有引号。使用unicode_escape到值再次解码为Unicode:

with open('foo.csv','r') as b0rken 
    for line in b0rken: 
     value = line.rstrip('\r\n').decode('unicode_escape') 
     print value 

或加回u'..'报价,采用了三引号的字符串在试图避免需要逃跑嵌入式报价:

with open('foo.csv','r') as b0rken 
    for line in b0rken: 
     value = literal_eval("u'''{}'''".format(line.rstrip('\r\n'))) 
     print value 

如果您仍然拥有原始文件(使用[u'...']格式的行),请使用ast.literal_eval()函数将它们转换回Python列表。在这里使用CSV模块没有点:

from ast import literal_eval 

with open('foo.csv','r') as b0rken 
    for line in b0rken: 
     lis = literal_eval(line) 
     value = lis[0] 
     print value 

演示与unicode_escape

>>> for line in b0rken: 
...  print line.rstrip('\r\n').decode('unicode_escape') 
... 
Aeronáutica 
Niš 
Künste 
École de l'Air 
+0

谢谢,几乎在那里,但对于一个小问题。一些元素已经具有“字符,例如:\ xc9cole de l'Air。这是给错误 文件“”,1号线 U'\ xc9cole DE L'Air的 ^ 语法错误:无效的语法 当然,我可以很容易地取代它让过去,但任何直接的方法更有帮助 – KBhokray

+0

@KBhokray:只需使用'unicode_escape'方法或使用三重引号的字符串。 –