Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python csv模块=>;DictReader类读取器对象:为什么可以';我在文件关闭的情况下迭代读卡器对象,但我可以访问它的属性吗?_Python_Csv_Filereader - Fatal编程技术网

Python csv模块=>;DictReader类读取器对象:为什么可以';我在文件关闭的情况下迭代读卡器对象,但我可以访问它的属性吗?

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.

这可能是一个愚蠢的问题,但我被以下内容弄糊涂了:我用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.
但是,我可以运行命令来获取读取器的属性,例如:

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操作。
谢谢,这一切都是有意义的。我仍然感到惊讶/高兴的是,即使我不能再使用对象读取数据,我仍然可以访问字段名等属性。我想这只是内存使用的问题。