3

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

4

1 回答 1

4

此症状指向类似于将字符串输入到期望列表或元组的函数/方法之类的事情。

writerows方法需要一个列表列表,并且writerow需要一个包含字段值的列表(或元组)。因为你给它一个字符串,并且当你迭代它时,一个字符串可以模仿一个字符列表,你会得到一个每列有一个字符的 CSV。

如果您的 CSV 只有一列,则应使用writer.writerow([data])而不是writer.writerow(data). 如果您只有一列,有些人可能会质疑您是否真的需要 csv 模块,但 csv 模块将处理诸如包含有趣内容(CR/LF 和其他)的记录之类的事情,所以是的,这是一个好主意。

于 2013-04-11T22:55:06.900 回答