Python 3.x 如何在python3中从textfile提取特定部分

Python 3.x 如何在python3中从textfile提取特定部分,python-3.x,Python 3.x,这是我的python文件 path = '/my/file/list.txt' with open(path,'rt') as file: print("step 1") collected_lines = [] started = False for line in file: for n in range(1, 10): if line.startswith('PLAY NO.{}'.format(n)):

这是我的python文件

path = '/my/file/list.txt'
with open(path,'rt') as file:
    print("step 1")
    collected_lines = []
    started = False
    for line in file:   
        for n in range(1, 10):
            if line.startswith('PLAY NO.{}'.format(n)):
                started = True
                print("started at line {}".format(line[0]))
                continue
            if started:
                collected_lines.append(line)        
            if started and line == 'PLAY NO.{}'.format(n+1):
                print("end at line {}".format(line[0]))
                break           
            print(collected_lines.append(line))
这是我的密码。。 输出:

现在我要从第二局开始到第三局。。。。但是我一个也没有得到。。请提供任何建议。。。我正在使用Python 3.5

对不起,这是第一次在这个网站上提问。。 我的文件看起来像这样

textfile.txt

Hello and Welcome This is the list of plays being performed here
              PLAY NO. 1
 1. adknjkd
 2. skdi
 3. ljdij

              PLAY NO. 2
 1. hsnfhkjdnckj
 2. sjndkjhnd  and so on
给出:

step 1
### started at line 2
### end     at line 7
collected_lines: 

               PLAY NO. 1
  1. adknjkd
  2. skdi
  3. ljdij
关于固定问题的说明:

  • 使用
    .lstrip()
    以使
    .startswith()
    按预期工作
  • startswith('PLAY NO.{}.)中的
    NO.
    {}
    之间添加了一个空格。格式(n)
    ,以便if条件可以找到该行
  • 重新排列
    if
    s的顺序,以避免认为结束行位于起始行
  • 向循环中添加了
    start=False
    ,以停止收集行
  • 前导空格的问题已经足以阻止代码找到行。由于
    格式
    字符串中缺少空格,仅修复此问题无法解决问题,因此必须修复这两个问题才能使代码按预期工作。等等…请参见上面的注释

    给出:

    step 1
    ### started at line 2
    ### end     at line 7
    collected_lines: 
    
                   PLAY NO. 1
      1. adknjkd
      2. skdi
      3. ljdij
    
    关于固定问题的说明:

  • 使用
    .lstrip()
    以使
    .startswith()
    按预期工作
  • startswith('PLAY NO.{}.)中的
    NO.
    {}
    之间添加了一个空格。格式(n)
    ,以便if条件可以找到该行
  • 重新排列
    if
    s的顺序,以避免认为结束行位于起始行
  • 向循环中添加了
    start=False
    ,以停止收集行

  • 前导空格的问题已经足以阻止代码找到行。由于
    格式
    字符串中缺少空格,仅修复此问题无法解决问题,因此必须修复这两个问题才能使代码按预期工作。以此类推……请参阅上面的注释。

    如果您想要一个标签为e播放编号和项目列表中包含有关播放的行,您可以使用
    defaultdict

    定义文本 定义正则表达式 解析行 屈服

    defaultdict(list,
                {1: [(2, '1. adknjkd'), (3, '2. skdi'), (4, '3. ljdij')],
                 2: [(7, '1. hsnfhkjdnckj'), (8, '2. sjndkjhnd  and so on')]})
    
    stout
    上的输出:

    0 Hello and Welcome This is the list of plays being performed here
    
    PLAY NO. 1 started at line number 1
    1               PLAY NO. 1
    
    2  1. adknjkd
    
    3  2. skdi
    
    4  3. ljdij
    
    5 
    
    PLAY NO. 1 ended at line number 5
    PLAY NO. 2 started at line number 6
    6               PLAY NO. 2
    
    7  1. hsnfhkjdnckj
    
    8  2. sjndkjhnd  and so on
    

    如果您想要一个带有播放编号标签和播放相关行列表的dict,您可以使用
    defaultdict

    定义文本 定义正则表达式 解析行 屈服

    defaultdict(list,
                {1: [(2, '1. adknjkd'), (3, '2. skdi'), (4, '3. ljdij')],
                 2: [(7, '1. hsnfhkjdnckj'), (8, '2. sjndkjhnd  and so on')]})
    
    stout
    上的输出:

    0 Hello and Welcome This is the list of plays being performed here
    
    PLAY NO. 1 started at line number 1
    1               PLAY NO. 1
    
    2  1. adknjkd
    
    3  2. skdi
    
    4  3. ljdij
    
    5 
    
    PLAY NO. 1 ended at line number 5
    PLAY NO. 2 started at line number 6
    6               PLAY NO. 2
    
    7  1. hsnfhkjdnckj
    
    8  2. sjndkjhnd  and so on
    


    什么行?您没有显示任何行。我们需要一个文件示例,我建议您筛选您要筛选的行。查看一下,这可能会提示您如何以方便的方式执行此操作。此外,我建议使用正则表达式筛选该行,如
    None!=re.match(“^no[0-9][^0-9]”,line)
    您编写:
    “现在我想要从第二盘开始到第三盘开始的台词….”
    ,但在文件中没有第三盘……这不是我的观点,但对我来说是有意义的:。说“谢谢”的更好方式是接受答案并投票(你的投票还不算,但如果你有15次以上的投票,请稍后再投票)。您可以通过单击
    “v”来接受答案"
    使其变为绿色。stackoverflow上的一个好习惯是,如果它解决了您的问题,不要忘记接受答案。什么行?您没有显示任何行。我们需要一个文件示例,我建议您过滤您想要的行。看看这可能会给您一个提示,告诉您如何以方便的方式进行此操作。此外,我会记录我想用正则表达式过滤那些行,比如
    None!=re.match(“^No[0-9][^0-9]”,line)
    你写:
    “现在我想让从第二局开始的行变成第三局…”
    ,但是在文件中没有第三局…这不是我的观点,但对我来说是有意义的:。说“谢谢”的更好方式是接受答案并投票(你的向上投票还不算在内,但如果你有15次以上的重复,以后再算)。你可以点击
    “v”接受答案
    使其变为绿色。stackoverflow上的一个好习惯是,如果答案解决了您的问题,不要忘记接受答案。您可以将“for line in file:lineNo+=1”替换为
    for lineNo,line in enumerate(file):
    这是如何区分第1场和第2场的?@MaartenFabré
    这是如何区分第1场和第2场的?
    它没有区别,但是…打印
    无一个
    已经消失,代码尽可能类似于OPs代码。如果你想要第2场,你可以将范围(1,10)内的n的
    更改为范围(2,3)内的n的
    。我担心您的答案中的代码与OPs的距离太远,使OP很难理解它是如何工作的以及为什么工作的(我将对代码的更改限制在最低限度以使其工作的原因)。您可以将“for line in file:lineNo+=1”替换为
    for lineNo,line in enumerate(文件):
    这是如何区分第1场和第2场的?@MaartenFabré
    这是如何区分第1场和第2场的?
    它没有区别,但是…打印
    ,代码尽可能类似于OPs代码。如果你想要第2场,你可以将范围(1,10)内的n的
    更改为范围(2,3)内的n的
    。我担心您答案中的代码与OPs的距离太远,使OP很难理解它是如何工作的以及为什么工作的(我将对代码的更改限制在最低限度以使其工作的原因)。在python中,Try/except是可以接受的,不应该不惜任何代价避免。正确使用它可以给出一些非常优雅的代码。此正则表达式非常简单,可能是新来者对它们的一个很好的介绍。在这种情况下,当您想获得播放编号时,
    regulr表达式
    更容易、正确或可读小于
    defaultdict(list,
                {1: [(2, '1. adknjkd'), (3, '2. skdi'), (4, '3. ljdij')],
                 2: [(7, '1. hsnfhkjdnckj'), (8, '2. sjndkjhnd  and so on')]})
    
    0 Hello and Welcome This is the list of plays being performed here
    
    PLAY NO. 1 started at line number 1
    1               PLAY NO. 1
    
    2  1. adknjkd
    
    3  2. skdi
    
    4  3. ljdij
    
    5 
    
    PLAY NO. 1 ended at line number 5
    PLAY NO. 2 started at line number 6
    6               PLAY NO. 2
    
    7  1. hsnfhkjdnckj
    
    8  2. sjndkjhnd  and so on