在python中读取头之间的文件

2024-10-03 00:32:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大的文本文件,其中的值由以“#”开头的头分隔。如果条件与头中的条件匹配,我想读取文件直到下一个头“#”,并跳过文件的其余部分。在

为了测试我正在尝试读取以下名为test234.txt的文本文件:

# abcdefgh
1fnrnf
mrkfr
nfoiernfr
nerfnr
# something
njndjen kj
ejkndjke
#vcrvr

我写的代码是:

^{pr2}$

但是,我得到的结果是:

# abcdefgh

fnrnf

rkfr

foiernfr

erfnr

something

jndjen kj

jkndjke

vcrvr

相反,我希望两个标题之间的输出用“#”分隔,即:

1fnrnf
mrkfr
nfoiernfr
nerfnr      

我怎么能做到呢?谢谢!在

EDIT:Reading in file block by block using specified delimiter in python讨论以头分隔的组读取文件,但我不想读取所有的头。我只想读取满足给定条件的头文件,当该行到达标记为“#”的下一个头时,它就停止读取文件。在


Tags: 文件intxt条件blocksomething文本文件kj
2条回答

^{}可以帮助:

from io import StringIO
from itertools import groupby

text = '''# abcdefgh
1fnrnf
mrkfr
nfoiernfr
nerfnr
# something
njndjen kj
ejkndjke
#vcrvr'''


with StringIO(text) as file:
    lines = (line.strip() for line in file)  # removing trailing '\n'
    for key, group in groupby(lines, key=lambda x: x[0]=='#'):

        if key is True:
            # found a line that starts with '#'
            print('found header: {}'.format(next(group)))

        if key is False:
            # group now contanins all lines that do not start with '#'
            print('\n'.join(group))

请注意,所有这些都是懒惰。你的内存中只有两个标题之间的所有项目。在

您必须将with StringIO(text) as file:替换为;with open('test234.txt', 'r') as file:。。。在

测试的输出是:

^{pr2}$

更新因为我误解了。这是一个新的尝试:

from io import StringIO
from collections import deque
from itertools import takewhile

from_line = '# abcdefgh'
to_line = '# something'

with StringIO(text) as file:
    lines = (line.strip() for line in file)  # removing trailing '\n'

    # fast-forward up to from_line
    deque(takewhile(lambda x: x != from_line, lines), maxlen=0)

    for line in takewhile(lambda x: x != to_line, lines):
        print(line)

在这里,我使用^{}在行上获取迭代器,直到遇到一个continment(直到在您的例子中找到第一个头)。在

deque部分只是itertools食谱中建议的^{} pattern。它只是快速前进到给定条件不再成立的点。在

学习和使用正则表达式。它将帮助您完成所有的文档意义处理。在

import re #regex library

with open('test234.txt') as f:  #file stream
    lines = f.readlines()       #reads all lines

p = re.compile('^#.*')          #regex pattern creation

for l in lines:
    if p.match(l) == None:      #looks for non-matching lines
        print(l[:-2])

相关问题 更多 >