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!!
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.
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)
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)
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.
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. . .
Depuis docs pour Python
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)
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.
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)