Python在找到特定行后读取行

时间:2017-10-17 08:04:27

标签: 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

3 个答案:

答案 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 :(得分:1)

您需要识别要捕获的模式(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)

答案 2 :(得分:-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))

免责声明:代码未经过测试,但我认为您有了这个想法!

查理