Указание форматирования для csv.writer в Python - PullRequest
4 голосов
/ 06 июня 2010

Я использую 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 - это список словарей, а имена полей предоставляют заголовки, которые должны быть сериализованы в файл.

Некоторые значения в моем списке словарей (dictrows) являются числовыми - например, плавает, и я хотел бы указать форматирование этих. Например, я хотел бы, чтобы плавающие элементы были сериализованы с "% .2f", а не с полной точностью. В идеале я хотел бы указать какое-то отображение, в котором указано, как форматировать каждый тип, например,

{float: "%.2f"}

это говорит о том, что если вы видите поплавок, отформатируйте его с% .2f. Есть простой способ сделать это? Я не хочу создавать подкласс DictWriter или чего-то такого сложного - это кажется очень общей функциональностью.

Как это можно сделать?

Единственное другое решение, которое я могу придумать, это: вместо того, чтобы возиться с форматированием DictWriter, просто используйте десятичный пакет, чтобы указать десятичную точность значений с плавающей запятой, равную% .2, что приведет к ее сериализации. Не знаете, если это лучшее решение?

Большое спасибо за вашу помощь.

1 Ответ

5 голосов
/ 06 июня 2010
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)

Не проверено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...