写入文件,以便保留最后N行

时间:2017-05-10 22:56:47

标签: python

我试图保留一个只有10个条目的文件。

每次我写一个新的,最旧的条目被最新的条目取代;所以总行数总是10。

文件示例:

abcde-12345
akmjk-13249
ofdsi-01230
faaoj-10293
famdk-05931
foajq-10592
xmdsj-19234
boxqa-12130
fdlsp-95392
paidf-19341

当我在这个文件中添加一个带有append命令的新行时,它会增加文件的总行数,所以每次添加一行时文件都会增长。目标是在底部附加行,删除文件的第一行,以便删除最旧的条目,并在底部添加新的条目,留下文件中的总行数,始终等于10。

我的方法是

-read the file
-save the last 9 lines in a new file
-add the 10th line, which is the new one
-delete the old file, and save the new file with the same name.

这具有繁琐,缓慢,无效的问题。在Shell脚本中,我可以轻松地完成它,但由于我使用python,我希望有一个更简单的方法来做到这一点

2 个答案:

答案 0 :(得分:2)

使用deque作为缓冲区,使用maxlen=10,附加到双端队列,然后从双端队列中写入:

Juans-MBP:workspace juan$ cat 10lines.txt
first line
second line
third line
fourth line
fith line
sixth line
seventh line
eigth line
ninth line
tenth line
Juans-MBP:workspace juan$ python
Python 3.5.2 |Anaconda custom (x86_64)| (default, Jul  2 2016, 17:52:12)
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from collections import deque
>>> with open('10lines.txt') as f:
...     buffer = deque(f, maxlen=10)
...
>>> buffer.append('first new line\n')
>>> buffer.append('second new line\n')
>>> with open('10lines.txt', 'w') as f:
...     f.writelines(buffer)
...
>>> exit()
Juans-MBP:workspace juan$ cat 10lines.txt
third line
fourth line
fith line
sixth line
seventh line
eigth line
ninth line
tenth line
first new line
second new line
Juans-MBP:workspace juan$

注意,您必须注意确保附加的行有newlines,因为尽管名称可能暗示它,f.writelines不会添加换行符。

答案 1 :(得分:0)

借用此答案How to delete the first line of a text file using Python?来读取和删除第一行,然后附加新行并将其写回文件。这是一个可能的Python2解决方案。

if (this.ignoreSelectedEvent) {
    this.ignoreSelectedEvent = false;

    return;
}

// Update the model with the string ID

this.onChange(val.id);