根据python中的条件打印上一行

2024-05-15 16:52:38 发布

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

我正试着打印-第四行是基于一个条件。我有一个文本文件SFU.txt,其中包含一些内容。我的目标是:如果一行中有一个单词configuration,我想打印第四行。例如,如果我的文件内容如下所示:

This is a random text document
We are talking about planets here
This is planet Mars
in solarsystem
sun is the star
this is 4th planet
configuration lifeform exists
bla bla bla
bla bla bla

所以,一旦编译器碰到configuration lifeform exists行并看到configuration,我想打印This is planet earth

我的代码如下:

^{pr2}$

Tags: 文件txt内容目标isexiststhis条件
3条回答

有限大小的deque是保留最后几行的“环形缓冲区”的好方法:

import collections

lastfewlines = collections.deque((), 4)

with open('SFU.txt') as f:
    for line in f:
        if 'configuration' in line and len(lastfewlines) == 4:
            print(lastfewlines[0])
        lastfewlines.append(line.rstrip())

然而,虽然这解决了问题中提出的问题,但它并不适用于OP只在注释中提到的“真正的问题”——“编辑”那一行,这意味着,大概是将输入文件“就地”修改。在

唉,现代文件系统不允许对文件进行“就地编辑”,但逐字节覆盖除外——除非“编辑”的行与原始行的字节数完全相同,否则不能只覆盖原来的行,并想象文件中的所有后续行都将按需来回移动!-)在

相反,你必须读文件,修改它,然后重写它(最合理的方法通常是编写一个新文件,然后将其重命名为旧文件名,“尽你的操作系统和文件系统允许的那样自动”,以避免在发生崩溃时丢失数据)。在

deque方法可以适应这种情况——而不是有条件地打印lastfewlines[0],而是将其原始或修改后的版本写入输出文件(最后将{}中剩下的内容写入输出文件)。然后,至少在Unix系统和本地文件系统上,一个简单的os.rename就能完成原子技巧(只要输出文件与输入文件在同一个挂载磁盘上)。在

然而,对于所有的文件,除了非常大的文件外,读取内存中的所有行(使用f.readlines()),执行行列表上的任何更改,然后再次写出批,就简单多了。如果用户在文件中提到的每行字节数都小于16000个字节的大小,那么就不必担心文件的大小了!-)在

使用teeinf上运行一对迭代器。在任何给定时间,这只在内存中存储五行:

from itertools import tee

with open("SFU.txt") as inf:
    # set up iterators
    cfg,res = tee(inf)
    # advance cfg by four lines
    for i in range(4):
        next(cfg)

    for c,r in zip(cfg, res):
        if "configuration" in c:
            print(r)

正如预期的那样,结果是

^{pr2}$

编辑:如果你想编辑第4行,我建议

def edited(r):
    # make your changes to r
    return new_r

with open("SFU.txt") as inf, open("edited.txt", "w") as outf:
    # set up iterators
    cfg, res = tee(inf)
    for i in range(4):
        next(cfg)

    # iterate through in tandem
    for c, r in zip(cfg, res):
        if "configuration" in c:
            r = edited(r)
        outf.write(r)

    # reached end - write out remaining queued values
    for r in res:
        outf.write(r)

如果有几行可以使用readlines()将行另存为列表,则只需使用索引:

my_file = open("SFU.txt","r").readlines()
for i,line in enumerate(my_file):
    if "configuration" in line:
        print file[i-4]

但请注意,如果i<4它从末尾选择了您的行!在

相关问题 更多 >