【问题标题】:Convert .csv table to dictionary [duplicate]将.csv表转换为字典[重复]
【发布时间】:2013-11-25 18:26:53
【问题描述】:

所以我有一些格式如下的 csv 文件:

person,age,nationality,language
Jack,18,Canadian,English
Rahul,25,Indian,Hindi
Mark,50,American,English
Kyou, 21, Japanese, English

我需要导入它,并将该数据作为字典返回,键作为第一行的列标题,每列中的所有数据作为该特定键的值。例如:

dict = {
    'person': ['Jack', 'Rahul', 'Mark', 'Kyou'],
    'age': [18, 25, 50, 21],
    'nationality': ['Canadian', 'Indian', 'American', 'Japanese'],
    'language': ['English', 'Hindi', 'English', 'English']
}

知道我将如何开始这段代码并使其适用于 .csv 文件中给定的任意数量的列吗?

【问题讨论】:

  • 看看csv 模块。特别是DictReader。它应该允许您获得[{'person': 'jack', 'age': '18', ...}, ...]。从那里可以得到你想要的东西。
  • csv 模块可让您将其转换为 listdicts
  • 我需要将结果输出为字典,而不是列表。
  • 不完全重复 - 相关,但该问题希望使用列值作为键,而该问题希望使用标题作为键。
  • 不完全重复,我需要使用第一行作为键,而不是该问题中的第一列

标签: python dictionary import-from-csv


【解决方案1】:

我会选择类似的东西:

import csv

with open('input') as fin:
    csvin = csv.reader(fin)
    header = next(csvin, [])
    print dict(zip(header, zip(*csvin)))

# {'person': ('Jack', 'Rahul', 'Mark', 'Kyou'), 'age': ('18', '25', '50', ' 21'), 'language': ('English', 'Hindi', 'English', ' English'), 'nationality': ('Canadian', 'Indian', 'American', ' Japanese')}

相应地适应。

【讨论】:

  • 这很简洁。需要注意的一件事是,这将在参差不齐的行上中断 - 也就是说,如果有任何省略 languagenationality 之后的逗号。 reader 实例不填写缺失字段,zip 截断为最短序列。这是否是一个真正的问题取决于具体情况。
【解决方案2】:

使用 csv 模块,我会这样做:

with open('somefile.csv', 'rb') as input_file:
    reader = csv.DictReader(input_file)
    results = {}
    for linedict in reader:
        for (key, value) in linedict.iteritems():
            results.setdefault(key, []).append(value)

【讨论】:

    【解决方案3】:

    这是一个使用 python CSV 模块的相当简单的解决方案(此处的文档:http://docs.python.org/2/library/csv.html)。只需将“csv_data.csv”替换为 CSV 文件的名称即可。

    import csv
    
    with open('csv_data.csv') as csv_data:
        reader = csv.reader(csv_data)
    
        # eliminate blank rows if they exist
        rows = [row for row in reader if row]
        headings = rows[0] # get headings
    
        person_info = {}
        for row in rows[1:]:
            # append the dataitem to the end of the dictionary entry
            # set the default value of [] if this key has not been seen
            for col_header, data_column in zip(headings, row):
                person_info.setdefault(col_header, []).append(data_column)
    
        print person_info
    

    【讨论】:

      【解决方案4】:

      一旦您使用 csv 模块将数据放入列表列表中,您就可以在字典理解中使用压缩和切片。

      {col[0] : col[1:] for col in zip(*rows)}
      

      【讨论】:

        猜你喜欢
        • 2021-12-22
        • 2021-04-01
        • 2014-04-24
        • 2011-10-17
        • 2017-10-01
        • 1970-01-01
        • 2018-12-13
        • 1970-01-01
        • 2017-11-08
        相关资源
        最近更新 更多