我试图从文件中提取数据,将其放入列表中,将该列表放入字典中,然后将该字典追加到具有相应键名的更大字典中。到目前为止,一切正常,除了值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
to的键分配给时worddict
,您将创建一个引用,worddict
该引用意味着当worddict
更改时,会将相应的值bidDictionary
更改为new 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文件。花时间学习非常值得!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句