从列表中读取 .gz 文件并打印行

Read .gz files from a list and print lines

基本上,我有一个文件夹,每天都在其中归档绝对巨大的日志文件。每天更精确地创建 3 个日志文件。

我正在编写一个 Python 脚本,用户必须在其中输入 YYYYMMDD 格式的日期才能找到在该日期创建的 3 个文件,然后他输入一个 IP 地址。脚本将读取 3 个 .gz 文件的内容并打印 IP 地址所在的行。

import re
import os
import glob
import gzip
from datetime import datetime, timedelta

date_entry = raw_input('Give a date in format YEAR, MONTH, DAY \n')
date = datetime.strptime(re.sub("\s+", "", date_entry), "%Y,%m,%d").date()

path = "/applis/tacacs/log/"

list_of_files = [
    file for file in glob.glob(path + '*.gz')
    if date == datetime.fromtimestamp(os.path.getmtime(file)).date()
]

print("Files found: ")
print(list_of_files)
Adresse_IP = raw_input('IP Address \n')

for line in gzip.open(list_of_files):
                if re.search(Adresse_IP, line):
                        print line

但是我收到以下错误:

  File "scriptacacs3.py", line 19, in <module>
    for line in gzip.open(list_of_files):
  File "/usr/lib/python2.7/gzip.py", line 34, in open
    return GzipFile(filename, mode, compresslevel)
  File "/usr/lib/python2.7/gzip.py", line 94, in __init__
    fileobj = self.myfileobj = __builtin__.open(filename, mode or 'rb')
TypeError: coercing to Unicode: need string or buffer, list found

显然它正在等待一个字符串。有没有办法以不同的方式做到这一点?是否可以一次读取一个文件?

编辑:在这种情况下可以使用文件输入法吗?例如使用 fileinput.hook_compressed 因为文件是 .gz 格式并且在列表中。

我还提到输入日期后找到的文件如下所示:

['/applis/tacacs/log/tacacs.log.7.gz', '/applis/tacacs/log/tacacs_acct.log.7.gz', '/applis/tacacs/log/tacacs_provisioning.log.4.gz']

我整个早上都在寻找一种方法来做这件事,但我仍然被困住了。如果有人能给我线索,我将不胜感激。

您一次传递了过滤后的日志文件名称的完整列表,这就是为什么会出现错误,迭代列表传递或逐个读取文件然后搜索文件

import re
import os
import glob
import gzip
from datetime import datetime, timedelta

date_entry = raw_input('Give a date in format YEAR, MONTH, DAY \n')
date = datetime.strptime(re.sub("\s+", "", date_entry), "%Y,%m,%d").date()

path = "/applis/tacacs/log/"

list_of_files = [
    file for file in glob.glob(path + '*.gz')
    if date == datetime.fromtimestamp(os.path.getmtime(file)).date()
]

print("Files found: ")
print(list_of_files)
Adresse_IP = raw_input('IP Address \n')

for fname in list_of_files: #iterate log file names to open it one by one
    with gzip.open(fname, 'r') as file: #open single file
        for line in file: #iterate all lines
            if re.search(Adresse_IP, line): #search line
                print(line) #print line if match