2011-11-16 13 views
21

Voglio gzip un file in Python. Sto cercando di utilizzare subprocss.check_call(), ma continua a non riuscire con l'errore 'OSError: [Errno 2] Nessun file o directory di questo tipo'. C'è un problema con quello che sto provando qui? C'è un modo migliore per gzip un file rispetto all'utilizzo di subprocess.check_call?gzip un file in Python

from subprocess import check_call 

def gZipFile(fullFilePath) 
    check_call('gzip ' + fullFilePath) 

Grazie !!

+11

Perché non http://docs.python.org/library/gzip.html? – Ski

+0

related: per creare un archivio tar gzip 'archive.tar.gz' da una directory'/dir/path', potresti usare 'shutil.make_archive ('archive', 'gztar', '/ dir/path')' – jfs

risposta

13

Prova questo:

check_call(['gzip', fullFilePath]) 

A seconda di quello che stai facendo con i dati di questi file, il legame di Skirmantas per http://docs.python.org/library/gzip.html può anche essere utile. Notare gli esempi nella parte inferiore della pagina. Se non hai bisogno di accedere ai dati, o non hai i dati già nel tuo codice Python, l'esecuzione di gzip potrebbe essere il modo più pulito per farlo in modo da non dover gestire i dati in Python.

+0

beh, idk se "clean" è la parola giusta ma è sicuramente il modo più veloce e quello che richiede il minimo codice dalla tua parte. –

46

C'è un modulo gzip. Uso:

Esempio di come creare un file GZIP compresso:

import gzip 
content = "Lots of content here" 
f = gzip.open('/home/joe/file.txt.gz', 'wb') 
f.write(content) 
f.close() 

Esempio di come Gzip comprimere un file esistente:

import gzip 
f_in = open('/home/joe/file.txt') 
f_out = gzip.open('/home/joe/file.txt.gz', 'wb') 
f_out.writelines(f_in) 
f_out.close() 
f_in.close() 

EDIT:

Jace Browning's answer utilizzando with in Python> = 2.7 è ovviamente più terso e leggibile, quindi il mio secondo frammento sarebbe (e ould) assomigliare:

import gzip 
with open('/home/joe/file.txt') as f_in, gzip.open('/home/joe/file.txt.gz', 'wb') as f_out: 
    f_out.writelines(f_in) 
+0

la seconda versione sostituisce il file originale con quello gzip, come farebbe il comando gzip? Sembra che non sia così. –

+1

@ Benoît: Poiché il file di output ha un nome diverso da quello letto, è ovvio che non lo fa. Fare ciò richiederebbe che i dati compressi vengano temporaneamente archiviati altrove finché tutti i dati nel file originale non sono stati compressi. – martineau

+0

Utilizzando gzip, il nome file ouput è diverso dal nome file di input. Rimuove ancora il file di input dopo aver creato quello di output. Stavo semplicemente chiedendo se il modulo gzip di Python ha fatto la stessa cosa. –

5

utilizzare il modulo gzip:

import gzip 
import os 

in_file = "somefile.data" 
in_data = open(in_file, "rb").read() 
out_gz = "foo.gz" 
gzf = gzip.open(out_gz, "wb") 
gzf.write(in_data) 
gzf.close() 

# If you want to delete the original file after the gzip is done: 
os.unlink(in_file) 

vostro errore: OSError: [Errno 2] No such file or directory' vi sta dicendo che il file fullFilePath non esiste. Se hai ancora bisogno di seguire questa strada, assicurati che il file esista sul tuo sistema e stai utilizzando un percorso assoluto non relativo.

+0

Grazie a tutti per i quick repoonses.Tutti qui suggeriscono gzip.Io ho provato anche questo.E 'un modo migliore? Il motivo per cui non sto usando questo è che lascia il file originale come lo è.So alla fine entrambe le versioni - file regolare e gzip. Sto accedendo ai dati del file però. @ Retracile, la tua correzione ha funzionato, grazie mille. Mi chiedo ancora se dovrei usare il sottoprocesso o gzip. – Rinks

+1

@Rinks Il modo più semplice per farlo sarebbe: Quando il gzip è terminato, chiama 'os.unlink (original_File_Name)' per eliminare il file originale da cui hai creato gzip. Vedi le mie modifiche. – chown

+1

@Rinks: _Il motivo per cui non lo utilizzo è che lascia il file originale come è_ - quindi perché non si elimina il file in seguito? – Xaerxess

28

In formato Python 2.7:

import gzip 

with open("path/to/file", 'rb') as orig_file: 
    with gzip.open("path/to/file.gz", 'wb') as zipped_file: 
     zipped_file.writelines(orig_file) 

ancora più breve (testato su Python 2.7.6)

with open('path/to/file') as src, gzip.open('path/to/file.gz', 'wb') as dst:   
    dst.writelines(src) 
3

la documentazione su questo è in realtà follemente semplice

Esempio di come leggere un file compresso:

import gzip 
f = gzip.open('file.txt.gz', 'rb') 
file_content = f.read() 
f.close() 

Esempio di come creare un file GZIP compresso:

import gzip 
content = "Lots of content here" 
f = gzip.open('file.txt.gz', 'wb') 
f.write(content) 
f.close() 

Esempio di come GZIP comprime un file esistente:

import gzip 
f_in = open('file.txt', 'rb') 
f_out = gzip.open('file.txt.gz', 'wb') 
f_out.writelines(f_in) 
f_out.close() 
f_in.close() 

https://docs.python.org/2/library/gzip.html

Ecco tutta la documentazione. . .

Problemi correlati