
大模型RAG技术:从入门到实践
Python 文件删除最后一行的高效方法
在处理大型文本文件时,如何高效地删除文件的最后一行或最后几行是一个常见的问题。本文将详细介绍一些高效的方法和策略,帮助您在 Python 中实现这一功能。
处理大型文件时,直接在内存中逐行读取再写回的方法效率很低,尤其是在文件规模达到数百 MB 或者 GB 级别时。这种方法容易导致内存资源的浪费,甚至在资源受限的环境中导致程序崩溃。因此,我们需要寻求更高效的方法来解决这个问题。
Python 的 os 库提供了一些文件操作的低级接口,可以帮助我们更高效地完成文件末尾行的删除。
import os
file_path = 'D:/EEG/LXP/FRAG1/FZ_H_ch5.txt'
file_old = open(file_path, 'rb+')
m = 15 # 估计最后一行的字符数
file_old.seek(-m, os.SEEK_END)
lines = file_old.readlines()
file_old.seek(-len(lines[-1]), os.SEEK_END)
file_old.truncate()
file_old.close()
在这里我们建议使用以下链接展示文件操作的示意图:文件操作示意图
有时,我们可能需要删除文件末尾的几个字符而不是整行。在这种情况下,可以通过定位倒数第 N 个字符来实现截断。
import os
file_old = open('D:/EEG/LXP/FRAG1/FZ_H_ch5.txt', 'rb+')
n = 6 # 需要删除的字符数
file_old.seek(-n, os.SEEK_END)
file_old.truncate()
file_old.close()
对于超过 1GB 的大型文件,推荐使用文件映射技术。这种方式可以避免将整个文件加载到内存中。
import mmap
file_path = 'D:/EEG/LXP/FRAG1/FZ_H_ch5.txt'
with open(file_path, 'r+') as f:
# 创建 mmap 对象
mm = mmap.mmap(f.fileno(), 0)
# 定位到文件尾部
mm.seek(0, os.SEEK_END)
end_pos = mm.tell() - 1
# 向前搜索,找到换行符
while mm[end_pos] != b'n':
end_pos -= 1
# 截断文件
f.truncate(end_pos + 1)
# 关闭 mmap 对象
mm.close()
项目中经常会遇到需要同时删除文件的前几行和最后一行的情况。以下是一个通用的解决方案。
import os
def delete_lines(filename, head, tail):
fin = open(filename, 'r')
lines = fin.readlines()
fin.close()
with open(filename, 'w') as fout:
fout.write(''.join(lines[head:-tail]))
file = r'D:/code2022/test.txt'
delete_lines(file, 6, 1)
问:使用 os 和 mmap 模块的区别是什么?
问:如何估算 m 值?
问:文件映射的缺点是什么?
问:删除操作是否可逆?
问:如何处理文件权限问题?
通过本文的介绍,相信您已经掌握了如何在 Python 中高效地删除文件的最后一行或几行的方法。希望这些方法能够提高您在处理大型文件时的效率和准确性。