簡體   English   中英

使用 Python 從文本文件中刪除特定數量的行

[英]Deleting a specific number of lines from text file using Python

假設我有一個像這樣的文本文件:

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...”,只是為了演示


假設

  • 我不知道第 3 行將包含什么(因為它一直在變化)...
  • 必須刪除前兩行...
  • 在前 2 行之后,我想保留 3 行...
  • 然后,我想刪除第 3 行之后的所有行。


最終結果
最終結果應如下所示:

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 提供

以下代碼將:

  • 刪除前 63 個
  • 讓你下一個 95
  • 忽略其余部分
  • 創建一個新文件


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)

編輯:直接迭代 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)

這確實是由實際的文本編輯器更好地處理的事情。

import subprocess

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

ed的速成課程,POSIX 標准文本編輯器。

ed打開以其參數命名的文件。 然后它繼續從其標准輸入讀取命令。 每個命令都是一個字符,有些命令使用一兩個“地址”來指示要操作的行。

在每個命令之后,“當前”行號被設置為最后受命令影響的行。 這與相對地址一起使用,我們稍后會看到。

  • 1,2d表示刪除第 1 行到第 2 行; 當前行設置為 2
  • +3,$d刪除從第 5 行(當前行為 2,所以 2 + 3 == 5)到文件末尾的所有行( $是一個特殊地址,表示文件的最后一行)
  • wq將所有更改寫入磁盤並退出編輯器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM