web-dev-qa-db-fra.com

gzipez un fichier en Python

Je veux compresser un fichier en Python. J'essaie d'utiliser le subprocss.check_call (), mais il échoue toujours avec l'erreur "OSError: [Errno 2] Aucun fichier ou répertoire de ce type". Y a-t-il un problème avec ce que j'essaie ici? Existe-t-il une meilleure façon de compresser un fichier gzip que d'utiliser subprocess.check_call?

from subprocess import check_call

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

Merci!!

30
Rinks

Essaye ça:

check_call(['gzip', fullFilePath])

Selon ce que vous faites avec les données de ces fichiers, le lien de Skirmantas vers http://docs.python.org/library/gzip.html peut également être utile. Notez les exemples au bas de la page. Si vous n'avez pas besoin d'accéder aux données, ou si vous n'avez pas déjà les données dans votre code Python, exécuter gzip peut être la façon la plus simple de le faire, vous n'avez donc pas à gérer les données en Python.

19
retracile

Il y a un module gzip . Usage:

Exemple de création d'un fichier GZIP compressé:

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

Exemple de compression GZIP d'un fichier existant:

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()

MODIFIER:

réponse de Jace Browning utilisant with dans Python> = 2.7 est évidemment plus concis et lisible, donc mon deuxième extrait ressemblerait (et devrait) ressembler à:

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

Au format 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)

Encore plus court (testé sur python 2.7.6)

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

Utilisez le module 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)

Votre erreur: OSError: [Errno 2] No such file or directory' vous indique que le fichier fullFilePath n'existe pas. Si vous devez toujours suivre cette voie, assurez-vous que le fichier existe sur votre système et que vous utilisez un chemin absolu non relatif.

5
chown

la documentation à ce sujet est en fait incroyablement simple

Exemple de lecture d'un fichier compressé:

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

Exemple de création d'un fichier GZIP compressé:

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

Exemple de compression GZIP d'un fichier existant:

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

Voilà toute la documentation. . .

4
O.rka

Depuis docs pour Python

Gzipez un fichier existant

import gzip
import shutil
with open('file.txt', 'rb') as f_in:
    with gzip.open('file.txt.gz', 'wb') as f_out:
        shutil.copyfileobj(f_in, f_out)

# or because I hate nested with statements

import gzip
import shutil
from contextlib import ExitStack
with ExitStack() as stack:
    f_in = stack.enter_context(open('file.txt', 'rb'))
    f_out = stack.enter_context(gzip.open('file.txt.gz', 'wb'))
    shutil.copyfileobj(f_in, f_out)

Créez un nouveau fichier gzip:

import gzip
content = b"Lots of content here"
with gzip.open("file.txt.gz", "wb") as f:
    f.write(content)

Notez le fait que le contenu est transformé en octets

Si vous ne créez pas de contenu sous la forme d'un littéral chaîne/octet comme dans l'exemple ci-dessus, une autre méthode serait

import gzip
# get content as a string from somewhere else in the code
with gzip.open("file.txt.gz", "wb") as f:
    f.write(content.encode("utf-8"))

Voir this SO question pour une discussion sur les autres méthodes de codage.

3
Michael Hall
import gzip

def gzip_file(src_path, dst_path):
    with open(src_path, 'rb') as src, gzip.open(dst_path, 'wb') as dst:
        for chunk in iter(lambda: src.read(4096), b""):
            dst.write(chunk)
2
mechatroner