Как я могу использовать объект csv_reader снаружи как список? - PullRequest
0 голосов
/ 05 февраля 2020

Я хочу использовать список или диктовку, но я нахожу эту ошибку, когда пытался. Как я могу использовать объект 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.

Ответы [ 3 ]

2 голосов
/ 05 февраля 2020

Поскольку вы используете with open() для открытия файла, как только функциональный блок запускается, файл закрывается и у вас нет к нему доступа.

Чтобы сохранить контекст файла, вы можете использовать 2 из следующих способов:

  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)
Открыть файл вне функции
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()
0 голосов
/ 05 февраля 2020

Конструкция with open открывает файл в начале присоединенного кода и закрывает файл после последней строки. Вы можете использовать этот код:

def get_data(file):
    csv_reader = csv.DictReader(file,delimiter=',')
    return csv_reader
0 голосов
/ 05 февраля 2020

Вы открываете свой файл контекстным менеджером:

with open(...) as csv_file:

, в котором файл открыт. Однако при выходе из диспетчера контекста файл закрывается автоматически. и это то, что происходит после вашего return заявления, что вы больше не находитесь в контексте менеджера контекста.

Поэтому все операции, которые вам нужно выполнить, должны выполняться в with open(...) context

Вы можете попробовать:


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

...