2013-03-11 3 views
2

Я нахожусь на своей второй неделе Python, и я застрял в каталоге zipped/unzipped logfiles, который мне нужно разобрать и обработать.Как проверить каталог файлов для gzip и распаковать gzip-файлы в Python с помощью zcat?

В настоящее время я делаю это:

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 ответы (here) и (here · блоги, ·)

Однако, это не похоже на работу , потому что мой тестовый файл составляет 2,5 ГБ, а скрипт пережевывает его на 10 + мин плюс я не уверен, что то, что я делаю, все равно правильно.

Вопрос:
Если я не хочу использовать модуль GZIP и нужен де-компресс кусок по-кусок (фактические файлы> 10GB), как я могу разархивировать и сохранить в файл с помощью zcat и подпроцесс в Python?

Спасибо!

+0

Я неясный на то, что ваша цель. Вы пытаетесь распаковать все файлы в каталоге? Эквивалентно: 'gunzip * .gz'? Есть ли у вас какое-либо конкретное возражение против использования модуля gzip? –

+0

Каталог содержит файлы в формате zipped и unzipped. Мне нужно обрабатывать оба в одном процессе, поэтому моя идея состояла в том, чтобы (1) сначала запустить над каталогом, (2) выбрать zipped файлы и распаковать в новый файл (3), а затем выполнить 2-й прогон для обработки. Не уверен, что это лучший способ пойти, но – frequent

+1

re: objection 'gzip', не так ли, что gzip очень медленный - как упоминалось [здесь] (http://codebright.wordpress.com/2011/03/ 25/139 /)? – frequent

ответ

2

Это должен прочитать первую строку каждый файл в подкаталоге бревен, распаковка в соответствии с требованиями:

#!/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() 
+0

Ах. Спасибо за ясность :-) – frequent

 Смежные вопросы

  • Нет связанных вопросов^_^