如何像列表一样在外部使用csv_reader对象?



我想像列表或字典一样使用,但是当我尝试时发现此错误。如何像列表一样在外部使用csv_reader对象?

import csv

def get_data(file):
with open(file,'r',encoding="ISO-8859-1") as csv_file:
csv_reader = csv.DictReader(csv_file,delimiter=',')
return csv_reader
for i in get_data('spam.csv'):
print(i)

Traceback (most recent call last):
File "test1.py", line 10, in <module>
for i in get_data('spam.csv'):
File "/home/indianic/anaconda3/lib/python3.7/csv.py", line 111, in __next__
self.fieldnames
File "/home/indianic/anaconda3/lib/python3.7/csv.py", line 98, in fieldnames
self._fieldnames = next(self.reader)
ValueError: I/O operation on closed file.

由于您使用with open()打开文件,因此一旦功能块运行,文件就会关闭,并且您无权访问它。

为了保持文件的上下文,您可以使用以下两种方式。

  1. 您可以通过对生成器对象进行监视而不是返回来使用它。
import csv

def get_data(file):
with open(file,'r',encoding="ISO-8859-1") as csv_file:
csv_reader = csv.DictReader(csv_file,delimiter=',')
for row in csv_reader:
yield row
for i in get_data('spam.csv'):
print(i)
  1. 打开函数外
  2. 的文件
import csv
def main():
csv_file = open(file,'r',encoding="ISO-8859-1")
for i in get_data(csv_file):
print(i)
csv_file.close()
def get_data(file):
csv_reader = csv.DictReader(file,delimiter=',')
return csv_reader
main()

with open构造在附加代码的开头打开文件,并在最后一行之后关闭文件。 您可以使用此代码:

def get_data(file):
csv_reader = csv.DictReader(file,delimiter=',')
return csv_reader

您正在打开文件上下文管理器:

with open(...) as csv_file:

文件打开的呜呜声。 只要您退出上下文管理器,文件就会自动关闭。这就是在您return语句之后发生的情况,您不再处于上下文管理器的上下文中。

因此,您需要执行的所有操作都应在with open(...)上下文中完成

您可以尝试:


import csv

def get_data(file):
with open(file,'r',encoding="ISO-8859-1") as csv_file:
result = []
csv_reader = csv.DictReader(csv_file,delimiter=',')
for i in csv_reader:
result.append(i)
return result

最新更新