我正在尝试将每行向下移动到文件的底部;这就是文件的样子:
daodaos 12391039
idiejda 94093420
jfijdsf 10903213
....
#completed
因此,在解析结束时,我计划在#completed完成的实际字符串下获取顶部的所有条目。
问题在于我不知道如何在一次通过中做到这一点;我知道我可以读取整个文件,每一行,关闭文件,然后以写入模式重新打开文件;搜索该行,将其从文件中删除并将其添加到结尾;但感觉非常低效。
一次通过是否有办法处理当前行;然后在相同的for循环中,删除该行并将其附加到文件的末尾?
file = open('myfile.txt', 'a')
for items in file:
#process items line
#append items line to the end of the file
#remove items line from the file
答案 0 :(得分:0)
不是。
这里的主要问题是您在要更改文件的同时迭代文件。除非您打算对文件位置指针进行微观管理,否则这将对您的处理做坏事(tm)。
您确实拥有这种力量:搜索方法可让您移动到以字节为单位的给定文件位置。 seek(0)移动到文件的开头;寻求(-1)到最后。您遇到的问题是 for 循环信任此指针指示要读取的下一行。
一个明显的问题是你不能只从文件中间删除一行;这些字节中存在某些。可以把它想象成一个页面上的文字行,用铅笔写成。你可以删除第4行,但这不会导致5行末端神奇地浮起半厘米;他们仍然在同一个地方。
如何做......某种
将所有行读入列表。您可以按照自己的方式轻松更改列表。当你到达终点时,然后将列表写回文件 - 或者使用你的魔法搜索和追加权限来改变它的一小部分。
答案 1 :(得分:0)
我建议你这样做的方法很简单:读取所有文件并将其存储在变量中,将完成的文件移动到另一个变量,然后重写文件。
答案 2 :(得分:0)
建议保持简单的读写回复
with open('myfile.txt') as f:
lines = f.readlines()
with open('myfile.txt', 'w') as f:
newlines = []
for line in lines:
# do you stuff, check if completed, rearrange the list
if line.startswith('#completed'):
idx=i
newlines = lines[idx:] + lines[:idx]
break
f.write(''.join(newlines)) # write back new lines
下面是我想到的另一个版本,如果坚持想在阅读时修改
with open('myfile.txt', 'r+') as f:
newlines = ''
line = True
while line:
line = f.readline()
if line.startswith('#completed'):
# line += f.read() # uncomment this line if you interest on line after #completed
f.truncate()
f.seek(0)
f.write(line + newlines)
break
else:
newlines += line