csv.DictReader
(и csv.reader
также) создаются с использованием объекта дескриптора файла в качестве параметра. Он не копирует дескриптор и не читает сразу все содержимое файла, или тому подобное.
Когда вы выходите из блока with
, этот дескриптор файла закрывается, и когда объект csv.DictReader
пытается чтобы получить к нему доступ, он наталкивается на исключение «закрытый файл». Обратите внимание, что блок with
применяется к необработанному дескриптору файла, а не к объекту csv.DictReader
.
Объект csv.DictReader
все еще существует и является действительным, но больше не может использоваться для чтения данных, поскольку его источник дескриптор файла был признан недействительным.
Это ничем не отличается от более простого примера ниже:
class Foo:
def __init__(self,source):
self.source = source
def bar(self):
print(self.source)
lst = [1,2,3]
f = Foo(lst)
f.bar() # prints [1, 2, 3]
lst.clear()
f.bar() # prints []
Выше, как только очищается lst
, объект f
теряет способность распечатайте список, даже если сам объект f
остается действительным.
Если вы хотите сохранить содержимое, вы должны принудительно выполнить итерацию для файла, в отдельном объекте list
, если вы хотите сохранить атрибуты читателя удобно:
reader = csv.DictReader(csvfile)
contents = list(reader)