En utilisant python 2.4 et la bibliothèque intégrée ZipFile
, je ne peux pas lire de très gros fichiers zip (plus de 1 ou 2 Go) car il veut stocker tout le contenu du fichier non compressé en mémoire. Existe-t-il un autre moyen de le faire (soit avec une bibliothèque tierce, soit avec un autre hack), ou dois-je le "déballer" et le décompresser de cette façon (ce qui n'est pas forcément multi-plateforme).Comment décompressez-vous les fichiers très volumineux en python?
15
A
Répondre
16
Voici un aperçu de la décompression de fichiers volumineux.
import zipfile
import zlib
import os
src = open(doc, "rb")
zf = zipfile.ZipFile(src)
for m in zf.infolist():
# Examine the header
print m.filename, m.header_offset, m.compress_size, repr(m.extra), repr(m.comment)
src.seek(m.header_offset)
src.read(30) # Good to use struct to unpack this.
nm= src.read(len(m.filename))
if len(m.extra) > 0: ex= src.read(len(m.extra))
if len(m.comment) > 0: cm= src.read(len(m.comment))
# Build a decompression object
decomp= zlib.decompressobj(-15)
# This can be done with a loop reading blocks
out= open(m.filename, "wb")
result= decomp.decompress(src.read(m.compress_size))
out.write(result)
result = decomp.flush()
out.write(result)
# end of the loop
out.close()
zf.close()
src.close()
8
Au Python 2.6, vous pouvez utiliser ZipFile.open()
pour ouvrir un descripteur de fichier sur un fichier et copier le contenu de manière efficace dans un fichier cible de votre choix:
import errno
import os
import shutil
import zipfile
TARGETDIR = '/foo/bar/baz'
with open(doc, "rb") as zipsrc:
zfile = zipfile.ZipFile(zipsrc)
for member in zfile.infolist():
target_path = os.path.join(TARGETDIR, member.filename)
if target_path.endswith('/'): # folder entry, create
try:
os.makedirs(target_path)
except (OSError, IOError) as err:
# Windows may complain if the folders already exist
if err.errno != errno.EEXIST:
raise
continue
with open(target_path, 'wb') as outfile, zfile.open(member) as infile:
shutil.copyfileobj(infile, outfile)
Il utilise shutil.copyfileobj()
pour lire efficacement données de l'objet zipfile ouvert, en le copiant dans le fichier de sortie.
Questions connexes
- 1. Fichiers Jar très volumineux et FAT32
- 2. Les fichiers exécutables JAR s'exécutent très lentement
- 3. Transfert de fichiers volumineux HTTP
- 4. Expression régulière très lente lors de l'utilisation de documents volumineux
- 5. Comment lire les fichiers journaux sur le réseau très rapidement?
- 6. Comment trouver un^b de très grands nombres en python?
- 7. Déballer des fichiers volumineux avec gzip en PHP
- 8. Google App Engine Téléchargement de fichiers volumineux
- 9. Quelques conseils pour le traitement de fichiers volumineux en Java
- 10. Bonne bibliothèque ISAM ou autre gestionnaire de fichiers simple pour les fichiers volumineux sous Windows x64
- 11. Parsing fichiers texte volumineux avec Adobe AIR
- 12. Passage de fichiers volumineux au service WCF
- 13. Comment optimiser/simuler le chargement «aléatoire» de fichiers d'image volumineux?
- 14. .NET 3.5 Télécharger des fichiers volumineux
- 15. Téléchargement de fichiers volumineux dans WSS v3
- 16. Lire des fichiers en python
- 17. Cache système Windows et fichiers volumineux
- 18. Comment les gestionnaires de téléchargement téléchargent-ils des fichiers volumineux sur HTTP sans plusieurs demandes?
- 19. Comment trouver les 10 fichiers les plus volumineux dans une structure de répertoire
- 20. Comment convertir un document Word en HTML très simple en Python?
- 21. Comment éviter la coloration syntaxique pour les fichiers volumineux dans vim?
- 22. git - Suppression de fichiers volumineux, mais la caisse et les fichiers .pack encore énormes
- 23. Analyser des fichiers DICOM en Python natif
- 24. La lecture de très gros fichiers dans PHP
- 25. Les compréhensions en Python et Javascript ne sont que très basiques?
- 26. Transfert de fichiers en vrac Amazon Python S3 via Python
- 27. Analyseur SAX en ligne de commande très simple pour les fichiers XML
- 28. Modification d'un fichier de vidage/de texte SQL très volumineux (sous Linux)
- 29. Erreurs de téléchargement de fichiers volumineux avec PHP
- 30. Téléchargement de fichiers volumineux sur une grappe de serveurs
C'est exactement ce que je cherchais - merci! –
@ s-lott Que fait 'ex = src.read (len (m.extra))' et 'cm = src.read (len (m.comment))' quoi utilisez-vous les variables 'ex' et' cm Pour? Que voulez-vous dire qu'il est bon d'utiliser une struct pour déballer cela? Et à quoi sert le numéro magique '30'? – Jonathan