python - 如何使用 zcat 在 Python 中测试 gzip 文件目录并解压缩 gzip 文件?

标签 python logging gzip compression zcat

我已经进入 Python 学习的第二周了,我被困在压缩/解压日志文件的目录中,我需要解析和处理这些文件。

目前我正在这样做:

import os
import sys
import operator
import zipfile
import zlib
import gzip
import subprocess

if sys.version.startswith("3."):
    import io
    io_method = io.BytesIO
else:
    import cStringIO
    io_method = cStringIO.StringIO

for f in glob.glob('logs/*'):
    file = open(f,'rb')        
    new_file_name = f + "_unzipped"
    last_pos = file.tell()

    # test for gzip
    if (file.read(2) == b'\x1f\x8b'):
        file.seek(last_pos)

    #unzip to new file
    out = open( new_file_name, "wb" )
    process = subprocess.Popen(["zcat", f], stdout = subprocess.PIPE, stderr=subprocess.STDOUT)

    while True:
      if process.poll() != None:
        break;

    output = io_method(process.communicate()[0])
    exitCode = process.returncode


    if (exitCode == 0):
      print "done"
      out.write( output )
      out.close()
    else:
      raise ProcessException(command, exitCode, output)

我使用这些答案(here)和博客文章(here)将其“缝合”在一起

但是,它似乎不起作用,因为我的测试文件是 2.5GB,并且脚本已经对其进行了 10 分钟以上的咀嚼,而且我不确定我所做的是否正确。

问题:
如果我不想使用GZIP模块并且需要逐 block 解压缩(实际文件>10GB),如何使用Python中的zcat和subprocess解压缩并保存到文件?

谢谢!

最佳答案

这应该读取日志子目录中每个文件的第一行,并根据需要解压缩:

#!/usr/bin/env python

import glob
import gzip
import subprocess

for f in glob.glob('logs/*'):
  if f.endswith('.gz'):
    # Open a compressed file. Here is the easy way:
    #   file = gzip.open(f, 'rb')
    # Or, here is the hard way:
    proc = subprocess.Popen(['zcat', f], stdout=subprocess.PIPE)
    file = proc.stdout
  else:
    # Otherwise, it must be a regular file
    file = open(f, 'rb')

  # Process file, for example:
  print f, file.readline()

关于python - 如何使用 zcat 在 Python 中测试 gzip 文件目录并解压缩 gzip 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15340982/

相关文章:

python - 有没有办法获得碰撞点的坐标?

python - 如何使用 YouTube 的 API 下载 YouTube 视频

logging - 为什么 logging.handlers.TimedRotatingFileHandler 创建 root 拥有的新日志文件?

logging - 如何将所有解析请求记录到 Autofac 容器?

java - 如何向压缩的 HttpUrlConnection 写入 post 语句?

python - 不一致的理解语法?

multithreading - 尝试重新定义 IO::Tee::PRINT 以确保线程安全

json - 我可以在发布之前获取 http.NewRequest 的大小吗?

delphi - DataSnap XE2 服务器 - 使用 GZIP 压缩?

python -/: ‘map’ and 'int’ 不支持的操作数类型