我怎样才能像列表一样在外部使用 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() 打开文件,一旦功能块运行,文件就会关闭,您无法访问它。

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

  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. 在函数外打开文件
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