2013-07-08 126 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'方法或使用三重引號的字符串。 –