2015-06-14 53 views
1

我想從我的列表中獲取一個csv文件。 這是我的名單:在Python中導出一個列表作爲csv文件並獲取UnicodeEncodeError

temp = ['سلام' , 'چطوری' ] 

列表的成員都在波斯語。 我試圖通過這個代碼獲取csv文件:

import csv  
with open("output.csv", "wb") as f: 
    writer = csv.writer(f) 
    writer.writerows(temp) 

但終端給了我這個錯誤: UnicodeEncodeError:「ASCII」編解碼器不能編碼字符U「\ u06a9」位置0:在範圍序數不(128)

我該如何解決它並獲得我的csv文件?

PS 其實當我打印臨時,我看到這些字符串:

[u'\u06a9\u0627\u062e \u0645\u0648\u0632\u0647 \u06af\u0644\u0633\u062a\u0627\u0646 | Golestan Palace', u'\u062a\u0647\u0631\u0627\u0646', u'\u062a\u0647\u0631\u0627\] 

但是,當我打電話溫度[1]我得到這個:

کاخ موزه گلستان | Golestan Palace 

我怎樣才能解決這個問題,並得到我的csv文件?

爲什麼有時候python會對我的數據進行編碼,而有時它不會呢?

+0

@AvinashRaj我嘗試代碼,但我再次得到了錯誤的清單列表!? – Mehdi

+0

它試圖以ASCII格式打開,但是你有UTF-16(http://graphemica.com/%DA%A9)。在打開文件並重試時指定適當的編碼。 – rbaleksandar

回答

1

Python 2中的csv庫無法處理Unicode數據。這在Python 3中得到修復,但不會被回溯。但是,有一個可以解決問題的替代第三方庫。

嘗試使用UnicodeCSV來代替。

2

在另一個答案中,你說你使用Python 2.7。從Python Standard Library Reference Manual - csv module提取:

csv模塊不直接支持讀取和寫入Unicode,但它是8位清除保存爲ASCII NUL字符的一些問題。因此,只要避免使用NUL的UTF-16編碼,就可以編寫處理編碼和解碼的函數或類。建議使用UTF-8。

同款給你,可以用來處理Unicode數據類的例子:

class UnicodeWriter: 
    """ 
    A CSV writer which will write rows to CSV file "f", 
    which is encoded in the given encoding. 
    """ 

    def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): 
     # Redirect output to a queue 
     self.queue = cStringIO.StringIO() 
     self.writer = csv.writer(self.queue, dialect=dialect, **kwds) 
     self.stream = f 
     self.encoder = codecs.getincrementalencoder(encoding)() 

    def writerow(self, row): 
     self.writer.writerow([s.encode("utf-8") for s in row]) 
     # Fetch UTF-8 output from the queue ... 
     data = self.queue.getvalue() 
     data = data.decode("utf-8") 
     # ... and reencode it into the target encoding 
     data = self.encoder.encode(data) 
     # write to the target stream 
     self.stream.write(data) 
     # empty queue 
     self.queue.truncate(0) 

    def writerows(self, rows): 
     for row in rows: 
      self.writerow(row) 

但你也可以嘗試簡單的代碼:

import csv  
with open("output.csv", "wb") as f: 
    writer = csv.writer(f) 
    writer.writerows([u.encode('utf-8') for u in temp]) 

如果temp是unicode字符串列表

或:

import csv  
with open("output.csv", "wb") as f: 
    writer = csv.writer(f) 
    writer.writerows([[u.encode('utf-8') for u in row] for row in temp]) 

溫度是否爲Unicode字符串

+0

當我用你的第一個簡單的代碼,我得到這個錯誤: writer.writerows([美國。('utf-8')for u in temp]) AttributeError:'list'object has no attribute'encode' 但是,當我嘗試第二個簡單代碼時,創建了csv文件,但它將temp中的每個字符列表: 例如Golestan或گلستان變成了,嗯,ل,س,ت,ا,ن,,|,G,o,l,e,s,t,a,n,, – Mehdi

+0

@Mehdi:你應該如果你想讓我測試代碼與實際值的對比,請準確地說出什麼是臨時的。 –

+0

臨時列表超過600個字符,我通過添加一些我從HTML頁面解析的數據創建臨時數據,下一個註釋是當我打印臨時數據時獲得的數據,如果有更好的方法來顯示臨時數據告訴我告訴你。 – Mehdi

相關問題