簡體   English   中英

Python在找到特定行后讀取行

[英]Python read lines after finding specific lines

找到某行后,我試圖取出某些行。 下面是示例:

 1. ABC01
 2. AB_Name
 3. AC_Name
 4. ID_Name
 5. ABC02
 6. AB_Name
 7. ABB_Name
 8. AC_Name
 9. AQ_Name
 10. ID_Name
 11. ABC01
 12. AP_Name
 13. AZ_Name
 14. AB_Name
 15. ID_Name

我要刪除的是ABC01之后的單行,而忽略ABC02及其之后的行。 所以我正在尋找的輸出是:

 1. ABC01
 2. AB_Name
 3. AC_Name
 4. ID_Name

 11. ABC01
 12. AP_Name
 13. AZ_Name
 14. AB_Name
 15. ID_Name

我已經嘗試過if語句,例如:

lines = [line.rstrip('\n') for line in open('File.txt')]

listings = []

for line in lines:

    if line.startswith("ABC01"):
        continue
    if line.startswith("ID"):
        break

    listings.append(line.strip())

我正在使用Python 2.7

我只是保留一個標志,讓我可以跟蹤要忽略的內容和要采取的內容。

ignore = False

for line in lines:
    if line.startswith("ABC01"):
        ignore = False
    elif line.startswith("ABC02"):
        ignore = True

    if not ignore:
        listings.append(line.strip())

您需要識別要捕獲的模式(ABC01及更高版本),並在找到其他模式時停止捕獲。 您可以使用標志來實現 找到模式后,我們將打開標記,並指示應捕獲下一行。 找到ABC02模式后,我們將標志設置為False

lines = ['ABC01', 'AB_Name', 'AC_Name', 'ID_Name',
          'ABC02', 'AB_Name', 'ABB_Name', 'AC_Name',
          'AQ_Name', 'ID_Name', 'ABC01', 'AP_Name',
          'AZ_Name', 'AB_Name', 'ID_Name']

get_lines = False
output = []

for line in lines:
    if line.startswith('ABC01'):
        get_lines = True

    elif line.startswith('ABC02'):
        get_lines = False
        continue

    if get_lines:
        output.append(line)

我會使用Pyhton ReactiveX擴展來解決此問題: https : //github.com/ReactiveX/RxPY

您可以使用RX運算符在一行中巧妙地解決它,例如:

Observable.from_(lines).skip_while(lambda line: "ABC01" in line ).filter(lambda line: not "ABC02" in line).subscribe(lambda line: print(line))

免責聲明:代碼未經測試,但我認為您明白了!

查理

暫無
暫無

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

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