Python:在项中直到停止项的逐项处理?

3 投票
6 回答
1908 浏览
提问于 2025-04-11 20:20

免责声明:我对Python还比较陌生!

如果我想要获取一个文件中所有的行,直到(编辑:包括)包含某个字符串 stopterm 的那一行,有没有办法用列表的语法来实现呢?我希望能有类似这样的写法:

usefullines = [line for line in file until stopterm in line]

目前,我的做法是

usefullines = []
for line in file:
    usefullines.append(line)
    if stopterm in line:
        break

这并不是世界末日,但因为Python的其他语法都很简单,我希望能有一种一对一的方式来写出Python代码。

6 个回答

2

这个itertools的解决方案真不错。我之前对itertools.groupby感到很惊讶,这真是个方便的工具。

不过我还是想试试看能不能不使用itertools来实现这个功能。所以我就这样做了(不过有一个前提和一个缺点:文件不大,并且多读取了一次完整的行)。

我创建了一个名为“try”的示例文件:

hello
world
happy
day
bye

一旦你读取了文件,并把行存储在一个叫做lines的变量里:

lines=open('./try').readlines()

然后

    print [each for each in lines if lines.index(each)<=[lines.index(line) for line in lines if 'happy' in line][0]]

会得到这个结果:

['hello\n', 'world\n', 'happy\n']

print [each for each in lines if lines.index(each)<=[lines.index(line) for line in lines if 'day' in line][0]]

会得到这个结果:

['hello\n', 'world\n', 'happy\n', 'day\n']

所以你得到了最后一行——停止词的那一行也包含在内。

5

“我希望能有一个想法对应一行Python代码。”我们都希望有一种编程语言,能像我们说话那样简单。

其实是可以做到的,你只需要把自己的独特想法定义一次。这样你就能实现你想要的那种一对一的映射。

def usefulLines( aFile ):
    for line in aFile:
        yield line
        if line == stopterm:
            break

就差不多这样。

for line in usefulLines( aFile ):
    # process a line, knowing it occurs BEFORE stopterm.

还有一些更通用的方法。lassevk 提到的 enum_whileenum_until 是对这种简单设计模式的扩展。

10
from itertools import takewhile
usefullines = takewhile(lambda x: not re.search(stopterm, x), lines)

from itertools import takewhile
usefullines = takewhile(lambda x: stopterm not in x, lines)
def useful_lines(lines, stopterm):
    for line in lines:
        if stopterm in line:
            yield line
            break
        yield line

usefullines = useful_lines(lines, stopterm)
# or...
for line in useful_lines(lines, stopterm):
    # ... do stuff
    pass

这里有一种方法可以保留stopterm这一行:

撰写回答