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

How to seach for a string in .gz file?

我是脚本编写新手,正在尝试读取 .gz 文件并复制包含“Alas!”的行。在它的文件中。 myfiles/all*/input.gz。在提到的路径中,它应该搜索以 (all) 开头的所有目录。对于 input.gz 文件。在 input.gz 文件中,它应该搜索字符串“Alas!”并在文本文件中打印这些行。我确定如何 linux 使用 zgrep 命令 zgrep 'Alas!' myfiles/all*/input.gz > file1.txt。我在尝试为此编写脚本时迷路了。

.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(参见 )。

声明

    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