Python csv模块=>;DictReader类读取器对象:为什么可以';我在文件关闭的情况下迭代读卡器对象,但我可以访问它的属性吗?
这可能是一个愚蠢的问题,但我被以下内容弄糊涂了:我用csv模块的DictReader类创建了一个reader对象 以下代码返回错误,因为由于for循环未缩进,csv文件已关闭:Python csv模块=>;DictReader类读取器对象:为什么可以';我在文件关闭的情况下迭代读卡器对象,但我可以访问它的属性吗?,python,csv,filereader,Python,Csv,Filereader,这可能是一个愚蠢的问题,但我被以下内容弄糊涂了:我用csv模块的DictReader类创建了一个reader对象 以下代码返回错误,因为由于for循环未缩进,csv文件已关闭: import csv with open(file) as csvfile: reader = csv.DictReader(csvfile) for row in reader: print(row) 返回此错误: ValueError: I/O operation on closed file.
import csv
with open(file) as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
print(row)
返回此错误:
ValueError: I/O operation on closed file.
但是,我可以运行命令来获取读取器的属性,例如:
reader.fieldnames
reader.line_num
这是什么逻辑?我不明白为什么我可以访问读者的属性,但不再遍历它。此外,我会认为,一旦我分配:
reader = csv.DictReader(csvfile)
我应该能够访问读者的内容,即使文件关闭
csv.DictReader
(以及csv.reader
)是以文件句柄对象作为参数构建的。它不会复制句柄,或者一次读取文件的全部内容,或者诸如此类的事情
当您退出with
块时,此文件句柄关闭,当csv.DictReader
对象尝试访问它时,它会意外发现“closed file”异常。请注意,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
对象本身仍然有效
如果要保留内容,必须在单独的列表
对象中强制对文件进行迭代,如果要方便地保存阅读器属性:
reader = csv.DictReader(csvfile)
contents = list(reader)
如果在创建
DictReader
时未指定字段名
,尝试访问此属性将使读取器
尝试从文件的第一行获取它们,并将失败,导致值错误:对关闭的文件执行I/O操作。
谢谢,这一切都是有意义的。我仍然感到惊讶/高兴的是,即使我不能再使用对象读取数据,我仍然可以访问字段名等属性。我想这只是内存使用的问题。