【问题标题】:Specifying formatting for csv.writer in Python在 Python 中为 csv.writer 指定格式
【发布时间】:2010-06-06 00:18:09
【问题描述】:

我正在使用 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,这将导致被序列化。不知道这是不是更好的解决方案?

非常感谢您的帮助。

【问题讨论】:

    标签: python parsing csv


    【解决方案1】:
    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)
    

    未测试。

    【讨论】:

      猜你喜欢
      • 2019-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 2021-12-03
      • 1970-01-01
      • 2018-05-18
      相关资源
      最近更新 更多