【问题标题】:How to seach for a string in .gz file? [closed]如何在 .gz 文件中搜索字符串? [关闭]
【发布时间】:2020-07-21 02:16:30
【问题描述】:

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

【问题讨论】:

  • .gz 中有多个文件或单个文件 - input.txt?
  • 在搜索文件之前,您需要解压缩文件。您可以通过使用gzip.open 打开文件来完成此操作(有关更多信息,请参阅docs.python.org/3/library/gzip.html#gzip.open
  • @bigbounty 有多个以 all 开头的文件,例如“all_phpfiles”、“all_csvfiles”。在每个以“all”开头的文件中,它应该进入文件并搜索 .gz 文件。在 .gz 文件中,它应该搜索字符串“Alas!” .我不确定 .gz 文件中存在什么
  • @bigbounty .gz 是纯压缩格式,不是存档格式; .gz 文件不能包含多个文件(除非包含具有这种结构的存档文件,例如 .tar.gz)。

标签: python python-3.x filehandler


【解决方案1】:

声明

    if 'Alas!':

仅检查字符串值'Alas!' 是否为“真”(根据定义,它是);您想检查变量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

【讨论】:

  • 您的“改进”代码显示 if 'Alas!' in f: 仍然是错误的。你确定你试过这个吗?
  • 我们如何打印它找到的目录名称'唉!'这意味着在所有目录的哪个目录中*
  • 这应该是相当微不足道的,你不觉得吗? file 变量包含当前文件名。无论如何,如果您有新问题,(在此处接受其中一个答案 - 请参阅 help - 并)提出新问题。
【解决方案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)。

【讨论】:

  • 当我试图打开文件说“TypeError: filename must be str or byte object, or a file”时抛出错误
  • 你必须更具体。
  • 查看我的编辑。您的问题中的代码会出现相同的错误。您需要遍历 glob.glob 结果,因为它返回一个列表。
  • 我们如何解压.gz文件来读取文件。我使用了 gzip.open 选项,但我无法通过 .gz 文件
  • 错字:应该是if 'Alas!' in line: 而不是if 'Alas!' in f:
猜你喜欢
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
  • 2019-06-09
  • 2014-09-02
  • 1970-01-01
  • 2014-08-09
相关资源
最近更新 更多