如何在 .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='')
我是脚本编写新手,正在尝试读取 .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='')