我正试图从文件中提取数据,将其放入列表,将该列表放入字典,然后将该字典附加到一个更大的字典中,并使用相应的键名。到目前为止,一切都正常,除了值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)
在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
更改时,bidDictionary
中的相应值将更改为新的worddict
。
就代码而言,问题是在循环开始之前只定义了worddict
一次。要解决这个问题,您需要为每一行创建一个新的worddict
,然后将其分配给bidDictionary
中的键。
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
模块,每次通过循环创建worddict
的副本(文档(。
作为一条建议,Pandas库非常适合处理csv文件。值得花时间学习!