【问题标题】:How to convert convert csv to list of dictionaries (UTF-8)?如何将 csv 转换为字典列表(UTF-8)?
【发布时间】:2017-01-21 13:00:41
【问题描述】:

我有一个 csv 文件 (in.csv)

col1, col2, col3
Kapitän, Böse, Füller
...

我想创建一个字典列表:

a = [{'col1': 'Kapitän',  'col2': 'Böse', 'col3': 'Füller'},{...}]

在 Python 3 中可以使用

    import codecs
    with codecs.open('in.csv', encoding='utf-8') as f:
        a = [{k: v for k, v in row.items()}
            for row in csv.DictReader(f, skipinitialspace=True)]
    print(a)

(我从convert csv file to list of dictionaries 获得此代码)。

不幸的是,我在 Python 2 中需要它,但我不同意它。

我试图理解https://docs.python.org/2.7/howto/unicode.html,但我觉得我太笨了,因为

import codecs
f = codecs.open('in.csv', encoding='utf-8')
for line in f:
print repr(line) 

给我

u'col1,col2,col3\n'
u'K\xe4pten,B\xf6se,F\xfcller\n'
u'\n'

你有 Python 2 的解决方案吗?

这里解决了一个类似的问题:Creating a dictionary from a csv file? 但是使用标记的解决方案我得到('K\xc3\xa4pten', 'B\xc3\xb6se', 'F\xc3\xbcller')。也许编辑它以获得[{u'col1': u'K\xe4pten', u'col2': u'B\xf6se', u'col3': u'F\xfcller'}] 很容易?

【问题讨论】:

  • 阅读understanding repr,你看到的是那些unicode字符串的表示(u前缀等)。使用{k: v for k, v in row.items()},您基本上只是在重新创建字典。
  • 不确定“我不同意”是什么意思,但至少对于 2.7,您仍然可以使用 DictReader:docs.python.org/2/library/csv.html#csv.DictReader
  • @innoSPG:感谢您的链接!但对我来说有点不同:使用链接的解决方案,我得到{'K\xc3\xa4pten': 'B\xc3\xb6se', 'col1': 'col2'} @ilja:谢谢你的提示。现在我明白上面的代码工作正常。 @albert:我只是想说,我无法编辑这些示例中提到的代码供我使用,因为我过度紧张。

标签: python list python-2.7 csv dictionary


【解决方案1】:

打印使用print line 而不是print repr(line)

对于 dict 我使用这个解决方案

https://docs.python.org/2/library/csv.html#csv-examples

csv模块不直接支持Unicode读写

import codecs
import csv


def utf_8_encoder(unicode_csv_data):
    for line in unicode_csv_data:
        yield line.encode('utf-8')

def unicode_csv_reader(unicode_csv_data, dialect=csv.excel, **kwargs):
    # csv.py doesn't do Unicode; encode temporarily as UTF-8:
    csv_reader = csv.reader(utf_8_encoder(unicode_csv_data),
                            dialect=dialect, **kwargs)
    for row in csv_reader:
        # decode UTF-8 back to Unicode, cell by cell:
        yield [unicode(cell, 'utf-8') for cell in row]

with codecs.open('in.csv', encoding='utf-8') as f:
    reader = unicode_csv_reader(f)
    keys = [k.strip() for k in reader.next()]
    result = []
    for row in reader:
        d=dict(zip(keys, row))
        result.append(d)

    for d in result:
        for k, v in d.iteritems():
            print k, v
    print result

【讨论】:

  • 非常感谢!绝对太复杂了,我无法理解所有内容,但它确实有效,是的!
【解决方案2】:

您可以利用 csv 库来完成这项工作。

import csv

li_of_dicts = []
with open('in.csv', 'r') as infile:
     reader = csv.DictReader(infile, encoding='utf-8')
     for row in reader:
         li_of_dicts.append(row)

【讨论】:

  • 这段代码有错误:TypeError: 'encoding' is an invalid keyword argument for this function.
猜你喜欢
  • 2019-02-10
  • 2014-04-24
  • 2020-01-03
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 2011-03-06
相关资源
最近更新 更多