从csv文件中获取数据:对已关闭文件的错误IO操作

时间:2016-07-02 19:51:56

标签: python csv

我试图从csv文件中获取一些数据但是出现了一些错误

错误:##

  

Tkinter回调中的异常

     

追踪(最近一次呼叫最后一次):

     

文件   " C:\用户\ HP- \应用程序数据\本地\程序\的Python \ Python35-32 \ lib中\ tkinter__init __ PY&#34 ;,   第1549行,致电       return self.func(* args)

     

文件" C:\ Users \ hp- \ Downloads \ pyguii.py",第120行,在combine_funcs中       建议()

     

文件" C:\ Users \ hp- \ Downloads \ pyguii.py",第114行,推荐       读者中的行:

     

文件   " C:\用户\ HP- \应用程序数据\本地\程序\的Python \ Python35-32 \ lib中\ csv.py&#34 ;,   第109行,下一步       self.fieldnames

     

文件   " C:\用户\ HP- \应用程序数据\本地\程序\的Python \ Python35-32 \ lib中\ csv.py&#34 ;,   第96行,在字段名中

self._fieldnames = next(self.reader) ValueError: I/O operation on closed file.
def getrate():
    stem=tk.Toplevel(root)
    a1=Label(stem,text='Which type of songs will you like to listen')
    a1.grid(row=0,column=0)  
    var2 = IntVar()
    dd1 = Radiobutton(stem, text="Hindi songs", variable=var2, value=1)
    dd1.grid(row=1,column=1)
    label = Label(stem)  
    dd2 = Radiobutton(stem, text="Punjabi songs", variable=var2, value=2)
    dd2.grid(row=2,column=2)
    label = Label(stem)  


def getcat1():
    gg2=var2.get()
    fields.append(gg2)
    with open(r'category.csv', 'a') as f:
            writer = csv.writer(f)
            writer.writerow(fields)
    print(gg2)

def recommend():
    with open('listsng.csv') as csvfile:
         reader = csv.DictReader(csvfile)
         #print (reader)
    for row in reader:
         if '2015' in row['Year'] and 'Hindi' in row['Category']:
             print(row['Song Name'])

def combine_funcs():
    getcat1()
    recommend()
ee=Button(stem,text='Submit',command=combine_funcs)
ee.grid(row=10,column=2)
ee1=Button(stem,text='Skip',command='')
ee1.grid(row=10,column=4)

1 个答案:

答案 0 :(得分:1)

在文件被打开的上下文之外关闭文件后,您正尝试访问reader。将for函数中的recommend循环移至with的上下文中,如下所示:

def recommend():
    with open('listsng.csv') as csvfile:
         reader = csv.DictReader(csvfile)
         #print (reader)
         for row in reader:
             if '2015' in row['Year'] and 'Hindi' in row['Category']:
                 print(row['Song Name'])

Python中的with语句创建了一个上下文,在这种情况下,为文件对象创建了一个上下文。离开with上下文后,Python会关闭文件并进行一些清理。因此,必须在打开文件的上下文中执行与文件对象相关的所有操作。