繁体   English   中英

Python:在某些行之间提取行

[英]Python: Extract lines between certain lines

Windows 7 64位上的Python 3.6.7 64位

mydata.txt (实际文件非常大,因此不能选择readlines())

之后的名称是容器名称,并且包含以“-”开头的对象

#abc contains:
date 20-Oct
- mmm
- nnn
- ooo
#def contains:
date 23-Oct
- ppp
#ghi contains:
date 24-Oct
- sss
- ttt
#jkl contains:
date 26-Oct
- uuu
- vvv
- www

目标是仅打印以下几行(即容器的内容)

mmm, nnn, ooo @abc
ppp @def
sss, ttt @ghi
uuu, vvv, www @jkl

我的密码

import re

with open('mydata.txt', 'r') as infile:
    container = ''
    allcontents = ''
    for line in infile:
        line = line.strip()
        if line.endswith('contains:'):
            print(allcontents[:-2] + container)
            container = re.search('#(.+)\scontains', line).group(1)
            container = '@' + container
            allcontents = '' #reset allcontents

        if line.startswith('- '):
            content = re.search('-\s(.+)$', line).group(1)
            allcontents = allcontents + content + ', '

这产生输出

mmm, nnn, ooo@abc
ppp@def
sss, ttt@ghi

如您所见,最后一个容器“ jkl”没有被打印。 它的输出在那里,但是在它可以打印循环结束之前。 我该如何解决?

做:

print(allcontents[:-2] + container)

在循环的末尾。

您的最后allcontents行已经存储在allcontents ,只是没有打印出来。

正如@Austin所说,您需要在循环之外进行打印。 这是修改后的结果,可以提供所需的输出:

import re

with open('mydata.txt', 'r') as infile:
    container = ''
    allcontents = ''
    for line in infile:
        line = line.strip()
        if line.endswith('contains:'):
            print(allcontents[:-2] + container)
            container = re.search('#(.+)\scontains', line).group(1)
            container = '@' + container
            allcontents = ''  # reset allcontents

        if line.startswith('- '):
            content = re.search('-\s(.+)$', line).group(1)
            allcontents = allcontents + content + ', '
    if container:
        print(allcontents[:-2] + container)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM