Py学习  »  Python

使用Python从文本文件中删除特定数量的行

shongyang low • 5 年前 • 1767 次点击  

AAAAAAAAAAAAAAAAAAAAA              #<--- line 1
BBBBBBBBBBBBBBBBBBBBB              #<--- line 2
CCCCCCCCCCCCCCCCCCCCC              #<--- line 3
DDDDDDDDDDDDDDDDDDDDD              #<--- line 4
EEEEEEEEEEEEEEEEEEEEE              #<--- line 5
FFFFFFFFFFFFFFFFFFFFF              #<--- line 6
GGGGGGGGGGGGGGGGGGGGG              #<--- line 7
HHHHHHHHHHHHHHHHHHHHH              #<--- line 8


忽略“#<---行…”,这只是演示


假设

  • 一直如此。。。
  • 在前两行之后,我想保留三行。。。


最终结果
最终结果应该是这样的:

CCCCCCCCCCCCCCCCCCCCC              #<--- line 3
DDDDDDDDDDDDDDDDDDDDD              #<--- line 4
EEEEEEEEEEEEEEEEEEEEE              #<--- line 5


删除行:前2行+后3行(即第5行之后)的所有内容

要求的




标准物质
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提供

以下代码将:

  • 删除前63个
  • 忽略其余部分


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)
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/56379
 
1767 次点击  
文章 [ 2 ]  |  最新文章 5 年前
chepner
Reply   •   1 楼
chepner    5 年前

这是一个真正的文本编辑器更好地处理的事情。

import subprocess

subprocess.run(['ed', original_file], input=b'1,2d\n+3,$d\nwq\n')

ed ,POSIX标准文本编辑器。

打开由其参数命名的文件。然后从标准输入读取命令。每个命令都是一个字符,有些命令使用一个或两个“地址”来指示要操作的行。

在每个命令之后,“当前”行号被设置为最后受命令影响的行。这和相对地址一起使用,稍后我们将看到。

  • 1,2d 表示删除第1行到第2行;当前行设置为2
  • +3,$d 删除从第5行(当前行是2,所以2+3==5)到文件结尾的所有行( $ 是表示文件最后一行的特殊地址)
  • wq 将所有更改写入磁盘并退出编辑器。
sandes
Reply   •   2 楼
sandes    5 年前

根据基尼的评论

with open("your_file.txt", "r") as f:
    lines = f.readlines()
    new_lines = []
    idx_lines_wanted = [2,3,4]
    for i, line in enumerate(lines):
        if i > 4:
            break
        if i in idx_lines_wanted:
             new_lines.append(line)

with open("your_file.txt", "w") as f:
    for line in new_lines:
        f.write(line)

关于这个: 如果文件顶部有1-100行要删除

idx_lines_wanted = [x for x in range(0,101)]

if i > len(idx_lines_wanted) -1: