我有两个版本的类似代码,一个有效,另一个没有:
版本1
#some code
with open('file', 'w') as f:
f.writelines(new_lines)
with open('file') as f:
i = 0
for line in f:
i = i + 1
if i != 5 and i != 18 and i != 27:
row.append(line)
第2版
# some code
with open('file', 'w') as f:
f.writelines(new_lines)
i = 0
for line in f:
i = i + 1
if i != 5 and i != 18 and i != 27:
row.append(line)
执行版本2代码时,出现错误,表示文件未打开。我很困惑,因为显然代码仍在with
语句中。文件是否在f.writelines()方法之后自动关闭?
答案 0 :(得分:2)
您遇到的问题与您用于打开文件的模式有关。在第一个示例中,首先打开它以使用"w"
模式进行写入。然后关闭它并使用默认的"r"
模式重新打开它。这有所不同!
首先,您不能从使用常规"w"
模式打开的文件中读取。您可以使用"w+"
来允许读取和写入,如果您不希望它在打开后立即截断文件,则使用"r+"
。
另一个问题是您在文件中的位置。当您将数据写入文件时,您将最终在文件数据的末尾,因此只需从那里读取数据就不会得到任何结果。您需要致电f.seek(0)
返回文件的开头,以便再次阅读。
但是,编写文件然后回读刚才写的行是有点傻(除非涉及其他复杂的逻辑)。我建议您将for line in f
循环改为for line in new_lines
,这样可以避免不必要地读取文件。
答案 1 :(得分:1)
当你处于写入模式时,你正在迭代文件。将其更改为with open('file', 'r+') as f:
在f.writelines(new_lines)
之后,您还需要返回文件的开头以遍历每一行。将f.seek(0)
放在循环之前