看了一下现有的删除文本部分内容的代码,发现效率都很低,大多是复制原先的代码然后重新幅值,尤其对大型文件使用这种方法会消耗大量时间。下面介绍一下如何更高效的删除
删除最后一行/最后N行数据
定位最后一行/最后N行的行首位置,然后截断之后的数据
import os
# 在文本文件中,若没有使用b模式选项打开的文件,只允许从文件头开始计算相对位置,从文件尾计算时就会引发异常
file_old = open('D:/EEG/LXP/FRAG1/FZ_H_ch5.txt', 'rb+')
m = 15
# 1.定位文件末尾的前m个字符的位置,大小可根据每一行的字符数量修改,为一估计值,但不能超过文件总字符数
# 若要删除最后一行,要确保m比最后一行的字符数大
# 若要删除后N行,要确保后N行的总字符数比m小
# 若文件很小或无法大体估计每一行的字符数,可以删除这行代码
file_old.seek(-m, os.SEEK_END)
# 2.从步骤1定位的位置开始读取接下来的每一行数据,若步骤1的代码删除,则会从文件头部开始读取所有行
lines = file_old.readlines()
# 3.定位到最后一行的行首,若要删除后N行,将lines[-1]改为lines[-N:]即可
file_old.seek(-len(lines[-1]), os.SEEK_END)
file_old.truncate() # 截断之后的数据
file_old.close()
删除后N个字符
直接定位倒数第N个字符,然后截断即可
import os
file_old = open('D:/EEG/LXP/FRAG1/FZ_H_ch5.txt', 'rb+')
n = 6
# 定位倒数第n个字符
file_old.seek(-n, os.SEEK_END)
# 截断之后的数据
file_old.truncate()
file_old.close()
是不是即简单有高效,其实OS库大多数编程语言都有,C++、JAVA等改一下格式也可实现该功能,要是超过1G的大型文件,建议使用文件映射读取文件,这段代码也适用