Python 从3个不同的CSV文件创建嵌套字典

Python 从3个不同的CSV文件创建嵌套字典,python,dictionary,tkinter,Python,Dictionary,Tkinter,我的目标是从3个不同的CSV文件中获取数据并创建一个嵌套字典,我意识到我的错误,但我无法修复它 我应该为每个文件创建3种不同的方法来迭代数据,然后创建嵌套字典,还是我必须做其他事情 代码: 这是给出的错误: Exception in Tkinter callback Traceback (most recent call last): File "C:\Python27\Lib\lib-tk\Tkinter.py", line 1547, in __call__ return sel

我的目标是从3个不同的CSV文件中获取数据并创建一个嵌套字典,我意识到我的错误,但我无法修复它

我应该为每个文件创建3种不同的方法来迭代数据,然后创建嵌套字典,还是我必须做其他事情

代码:

这是给出的错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python27\Lib\lib-tk\Tkinter.py", line 1547, in __call__
    return self.func(*args)
  File "C:/Users/Umer Selmani/Desktop/voluntarily/Voluntiraly.py", line 825, in <lambda>
    self.ratingbutton=Button(self.framebutton,text='Upload movies',command=lambda :self.file1())
  File "C:/Users/Umer Selmani/Desktop/voluntarily/Voluntiraly.py", line 836, in file1
    self.dictionary()
  File "C:/Users/Umer Selmani/Desktop/voluntarily/Voluntiraly.py", line 858, in dictionary
    for line1,line2,line3 in zip(self.csv_file1,self.csv_file2,self.csv_file3):
AttributeError: STproject instance has no attribute 'csv_file2'
Tkinter回调中出现异常 回溯(最近一次呼叫最后一次): 文件“C:\Python27\Lib\Lib tk\Tkinter.py”,第1547行,在调用中__ 返回self.func(*args) 文件“C:/Users/Umer Selmani/Desktop/autonolive/Voluntiraly.py”,第825行,在 self.ratingbutton=Button(self.framebutton,text='Upload movies',command=lambda:self.file1()) 文件“C:/Users/Umer Selmani/Desktop/autonolive/Voluntiraly.py”,第836行,在文件1中 self.dictionary() 字典中第858行的文件“C:/Users/Umer Selmani/Desktop/Voluntiraly.py” 对于zip中的第1行、第2行、第3行(self.csv_文件1、self.csv_文件2、self.csv_文件3): AttributeError:STproject实例没有属性“csv\u file2”
我建议先将所选结果存储在一个地方,然后再通过另一个按钮进行处理。在下面的示例中,我使用
StringVar
存储文件路径

class STproject:

    def __init__(self, app):
        self.mlb=LabelFrame(app, text='Movie Recommendation Engine')
        self.mlb.grid()
        self.lframe3=LabelFrame(self.mlb,text="Movies/Users",background='purple')
        self.lframe3.grid(row=0,column=1)
        self.framebutton=Frame(self.mlb,background='pink',height=50,width=50)
        self.framebutton.grid(row=0,column=0)
        self.buttonsnlabels()
        self.all_vars = [StringVar() for _ in range(3)]

    def buttonsnlabels(self):
        self.ratingbutton=Button(self.framebutton,text='Upload movies',command=lambda:self.file(self.all_vars[0]))
        self.ratingbutton.grid(row=0,column=0)
        self.ratingbutton=Button(self.framebutton,text='Upload ratings',command=lambda:self.file(self.all_vars[1]))
        self.ratingbutton.grid(row=1,column=0)
        self.ratingbutton=Button(self.framebutton,text='Upload links',command=lambda:self.file(self.all_vars[2]))
        self.ratingbutton.grid(row=2,column=0)
        self.process = Button(self.framebutton,text='Process',command=self.dictionary)
        self.process.grid(row=1,column=1)

    def file(self, v):
        result = tkFileDialog.askopenfilename()
        if result:
            v.set(result)

    def dictionary(self):
        if all(i.get() for i in self.all_vars): #process only if all 3 files are selected
            with open(self.all_vars[0].get(),"r") as a, open(self.all_vars[1].get(),"r") as b, open(self.all_vars[2].get(),"r") as c:
                d = {}
                for line1,line2,line3 in zip(csv.reader(a),csv.reader(b),csv.reader(c)):
                    d[line1]={line2:line3}

root=Tk()
root.title()
application=STproject(root)
root.mainloop()

请注意,我还移动了原始代码中的
dict
的位置和名称。在您的代码中,而不是其他代码中,它隐藏了内置方法
dict
,在
for
循环的每次迭代中,它也会覆盖自身,我认为这不是您想要的。

您应该只在读取所有3个文件后调用
dictionary
方法。过早调用它们将导致
AttributeError
,因为它尚未定义。此外,您不会在任何地方关闭CSV文件。考虑1)只将路径保持为属性,在“代码>词典< /COD>函数或2中打开和关闭它们”,将内容存储为属性,并在<>代码>文件< /代码>函数之后关闭文件。您还在
dictionary
方法的for循环中不断实例化
dict
,这意味着您将只在文件中存储最后一行。@HenryYik,因此我必须调用dictionary,在第一个(_init_)方法中,或者我应该将所有三个文件方法收缩为一个,并将其分配给每个按钮lf.all_vars[0]=self.all_vars[0][1:]self.all_vars[1]=self.all_vars[1][1:]这是跳过第一行的正确代码吗?显然,该代码不起作用,您能否解释一下如何执行该操作?否-
StringVar
只存储了文件的路径。要跳过标题,请查看。谢谢您的帮助。愿上帝保佑你。
class STproject:

    def __init__(self, app):
        self.mlb=LabelFrame(app, text='Movie Recommendation Engine')
        self.mlb.grid()
        self.lframe3=LabelFrame(self.mlb,text="Movies/Users",background='purple')
        self.lframe3.grid(row=0,column=1)
        self.framebutton=Frame(self.mlb,background='pink',height=50,width=50)
        self.framebutton.grid(row=0,column=0)
        self.buttonsnlabels()
        self.all_vars = [StringVar() for _ in range(3)]

    def buttonsnlabels(self):
        self.ratingbutton=Button(self.framebutton,text='Upload movies',command=lambda:self.file(self.all_vars[0]))
        self.ratingbutton.grid(row=0,column=0)
        self.ratingbutton=Button(self.framebutton,text='Upload ratings',command=lambda:self.file(self.all_vars[1]))
        self.ratingbutton.grid(row=1,column=0)
        self.ratingbutton=Button(self.framebutton,text='Upload links',command=lambda:self.file(self.all_vars[2]))
        self.ratingbutton.grid(row=2,column=0)
        self.process = Button(self.framebutton,text='Process',command=self.dictionary)
        self.process.grid(row=1,column=1)

    def file(self, v):
        result = tkFileDialog.askopenfilename()
        if result:
            v.set(result)

    def dictionary(self):
        if all(i.get() for i in self.all_vars): #process only if all 3 files are selected
            with open(self.all_vars[0].get(),"r") as a, open(self.all_vars[1].get(),"r") as b, open(self.all_vars[2].get(),"r") as c:
                d = {}
                for line1,line2,line3 in zip(csv.reader(a),csv.reader(b),csv.reader(c)):
                    d[line1]={line2:line3}

root=Tk()
root.title()
application=STproject(root)
root.mainloop()