解析文件,在末尾附加每一行并从顶部删除该行

时间:2016-11-14 23:09:59

标签: python

我正在尝试将每行向下移动到文件的底部;这就是文件的样子:

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

3 个答案:

答案 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