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