我的程序正在为用户保留日志。 如果日志大于设定的数量,我想删除前 20% 的行。
从类似的问题中,我看到了在旧文件中读取的建议,并将我想保留的所有行写到新文件中。 但是,我的文件可能太大而无法持续读取它们,并且使用该方法不会让我保留相同的文件名。
我可以在不读取旧文件的情况下从文件中删除行吗?
为日志文件实现此目的的一般方法是"旋转" - 当日志文件变旧或达到一定大小时,您可以重命名它并开始编写一个新日志文件。如果您使用的是日志记录模块,甚至还有一个预配置的 - 旋转文件处理程序,它可以自动执行此操作。
至于你的问题:你只能从后面截断,不能从头开始截断。一个近似的解决方案是 seek() 到文件的 20%,找到第一个 '' 并将其复制出来 - 但它会很慢并且容易出现竞争条件。使用日志记录和旋转文件处理程序。
正如其他人所说,解决此问题的传统方法是保留 5 个不同的文件而不是 1 个大文件。当您需要删除 20% 时,只需删除最旧的文件并重命名其他文件即可。
与文本文件一样方便,您也可以考虑使用数据库。它旨在能够随时删除数据的任何部分。
if size > MAX_SIZE:
f = open(your_file, 'r')
lines = f.readlines()
f.close()
f = open(your_file, 'w')
f.write('n'.join(lines[len(lines)/5:]))
f.close()
那也许可以做到。虽然,正如前两个所说,如果可以的话,最好使用多个文件甚至数据库。未测试此代码。