社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

shongyang low • 5 年前 • 1829 次点击  

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
 
1829 次点击  
文章 [ 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: