Самая важная вещь, которую можно показать им, состоит в том, как получить доступ к документации, и как найти его (perldoc perltoc
, perldoc -q $keyword
, perldoc -f $function
и т.д.).
Perl идет с замечательной документацией, включая материал учебного стиля и ссылку. Создание этого доступного для вновь прибывшего является самой эффективной вещью, которую можно сделать для них.
Классифицированный подход к ответу @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()}
Для меня ключ был не в манипулировании аргументами csv DictReader, а в самом открывателе файлов. Это помогло:
with open(filepath, mode="r", encoding="utf-8-sig") as csv_file:
csv_reader = csv.DictReader(csv_file)
Никакого специального класса не требуется. Теперь я могу открывать файлы с или без спецификации без сбоев.
Ответ не имеет методов 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)