【问题标题】:Nested dictionaries from csv来自 csv 的嵌套字典
【发布时间】:2023-03-15 23:21:01
【问题描述】:

我被这个问题困住了。我在 csv 中有一些数据,读取时看起来像:

Example Data
['', 'Name', 'Phone', 'Address', 'City', 'Country', 'Email']
['1', 'Bob Myers', '410-504-5887', '12334 Hamilton Way', 'Toronto', 'Canada', 'bob@gmail.com']
['2', 'Carlton James', '455-323-8479', '1234 James Rd', 'New York', 'USA', 'carlton@example.com']
['3', 'Frank Wright', '744-521-9874', '567 Travis St', 'Boston', 'USA', 'fw4322@yahoo.com']

我想让它看起来像这样:

my_dict = {{'Name': {1: 'Bob Myers', 2: 'Carlton James', 3: 'Frank Wright'}}, 
 {'Phone': {1: '410-504-5887', 2: '455-323-8479', 3: '744-521-9874'}}, 
 {'Address': {1: '12334 Hamilton Way', 2: '1234 James Rd', 3: '567 Travis St'}},
 {'City': {1: 'Toronto', 2: 'New York', 3: 'Boston'}},
 {'Country': {1: 'Canada', 2: 'USA', 3: 'USA'}},
 {'Email': {1: 'bob@gmail.com', 2: 'carlton@example.com', 3: 'fw4322@yahoo.com'}}
}

我为此编写了一个脚本,但我的脚本只返回该行中的最后一项,如下所示:

import csv
f = csv.DictReader(open('data.csv'))

result = {}
for row in f:
    key = row.pop('')
    for i in row:
        result[key] = row[i]
print(result)

-------:

{'1': 'bob@gmail.com', '2': 'carlton@example.com', '3': 'fw4322@yahoo.com'}

如何调整我的脚本以遍历所有行中的所有索引?

我不能使用熊猫。

【问题讨论】:

  • DictReader 中的行看起来不像您的示例。如果您打印这些行,它们将是dict,而不是列表。我不确定您的示例数据来自哪里,它不是 CSV,但当 csv.reader 读取时,它是 csv 的样子。最好将实际的 CSV 行作为示例数据发布,以便我们可以使用您的代码运行它。
  • 是的。这就是阅读时的样子。我编辑了评论以反映这一点。
  • 文件是这样的吗?然后它不是CSV。它看起来像 json 行或打印为字符串的 python 列表。如果您以 DictReader 的身份阅读此文件,则它们将是 {"[''": "['1'", " 'Name'": " 'Bob Myers'", " 'Phone'": " '410-504-5887'", " 'Address'": " '12334 Hamilton Way'", " 'City'": " 'Toronto'", " 'Country'": " 'Canada'", " 'Email']": " 'bob@gmail.com']"}

标签: python python-3.x csv dictionary nested-loops


【解决方案1】:

csv.DictReader() 返回一个OrderedDict,因此解决此问题的关键是使用标准字典方法访问您的值。这种方法提供了预期的结果:

import csv

f = csv.DictReader(open('data.csv'))


result = {}
for i, row in enumerate(f, start=1):
    row.pop('')
    if i == 1:
        for key, value in row.items():
            result[key] = {}
            result[key][i] = value
    else:
        for key, value in row.items():
            result[key][i] = value
    
print(result)

输出:

{'Name': {1: 'Bob Myers', 2: 'Carlton James', 3: ' Frank Wright'}, 
 'Phone': {1: ' 410-504-5887', 2: ' 455-323-8479', 3: ' 744-521-9874'}, 
 'Address': {1: '12334 Hamilton Way', 2: ' 1234 James Rd', 3: ' 567 Travis St'}, 
 'City': {1: ' Toronto', 2: ' New York', 3: ' Boston'}, 
 'Country': {1: ' Canada', 2: ' USA', 3: ' USA'}, 
 'Email': {1: ' bob@gmail.com', 2: ' carlton@example.com', 3: ' sdfa@yahoo.com'}}

【讨论】:

    【解决方案2】:

    您正在遍历所有索引,问题是您只有一个带有键“1”、“2”和“3”的字典,并且您正在更改与此键相关的值。也许您应该为每一列创建一个字典。您可以使用reader.fieldnames 来获取列名,您可以这样做

    for field in reader.fieldnames:
        result[field] = {}
    

    创建第一个字典。然后遍历每一行并将每个值添加到结果中的正确字典

    【讨论】:

      猜你喜欢
      • 2014-09-20
      • 1970-01-01
      • 2015-10-28
      • 2019-11-16
      • 2020-04-16
      • 2018-01-19
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多