我怎样才能像列表一样在外部使用 csv_reader 对象?
How can I use csv_reader object outside like a list?
我想像 list 或 dict 一样使用,但我在尝试时发现了这个错误。我怎样才能像列表一样在外部使用 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(...) 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
with open
构造在附加代码的开头打开文件并在最后一行之后关闭文件。
您可以使用此代码:
def get_data(file):
csv_reader = csv.DictReader(file,delimiter=',')
return csv_reader
我想像 list 或 dict 一样使用,但我在尝试时发现了这个错误。我怎样才能像列表一样在外部使用 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(...) 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
with open
构造在附加代码的开头打开文件并在最后一行之后关闭文件。
您可以使用此代码:
def get_data(file):
csv_reader = csv.DictReader(file,delimiter=',')
return csv_reader