Python:使用UnicodeWriter将Unicode写入CSV

时间:2013-04-11 22:33:33

标签: python csv unicode utf-8

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')

1 个答案:

答案 0 :(得分:4)

此症状指向将字符串输入到期望列表或元组的函数/方法中。

writerows方法期待列表列表,writerow期望包含字段值的列表(或元组)。由于您正在为它提供一个字符串,并且字符串可以在迭代时模拟字符列表,因此您将获得每列中包含一个字符的CSV。

如果您的CSV只有一列,则应使用writer.writerow([data])代替writer.writerow(data)。如果你只有一个列,有些人可能会质疑你是否真的需要csv模块,但是csv模块会处理包含有趣内容(CR / LF等)的记录,所以是的,这是个好主意。