我想像列表或字典一样使用,但是当我尝试时发现此错误。如何像列表一样在外部使用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()
打开文件,因此一旦功能块运行,文件就会关闭,并且您无权访问它。
为了保持文件的上下文,您可以使用以下两种方式。
- 您可以通过对生成器对象进行监视而不是返回来使用它。
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)
- 打开函数外 的文件
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