如何在.gz文件中搜索字符串?

2024-06-11 16:16:19 发布

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

我不熟悉编写脚本并尝试读取.gz文件,如果文件中包含“唉!”的话,则复制这些行myfiles/all*/input.gz。在上面提到的路径中,它应该搜索以(all)开头的所有目录。对于input.gz文件。在input.gz文件中,它应该搜索字符串“Alas!”并在文本文件中打印这些行。我知道如何使用zgrep命令在linux上实现这一点 zgrep 'Alas!' myfiles/all*/input.gz > file1.txt。我在写剧本的时候迷失了方向


Tags: 文件字符串命令路径目录脚本inputlinux
2条回答

.gz文件已压缩,因此无法通过直接打开它来搜索内容。您需要在搜索之前解压缩它。Python提供了gzip.open来打开和解压缩gzip压缩文件

import gzip

files = glob.glob('myfiles/all*/input.gz')
for file in files:
    with gzip.open(file, 'rt') as f, open('file1.txt', 'w') as o:
        for line in f:
            if 'Alas!' in line: # Changed this
                print(line, file=o)

您还需要将if 'Alas!'更改为if 'Alas!' in line。前者的计算结果总是True,因此每一行都将添加到另一个文件中。后者仅当在行中找到Alas!时才会向另一个文件添加一行

值得一提的是,zgrep以类似的方式工作。它解压文件,然后将其传输到grep(请参见https://stackoverflow.com/a/45175234/5666087

声明

    if 'Alas!':

仅检查字符串值'Alas!'是否为“truthy”(根据定义,它是);要检查变量line是否包含此子字符串

    if 'Alas!' in line:

另一个问题是,您多次打开输出文件,覆盖了以前输入文件的任何结果。您只想在开始时打开它一次(或打开以进行追加;但重复打开和关闭同一文件是不必要的,而且效率低下)

更好的设计可能是简单地打印到标准输出,并允许用户将输出重定向到文件(如果他们愿意)。(另外,可能接受输入文件作为命令行参数,而不是硬编码复杂的相对路径。)

第三个问题是,输入行已经包含一个换行符,但是print()将添加另一个换行符。在打印前去掉换行符,或者告诉print不要提供另一个换行符(或者切换到不添加换行符的write

import gzip
import glob

with open('file1.txt', 'w') as o:
    for file in glob.glob('myfiles/all*/input.gz'):
        with gzip.open(file, 'rt') as f:
            for line in f:
                if 'Alas!' in line:
                    print(line, file=o, end='')

演示:https://ideone.com/rTXBSS

相关问题 更多 >