搜索并替换上一行

2024-10-02 22:34:31 发布

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

在一个文件中,我有以下文本:

 xxxxxx
    PCTFREE    10
    INITRANS   8
    MAXTRANS   255
    STORAGE    (
                BUFFER_POOL      DEFAULT
               ),
)

我正在尝试搜索以(“)”开头的行,并从上一行中删除“,”


Tags: 文件文本defaultbufferstoragepoolxxxxxxmaxtrans
3条回答

您在描述中要求的内容与示例输入中的任何内容都不匹配,甚至接近。没有一行以)开头。其中一行以一些空格和a)开头,但前面的一行是空行,前面的最后一行没有逗号可删除

但我将忽略示例输入,并解释如何执行描述中要求的操作

最简单的方法是在迭代行的同时跟踪上一行:

lastline = None
for line in infile:
    line = line.rstrip()
    if line.startswith(")"):
        if lastline is not None:
            lastline = lastline.rstrip(",")
    if lastline is not None:
        outfile.write(lastline + '\n')
    lastline = line
if lastline is not None:
    outfile.write(lastline + '\n')

通过使用pairwise迭代器包装器(如^{} recipes中的迭代器包装器),您可以使它更干净、更紧凑,但需要稍微修改,以便在末尾包含“extra”对:

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return itertools.zip_longest(a, b, fillvalue='')

stripped = (line.rstrip() for line in infile)
for line, nextline in pairwise(stripped):
    if nextline.startswith(")"):
        line = line.rstrip(",")
    if line is not None:
        outfile.write(line + '\n')
with open('filename') as f:
    print(f.read().replace(',\n)','\n)')

您可以一行一行地在文本上循环,并在前面检查一个索引中的)

new_s = [i.strip('\n') for i in open('filename.txt')]
final_data = '\n'.join(new_s[i][:-1] if new_s[i+1].startswith(')') else new_s[i] for i in range(len(new_s)-1))

输出:

xxxxxx
PCTFREE    10
INITRANS   8
MAXTRANS   255
STORAGE    (
        BUFFER_POOL      DEFAULT
       )
)

相关问题 更多 >