gpt4 book ai didi

python - 解释每个 open() 语句一次读取操作的行为?

转载 作者:太空宇宙 更新时间:2023-11-03 19:51:20 24 4
gpt4 key购买 nike

最近我在 Python 中遇到了 with open() 语句的奇怪行为。以下代码仅返回第一个读取语句的输出,具有空行列表。

input_csv = []
with open(self.path, 'r') as f: # Opening the CSV
r = csv.DictReader(f)
for row in r:
input_csv.append(row) # Storing its contents in a dictionary for later use
lines = f.readlines() # Reading it in as a list too
f.close()

将其拆分为两个 open() 语句时会返回所需的对象。

input_csv = []
with open(self.path, 'r') as f: # Opening the CSV
r = csv.DictReader(f)
for row in r:
input_csv.append(row) # Storing its contents in a dictionary for later use
f.close()

with open(self.path, 'r') as f: # Opening the CSV
lines = f.readlines() # Reading it in as a list too
f.close()

为什么 f 变量在第一个语句中只使用了一次?

非常感谢

最佳答案

如果您查看 csv.reader() 的文档用于 DictReader().reader :

Return a reader object which will iterate over lines in the given csvfile. csvfile can be any object which supports the iterator protocol and returns a string each time its __next__() method is called...

因此,它使用类文件对象的行为,每次迭代本质上都是f.readline()。该操作还会推进文件中的当前位置...直到到达 EOF,迭代时会引发 StopIteration 异常。这与您在尝试时观察到的行为相同:

with open(self.path, 'r') as f:
for l in f:
pass # each line was read
print(f.readlines())

您可以添加 print(f.tell()) 来查看执行每一行时位置如何变化。

如果您(重新)打开一个新文件,您将再次从位置 0 开始。如果您已通读一次并想再次使用相同的句柄,则需要返回到文件的开头:f.seek(0)

注意:您确实不需要使用 with 在托管上下文中执行 f.close()。一旦您离开它,它就会为您关闭文件句柄。

关于python - 解释每个 open() 语句一次读取操作的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59822813/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com