假设我有一个文件demo.txt
。该文件包含三行,分别是:
- line 1
- line 2
- line 3
我想在迭代demo.txt时编辑此文件行。例如,程序开始迭代,现在我们在第1行。
现在我们将这一行修改为第1.1行,并按输入继续迭代到第2行。当我按回车键时,1.1行被保存到demo.txt
文件中。
然后对第2行做同样的事情,我将第2行更改为第2.2行并按enter。对于第3行也是如此:更改到第3.3行,按输入保存并完成。这应该适用于每一行。有办法做到这一点吗?
就像其他人在注释中解释的那样,您不应该在读取文件的同时更改其内容。您将得到糟糕的性能或不一致的结果(或两者兼而有之)。您应该缓冲输入以供读取,或者缓冲输出以供写入。
下面是缓冲输入文件的解决方案:
from pathlib import Path
def main():
path = Path("demo.txt")
lines = path.read_text().splitlines()
with path.open("w") as f:
for line in lines:
new_line = transform(line)
f.write(f"{line}n")
if __name__ == "__main__":
main()
这里,transform
是将一行转换为新行的函数。输入文件demo.txt
被覆盖
另一种方式,即缓冲写,将是:
from pathlib import Path
def main():
path = Path("demo.txt")
new_lines = []
with path.open() as f:
for line in f:
new_line = transform(line)
lines.append(f"{new_line}")
path.write_text("n".join(new_lines))
if __name__ == "__main__":
main()
或者,您可以根据另一个答案中的建议创建一个具有不同名称的新文件。
正如我在注释中提到的,一旦处理了当前正在访问/迭代的行,我们不应该将其保存在同一个文件中。只需将这两个文件一次打开一个,并进行相应的修改。
import os
with open('demo.txt') as file, open ('new.txt', 'w+') as file2:
for line in file:
s = input()
if len(s) ==0:
line = "modifiedn"
file2.write(line)
print(line)
file.close()
file2.close()
os.replace('new.txt', 'demo.txt')
你的新demo.txt
文件看起来像这样
modified
modified
modified
这里发生了什么:
- 同时打开你的文件和一个临时的虚拟文件
- 等待用户按回车键。一旦他按下enter键,python读取line1并保存到新行。
- 当所有的行都完成后,关闭这两个文件。
- 用旧的原始文件名重命名临时文件,即demo.txt