2017-10-17 1076 views
1

我想在找到特定行後取出某些行。下面是這樣的例子:找到特定行後Python讀取行

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 

我都試過,如果喜歡的語句:

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

+0

順便提及,可以使用[splitlines](https://docs.python.org/3.6/library/stdtypes.html#str.splitlines)方法來讀取行:'線=開('File.txt')。read()。splitlines()'(然後使用[COLDSPEED](https://stackoverflow.com/users/4909087/c%e1%b4%8f%ca%9f%e1% b4%85%e1%b4%98%e1%b4%87%e1%b4%87%e1%b4%85)的答案)。 –

回答

1

你必須認識到你想捕捉模式(ABC01和之後),並在找到其他模式時停止捕捉。你可以用標誌來做到這一點。當我們找到模式時,我們打開標誌,並指示應該捕捉下一行。我們把標誌當ABC02型樣:

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) 
+0

,工作出色,謝謝 –

2

我只是保持一個標誌,讓我跟蹤的東西忽略,並採取什麼。

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()) 
-1

我會用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)) 

免責聲明:代碼沒有測試,但我想你明白了!

查理