Python 文档有以下关于将 unicode 写入 csv 文件的代码示例。我认为它已经提到这是因为 csv 模块无法处理 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)
我正在编写多个文件,为了简单起见,我只放了我的代码部分来演示我如何在我的代码中使用上面的类:
def write(self):
"""
Outputs the dataset to a csv.
"""
f = codecs.open(self.filename, 'a')
writer = UnicodeWriter(f)
#with open(self.filename, 'a', encoding='utf-8') as f:
if self.headers and not self.written:
writer.writerow(self.headers)
self.written = True
for record in self.records[self.last_written:]:
print record
writer.writerow(record)
self.last_written = len(self.records)
f.close()
这是类 coll 数据集内的一种方法,它在写入 csv 之前准备数据集,以前我使用过,writer = csv.writer(f)
但由于编解码器错误,我将代码更改为使用 `UnicodeWriter 类。
但我的问题是,当我打开 csv 文件时,我得到以下信息:
some_header
B,r,ë,k,ò,w,n,i,k,_,b,s
B,r,ë,k,ò,w,n,i,k,_,c,s
B,r,ë,k,ò,w,n,i,k,_,c,s,b
B,r,ë,k,ò,w,n,i,k,_,d,e
B,r,ë,k,ò,w,n,i,k,_,d,e,-,1
B,r,ë,k,ò,w,n,i,k,_,d,e,-,2
B,r,ë,k,ò,w,n,i,k,_,d,e,-,3
B,r,ë,k,ò,w,n,i,k,_,d,e,-,4
B,r,ë,k,ò,w,n,i,k,_,d,e,-,5
B,r,ë,k,ò,w,n,i,k,_,d,e,-,M
B,r,ë,k,ò,w,n,i,k,_,e,n
B,r,ë,k,ò,w,n,i,k,_,e,n,-,1
B,r,ë,k,ò,w,n,i,k,_,e,n,-,2
这些行实际上应该是Brëkòwnik_de-1
我不是真的发生了什么。
为了大致了解数据是如何生成的,我将添加以下行:
title = unicode(row_page_title['page_title'], 'utf-8')