【问题标题】:Is there a way to keep lines from being skipped when using csv.dictWriter.writerow(somerow)有没有办法在使用 csv.dictWriter.writerow(somerow) 时防止行被跳过
【发布时间】:2011-01-15 03:56:02
【问题描述】:

我正在处理一些文件,并希望创建我正在处理的日志。我通过使用字典来保存每个观察的键和值来创建日志,然后将字典附加到列表(字典列表)中。

为了保存日志,我使用 Python 的 csv 模块来写出字典列表。最初我使用的是 writerows,但我遇到了一个问题,即我存储的一些值很少是 ascii 以外的东西

例子

 Investee\xe2\x80\x99s Share of Profits

我的解决方案是使用 try / except 语句遍历我的字典列表以跳过有问题的字典

for docnumb, item in enumerate(x[1]):
    try:
        dict_writer.writerow(item)
    except UnicodeEncodeError:
        missed.append(docnumb)
        item

但是,这会导致在输出 csv 文件的每一行中插入一个额外的行。

value1 value2 value3 etc . . .
#blank row
value1 value2 value3 etc

我看不出如何抑制这种行为。

多一点代码,让我更清楚我是如何到达这里的

import csv
keyset=set([])
for item in x[1]:
    keyset |=set(item.keys())
keys=list(keyset)
logref=open(r'c:\December_2010_File_list.csv','w')
dict_writer=csv.DictWriter(logref,keys)

keyset |=set(item.keys())

【问题讨论】:

    标签: python csv


    【解决方案1】:

    请参阅http://docs.python.org/library/csv.html#csv-examples 的文档

    他们给出了一个 UnicodeWriter 类,如下所示:

    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)
    

    【讨论】:

    • 感谢您的麻烦,为什么我在文档中错过了这个?因为我有1/2的脑细胞
    猜你喜欢
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    相关资源
    最近更新 更多