假设我有一个像这样的文本文件:
AAAAAAAAAAAAAAAAAAAAA #<--- line 1
BBBBBBBBBBBBBBBBBBBBB #<--- line 2
CCCCCCCCCCCCCCCCCCCCC #<--- line 3
DDDDDDDDDDDDDDDDDDDDD #<--- line 4
EEEEEEEEEEEEEEEEEEEEE #<--- line 5
FFFFFFFFFFFFFFFFFFFFF #<--- line 6
GGGGGGGGGGGGGGGGGGGGG #<--- line 7
HHHHHHHHHHHHHHHHHHHHH #<--- line 8
忽略“#<--- line ...”,仅用于演示
假设
最终结果
最终结果应如下所示:
CCCCCCCCCCCCCCCCCCCCC #<--- line 3
DDDDDDDDDDDDDDDDDDDDD #<--- line 4
EEEEEEEEEEEEEEEEEEEEE #<--- line 5
删除的行:前2个+后3个后的所有内容(即第5行之后)
必需
欢迎所有Pythonic建议!谢谢!
参考资料
https://thispointer.com/python-how-to-delete-specific-lines-in-a-file-in-a-memory-efficient-way/
def delete_multiple_lines(original_file, line_numbers):
"""In a file, delete the lines at line number in given list"""
is_skipped = False
counter = 0
# Create name of dummy / temporary file
dummy_file = original_file + '.bak'
# Open original file in read only mode and dummy file in write mode
with open(original_file, 'r') as read_obj, open(dummy_file, 'w') as write_obj:
# Line by line copy data from original file to dummy file
for line in read_obj:
# If current line number exist in list then skip copying that line
if counter not in line_numbers:
write_obj.write(line)
else:
is_skipped = True
counter += 1
# If any line is skipped then rename dummy file as original file
if is_skipped:
os.remove(original_file)
os.rename(dummy_file, original_file)
else:
os.remove(dummy_file)
然后...
delete_multiple_lines('sample.txt', [0,1,2])
此方法的问题可能是,如果文件顶部有1-100行要删除,则必须指定[0,1,2 ... 100]。对吧?
答案
由@sandes提供
以下代码将:
with open("sample.txt", "r") as f:
lines = f.readlines()
new_lines = []
idx_lines_wanted = [x for x in range(63,((63*2)+95))]
# delete first 63, then get the next 95
for i, line in enumerate(lines):
if i > len(idx_lines_wanted) -1:
break
if i in idx_lines_wanted:
new_lines.append(line)
with open("sample2.txt", "w") as f:
for line in new_lines:
f.write(line)
答案 0 :(得分:2)
编辑:直接在f上迭代
基于@Kenny的评论和@chepner的建议
with open("your_file.txt", "r") as f:
new_lines = []
for idx, line in enumerate(f):
if idx in [x for x in range(2,5)]: #[2,3,4]
new_lines.append(line)
with open("your_new_file.txt", "w") as f:
for line in new_lines:
f.write(line)
答案 1 :(得分:1)
实际上,这可以由实际的文本编辑器更好地处理。
import subprocess
subprocess.run(['ed', original_file], input=b'1,2d\n+3,$d\nwq\n')
POSIX标准文本编辑器ed
中的速成课程。
ed
打开以其参数命名的文件。然后,它继续从其标准输入读取命令。每个命令都是单个字符,有些命令带有一个或两个“地址”以指示要在哪些行上进行操作。
在每个命令之后,“当前”行号被设置为最后一个受命令影响的行。稍后我们将看到它与相对地址一起使用。
1,2d
表示删除第1至2行;当前行设置为2 +3,$d
删除第5行(当前行是2,所以2 + 3 == 5)到文件末尾的所有行($
是一个特殊地址,指示文件的最后一行)文件)wq
将所有更改写入磁盘并退出编辑器。