1. 程式人生 > >python2和python3向csv檔案中寫入Unicode字元

python2和python3向csv檔案中寫入Unicode字元

1、python2向csv檔案寫入中文或者unicode,可以參考UnicodeWriter類

https://blog.csdn.net/qq_16912257/article/details/52127762

2、python3中字串都變成了unicode編碼,並且取消了cStringIO類,需要對UnicodeWriter類進行修改。

# -*- coding: utf-8 -*-
import csv
import codecs
from io import StringIO

# 這個類來自官方文件
class UnicodeWriter:
    def __init__(self, f, dialect=csv.excel, encoding="utf-8-sig", **kwds):
        self.queue = 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(row)
        data = self.queue.getvalue()
        data = self.encoder.encode(data)
        self.stream.write(data)
        self.queue.truncate(0)
        self.queue.seek(0)#for python3

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

if __name__ == '__main__':
    name = u'BrownWong你好哈哈'
    file_name = './test.csv'
    
    writer = UnicodeWriter(open(file_name, 'wb'), delimiter=',')
    writer.writerow([name])
  writer.writerow([name])

需要注意的是:python3中StringIO.truncate(0)函式不會重置當前位置,需要單獨在用seek(0)將位置重置到頭。否則在truncate(0)了,write會填充0。

'\x00\x00\x00

StringIO在python2和python3的不同,

具體的原因可以看下面的帖子:

https://stackoverflow.com/questions/4330812/how-do-i-clear-a-stringio-object