Как проверить каталог файлов для gzip и распаковать сжатые файлы в Python, используя zcat?
У меня вторая неделя Python, и я застрял в каталоге zip / unzipped log-файлов, которые мне нужно проанализировать и обработать.
В настоящее время я делаю это:
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)
которые я "сшил" вместе, используя эти ответы SO ( здесь) и blogposts ( здесь)
Тем не менее, это не похоже на работу, потому что мой тестовый файл имеет размер 2,5 ГБ, и скрипт его жует уже более 10 минут, плюс я не совсем уверен, правильно ли то, что я делаю.
Вопрос:
Если я не хочу использовать модуль GZIP и нужно распаковывать чанк-чанк (фактические файлы>10 ГБ), как мне распаковать и сохранить в файл, используя zcat и подпроцесс в Python?
Спасибо!
1 ответ
Решение
Это должно прочитать первую строку каждого файла в подкаталоге logs, распакуя при необходимости:
#!/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()