Donc, c'est une question apparemment simple, mais je suis apparemment très terne. J'ai un petit script qui télécharge tous les fichiers .bz2 d'une page Web, mais pour une raison quelconque, la décompression de ce fichier me donne un mal de tête majeur.
Je suis tout à fait un débutant python, alors la réponse est donc probablement assez évidente , s'il vous plaît aidez-moi. P>
Dans ce bit du script, j'ai déjà le fichier et je veux juste la lire à une variable, puis décompresser cela? Est-ce correct? J'ai essayé toutes sortes de choses à faire cela, je reçois habituellement "ValueError: impossible de trouver la fin de la diffusion" Erreur sur la dernière ligne de cet extrait. J'ai essayé d'ouvrir le zipfile et d'écrire à une corde de différentes manières différentes. C'est le dernier. P>
uncompressedData = bz2.decompress(s) ValueError: couldn't find end of stream
3 Réponses :
Vous ouvrez et lisez le fichier compressé comme s'il s'agissait d'un fichier texte composé de lignes. Non! Ce n'est pas.
uncompressedData = bz2.BZ2File(zipFile).read()
Bonjour Alex, merci pour votre réponse rapide, veuillez consulter les modifications de ma question qui répondent à votre commentaire.
Donc, le problème avec cette méthode, c'est bien qu'il semble le décompresser bien, lorsque j'essaye de l'exécuter, le fichier est corrompu d'une manière ou d'une autre. Lorsque j'ouvre le fichier .bz2 avec, dites, 7ZIP, ça marche bien. De plus, la taille d'un fichier correctement extraite (avec 7ZIP) est de 948 Ko, tandis que le fichier extrait de mon script est de 952 Ko. Je suis complètement déconcerté.
7IP accepte de nombreux autres formats en plus de BZ2, peut-être que votre fichier est dans l'un des autres formats. Si la loi et la vie privée n'entruisent pas que, mettez-la sur une URL publique, donnez-moi l'URL, et je vous ferai savoir quel format il est dans et comment le décoder - sans avoir le fichier à portée de main, c'est essentiellement impossible pour moi de faire.
Merci pour vous toutes votre aide, Alex, désolé d'être un peu épais ici. Cela a du sens, mais alors pourquoi la bibliothèque Python BZ2 a-t-elle décompressé le fichier? Ne serait-il pas une sorte d'exception? Je verrai si je peux trouver un endroit pour mettre le fichier (ce n'est rien d'illégal, il ne s'agit que d'un fichier .bz2 d'un fichier de carte de l'équipe Fortress2 (fichier .bsp), mais je ne veux pas mettre l'URL en place publiquement, Comme c'est le serveur de mon ami qui l'héberge. Comment puis-je vérifier si le fichier .bz2 est en fait dans un fichier BZ2?
Mais vous avez dit qu'il a soulevé une exception - une ValueError! Je crois que vous pouvez télécharger une excusable de BZIP2 uniquement à Bzip.org/downloads.html - Si cet exe décode le fichier correctement, cela devrait, je pense, prouver que c'est un .bz2, et vice versa.
Désolé pour mon manque de clarté. Non compressedData = BZ2.BZ2FILE (ZIPFILE) .Read () décompressez tout et n'en soulève pas une exception. Cependant, le fichier .bsp est toujours corrompu, comme spécifié. Ah! Je vais vérifier cet exe et voir si le fichier est en effet un fichier BZ2. Merci encore.
Eurasien, assurez-vous de sauvegarder le fichier avec le mode défini sur 'WB'. J'ai joué autour et quand je n'ai pas écrit les données non comprimées à l'aide du mode binaire, mon fichier disposait de caractères supplémentaires des nouvelles lignes.
Merci Philip, c'est exactement ça, merci pour le plus d'informations supplémentaires.
Aha, donc c'est encore le même problème que ma réponse mentionne déjà la partie de lecture, appliquer à la partie d'écriture autant, je ne savais pas que le fichier BSP est également binaire, mais vous avez besoin de la B dans les options. sur chaque fichier binaire (et pas de fichier texte non binaire mais non binaire).
openplezip = ouvert (zipfile, "r") p> blockQuote>
Si vous exécutez sur Windows, vous voudrez peut-être dire
openplezip = ouvert (zipfile, "rb") strong> ici, car le fichier est susceptible de contenir des combinaisons CR / LF, et vous ne pouvez pas 't veux qu'ils soient traduits. p> newline = openplez.readline () p> blockQuote>
Comme Alex a souligné, c'est très faux, car le concept de "lignes" est étranger à un flux compressé. p>
S = FileHandle.Lead (1024) [...] Non compressedData + = bz2.decompress (s) p> blockQuote>
C'est faux pour la même raison. Les morceaux de 1024 octets ne signent pas beaucoup au décompresseur, car il va vouloir travailler avec sa propre taille de bloc. P>
S = fichierHandle.read () Non compressedData = bz2.decompress (s) p> blockQuote>
Si cela ne fonctionne pas, je dirais que c'est le problème de traduction du nouveau line que j'ai mentionné ci-dessus. P>
Merci, ceci était vraiment utile.
C'était très utile. 44 sur 2300 fichiers ont donné une erreur de fin de fichier manquante, sous Windows Ouvrir. Ajout du drapeau B (Inary) à ouvrir fixe le problème.
for line in bz2.BZ2File(filename, 'rb', 10000000) :
Avez-vous réellement essayé ce que Alex a suggéré?