[英]Creating a nested dictionary from a csv file in Python
我正在从CSV文件中读取信息,并且正在使用嵌套字典来映射文件中的重复信息。 如何为文件的所有行为此文件创建嵌套字典? 数据示例(不是实际数据,而是基本相同的概念)
State ,City/Region ,Questions ,Answers
NY,Manhattan ,East/West Coast? ,East
NY,Manhattan ,been there? ,yes
NY,Brooklyn ,East/West Coast? ,East
NY,Brooklyn ,been there? ,yes
NY,Brooklyn ,Been to coney island? ,yes
NY,Queens ,East/West Coast? ,East
NY,Queens ,been there? ,yes
NY ,Staten Island ,is island? ,yes
MA,Boston ,East/West Coast? ,East
MA,Boston ,like it there? ,yes
MA,Pioneer Valley ,East/West Coast? ,East
MA,Pioneer Valley ,city? ,no
MA,Pioneer Valley ,college town? ,yes
CA,Bay Area ,warm? ,yes
CA ,Bay Area ,East/West Coast? ,West
CA ,SoCal ,north or south? ,south
CA ,SoCal ,warm ,yes
因此,从本质上讲,主词典具有3个键:NY,MA,CA,每个词典都具有以城市/地区为键的词典,并且每个城市/地区都具有问题和答案。
因此,这将是一个非常嵌套的字典,但是我无法弄清楚该语法对于文件中的每一行都可以做到。
我试过打开文件,使用for循环读取行,并用“,”将行分开。 像这样:
for line in my_file:
line=line.split(",")
MasterDict[line[0]] = {line[1] : {} }
MasterDict[line[0]][line[1]] = {line[2] : line[3]}
import csv
from collections import defaultdict
from functools import partial
defaultdict_of_dict = partial(defaultdict, dict)
master = defaultdict(defaultdict_of_dict)
with open("data.txt", 'r') as f:
csv_reader = csv.reader(f)
next(csv_reader) # Skip the first line
for row in csv_reader:
state, city, question, answer = [field.strip() for field in row]
master[state][city][question] = answer
print(master['NY']['Queens'])
# {'been there?': 'yes', 'East/West Coast?': 'East'}
print(master['NY']['Queens']['been there?'])
# yes
您可以使用csv模块读取CSV文件,该文件将负责拆分。
您提供的示例数据充满了不必要的空间。 如果您的真实数据相同,我们将使用strip
对其进行消毒。
为了避免在字典中创建丢失的键,可以使用defaultdict 。 它会使用默认值即时创建丢失的键。
例如,您可以这样做:
from collections import defaultdict
d = defaultdict(dict)
创建带有空字典作为缺失键的默认值的defaultdict
,并像这样使用它:
d["new_key"]["subkey"] = 5
print(d)
# defaultdict(<class 'dict'>, {'new_key': {'subkey': 5}})
您的情况有一个困难:您想要一个嵌套字典,所以我们需要一个dict
的defaultdict
的defaultdict
我们提供给defaultdict
的参数必须是可调用的,因此我们不能编写类似于defaultdict(defaultdict(dict))
,因为defaultdict(dict)
是defaultdict
,而不是函数。 一种实现方法是使用functools.partial创建defaultdict_of_dict
函数,我们可以将其传递给主defaultdict
。
我想出了如何使其工作。
import pprint
MasterDict={}
my_file.readline()
for line in my_file:
line=line.split(",")
if line[0] not in MasterDict:
MasterDict[line[0]] = {}
if line[1]:
if line[1] not in MasterDict[line[0]]:
MasterDict[line[0]][line[1]] = []
MasterDict[line[0]][line[1]].append((line[2], line[3]))
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(MasterDict)
您可以尝试使用以下简短版本:
f = open(myfile).readlines()
f = [i.strip('\n').split(',') for i in f]
d = {i[0]:{i[1]:[]} for i in f[1:]}
for i in f[1:]:
if i[1] not in d[i[0]]:
d[i[0]][i[1]] = i[2:]
else:
d[i[0]][i[1]].extend(i[2:])
print d
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.