来自 csv 的嵌套字典
Nested dictionaries from csv
我被这个问题困住了。我在 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'}}
}
我写了一个脚本来这样做,但我的脚本只 returns 行中的最后一项,如下所示:
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'}
如何调整脚本以遍历所有行中的所有索引?
我无法使用pandas。
您正在遍历所有索引,问题是您只有一个包含键“1”、“2”和“3”的字典,并且您正在更改与这些键相关的值。也许你应该为每一列创建一个字典。您可以使用 reader.fieldnames
来获取列名,您可以使用
for field in reader.fieldnames:
result[field] = {}
创建第一本词典。然后遍历每一行并将每个值添加到 result
中的正确字典
csv.DictReader()
returns 和 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'}}
我被这个问题困住了。我在 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'}}
}
我写了一个脚本来这样做,但我的脚本只 returns 行中的最后一项,如下所示:
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'}
如何调整脚本以遍历所有行中的所有索引?
我无法使用pandas。
您正在遍历所有索引,问题是您只有一个包含键“1”、“2”和“3”的字典,并且您正在更改与这些键相关的值。也许你应该为每一列创建一个字典。您可以使用 reader.fieldnames
来获取列名,您可以使用
for field in reader.fieldnames:
result[field] = {}
创建第一本词典。然后遍历每一行并将每个值添加到 result
中的正确字典csv.DictReader()
returns 和 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'}}