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”没有被打印。它的输出在那里,但是在它可以打印循环结束之前。 我该如何解决?
答案 0 :(得分:2)
要做:
print(allcontents[:-2] + container)
在循环外结束。
您的最后几行已经存储在allcontents
中,只是您没有打印它。
答案 1 :(得分:2)
正如@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)