在Python中为csv.writer指定格式

4 投票
1 回答
3675 浏览
提问于 2025-04-15 23:36

我正在使用csv.DictWriter从一组字典输出csv文件。我用的是下面这个函数:

def dictlist2file(dictrows, filename, fieldnames, delimiter='\t',
          lineterminator='\n'):
    out_f = open(filename, 'w')

    # Write out header
    header = delimiter.join(fieldnames) + lineterminator
    out_f.write(header)

    # Write out dictionary
    data = csv.DictWriter(out_f, fieldnames,
              delimiter=delimiter,
              lineterminator=lineterminator)
    data.writerows(dictrows)
    out_f.close()

这里的dictrows是一个字典列表,而fieldnames提供了应该写入文件的表头。

在我的字典列表(dictrows)中,有些值是数字,比如浮点数,我想指定这些数字的格式。例如,我可能希望浮点数以"%.2f"的格式输出,而不是完整的精度。理想情况下,我想指定一种映射,告诉程序如何格式化每种类型,比如:

{float: "%.2f"}

这表示如果你看到一个浮点数,就用%.2f格式化它。有没有简单的方法可以做到这一点?我不想去继承DictWriter或者做一些复杂的事情——这看起来像是很通用的功能。

这该怎么做呢?

我能想到的唯一其他解决方案是:与其去调整DictWriter的格式,不如直接使用decimal包来指定浮点数的精度为%.2,这样就会以这种格式输出。不知道这是不是更好的解决方案?

非常感谢你的帮助。

1 个回答

5
class TypedWriter:
    """
    A CSV writer which will write rows to CSV file "f",
    which uses "fieldformats" to format fields.
    """

    def __init__(self, f, fieldnames, fieldformats, **kwds):
        self.writer = csv.DictWriter(f, fieldnames, **kwds)
        self.formats = fieldformats

    def writerow(self, row):
        self.writer.writerow(dict((k, self.formats[k] % v) 
                                  for k, v in row.iteritems()))

    def writerows(self, rows):
        for row in rows:
            self.writerow(row)

没有经过测试。

撰写回答