我想知道如何在python中逐行编辑文件。
例如,我有一个文本文件,我通常有:
key value
key value
key value
key value
key value
...
每行不一定是同一对。这就是我解释它的方式。
我想逐行显示键和值(在我的终端上),然后我想做这两件事之一:
- 按下输入(或任何热键)继续阅读(显示)下一行。
- 输入一个新值然后按Enter键。这实际上会替换文件中的值(显示),最后显示下一对键值。
直到文件结尾或者直到我输入'退出'或其他一些关键字。无所谓。
- 能够回到上一行会是一个加号(如果意外进入下一行),但它现在不太重要。
我发现自己经常以一种非常繁琐和重复的方式编辑大文件,文本编辑在按箭头键的时候到处都是游标。还必须使用退格键来删除是很烦人的。
我知道如何读取文件以及如何在python中编写文件。但不是以这种互动的方式。我只知道如何一次写入整个文件。另外,我不知道在阅读和写作中打开同一个文件是否安全。此外,我知道如何操纵每一行,将文本分成值列表等...我真正需要的是了解如何修改当前行的文件并处理好这种类型的交互。
这样做的最佳方式是什么?
答案 0 :(得分:1)
我要这样做的方法是在列表中加载文本文件的所有行,然后遍历该列表,随着时间的推移更改列表的值。然后在最后(当你到达最后一行或任何你想要的时候),你会将整个列表写到具有相同名称的文件中,这样它就会覆盖旧文件。
答案 1 :(得分:1)
所有答案都集中在将文件内容加载到内存中,修改然后关闭保存所有磁盘,所以我想我试一试:
import os
sep = " "
with open("inline-t.txt", "rb+") as fd:
seekpos = fd.tell()
line = fd.readline()
while line:
print line
next = raw_input(">>> ")
if next == ":q":
break
if next:
values = line.split(sep)
newval = values[0] + sep + next + '\n'
if len(newval) == len(line):
fd.seek(seekpos)
fd.write(newval)
fd.flush()
os.fsync(fd)
else:
remaining = fd.read()
fd.seek(seekpos)
fd.write(newval + remaining)
fd.flush()
os.fsync(fd)
fd.seek(seekpos)
line = fd.readline()
seekpos = fd.tell()
line = fd.readline()
该脚本只是打开文件,逐行读取,并在用户输入新值时重写该文件。如果数据的长度与先前的数据匹配,则搜索和写入就足够了。如果新数据的大小不同,我们需要在我们之后进行清理。因此,读取文件的其余部分,将其附加到新数据,并将所有内容重写到磁盘。 fd.flush和os.fsync(fd)保证在写出文件后确实可以在文件中进行更改。性能方面不是最好的解决方案,但我相信这更接近他的要求。
另外,请考虑此代码中可能存在一些怪癖,并且我确信还有优化的空间 - 如果需要经常进行更改,可能会在开始时进行一次全局读取以避免多个整个文件读取,或者类似的东西。