Python CSV DictReader с данными UTF-8

Самая важная вещь, которую можно показать им, состоит в том, как получить доступ к документации, и как найти его (perldoc perltoc, perldoc -q $keyword, perldoc -f $function и т.д.).

Perl идет с замечательной документацией, включая материал учебного стиля и ссылку. Создание этого доступного для вновь прибывшего является самой эффективной вещью, которую можно сделать для них.

29
задан jrouquie 19 July 2012 в 16:56
поделиться

3 ответа

Классифицированный подход к ответу @LMatter. Благодаря этому подходу вы по-прежнему получаете все преимущества DictReader, такие как получение имен полей и номеров строк, а также обработку UTF-8

import csv

class UnicodeDictReader(csv.DictReader, object):

    def next(self):
        row = super(UnicodeDictReader, self).next()
        return {unicode(key, 'utf-8'): unicode(value, 'utf-8') for key, value in row.iteritems()}
0
ответ дан 28 November 2019 в 01:27
поделиться

Для меня ключ был не в манипулировании аргументами csv DictReader, а в самом открывателе файлов. Это помогло:

with open(filepath, mode="r", encoding="utf-8-sig") as csv_file:
    csv_reader = csv.DictReader(csv_file)

Никакого специального класса не требуется. Теперь я могу открывать файлы с или без спецификации без сбоев.

5
ответ дан 28 November 2019 в 01:27
поделиться

Ответ не имеет методов DictWriter, поэтому вот обновленный класс:

class DictUnicodeWriter(object):

    def __init__(self, f, fieldnames, dialect=csv.excel, encoding="utf-8", **kwds):
        self.fieldnames = fieldnames    # list of keys for the dict
        # Redirect output to a queue
        self.queue = cStringIO.StringIO()
        self.writer = csv.DictWriter(self.queue, fieldnames, dialect=dialect, **kwds)
        self.stream = f
        self.encoder = codecs.getincrementalencoder(encoding)()

    def writerow(self, row):
        self.writer.writerow({k: v.encode("utf-8") for k, v in row.items()})
        # 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)

    def writeheader(self):
        header = dict(zip(self.fieldnames, self.fieldnames))
        self.writerow(header)
0
ответ дан 28 November 2019 в 01:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: