2010-06-06 25 views
4

我正在使用csv.DictWriter從一組字典中輸出csv文件。我用下面的功能:在Python中指定csv.writer的格式

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是字典列表,並提供字段名稱應被序列化到文件頭。

我的字典列表(dictrows)中的一些值是數字 - 例如,浮動,並且我想指定這些的格式。例如,我可能希望花車以「%.2f」而不是全部精度序列化。理想情況下,我想指定某種映射,說明如何格式化每種類型,例如

{float: "%.2f"} 

說,如果你看到一個浮點數,用%.2f格式化它。是否有捷徑可尋?我不想將DictWriter或類似的任何複雜類型 - 這看起來像非常通用的功能。

這怎麼辦?

我能想到的唯一的另一個解決方案是:不要亂搞DictWriter的格式化,只需使用十進制包來指定浮點數的小數精度爲%.2,這將導致序列化。不知道這是否是更好的解決方案?

非常感謝您的幫助。

回答

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) 

未經測試。