我正在尝试从文件中提取数据,将其放入列表中,将该列表放入字典中,然后将该字典附加到具有相应键名的更大字典中。到目前为止,一切正常,除了值worddict
仅提供最新版本,而密钥根据其名称更改时。如何将当前的worddict
附加到bigDictionary
而不是文件的最后一行(worddict
的最后一个值)
import csv
bigDictionary = {}
worddict={}
with open('puzzle.csv') as csvfile:
csvreader = csv.reader(csvfile, delimiter='\n')
for row in csvreader:
wordrow = ''.join(row)
wordlist=wordrow.split('\t')
worddict['y']=wordlist[0]
worddict['x']=wordlist[1]
worddict['box']=wordlist[2]
worddict['direction']=wordlist[3]
worddict['word']=wordlist[4]
worddict['clue']=wordlist[5]
print(worddict)
#bigDictionary.update({wordlist[4]:worddict})
bigDictionary[wordlist[4]] = worddict
print(bigDictionary)
答案 0 :(得分:0)
在Python中,当您将一个变量分配给第二个变量时,您只会为第二个变量创建引用。这意味着当第二个变量更改时,第一个也将更改。
x = [1, 2, 3]
# y is only a reference to x
y = x
# When x changes, y will as well
x[2] = 5
print(y)
# y points to the same object as x
[1, 2, 5]
将bigDictionary
的键分配给worddict
时,将创建对worddict
的引用,这意味着worddict
更改时,{{1}中的对应值}更改为新的bidDictionary
。
就您的代码而言,问题在于您仅在循环开始之前定义了worddict
一次。要解决该问题,您需要为每行创建一个 new worddict
,然后将其分配给worddict
中的键。
bidDictionary
另一种选择是每次循环(documentation)时使用import csv
bigDictionary = {}
with open('puzzle.csv') as csvfile:
csvreader = csv.reader(csvfile, delimiter='\n')
for row in csvreader:
# Define new dictionary
worddict={}
wordrow = ''.join(row)
wordlist=wordrow.split('\t')
worddict['y']=wordlist[0]
worddict['x']=wordlist[1]
worddict['box']=wordlist[2]
worddict['direction']=wordlist[3]
worddict['word']=wordlist[4]
worddict['clue']=wordlist[5]
bigDictionary[wordlist[4]] = worddict
模块并创建copy
的副本。
作为建议,Pandas library非常适合使用csv文件。花时间学习非常值得!