Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

zipfile et fichier unicode

13 réponses
Avatar
Do Re Mi chel La Si Do
Bonsoir !

zipfile est-il compatible, avec des fichiers dont le nom est en Unicode ?

Cela fait 1 heure que je tente de créer un fichier compressé, à partir d'un
fichier dont le nom est en cyrillique. Et, au mieux, j'ai la TB suivant :


Traceback (most recent call last):
File "D:\dev\Python\zipuni.py", line 7, in ?
z.write(f)
File "C:\Python24\lib\zipfile.py", line 412, in write
self.fp.write(zinfo.FileHeader())
File "C:\Python24\lib\zipfile.py", line 166, in FileHeader
return header + self.filename + self.extra
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 10:
ordinal not in range(128)


@-salutations

Michel Claveau

10 réponses

1 2
Avatar
JG
zipfile est-il compatible, avec des fichiers dont le nom est en Unicode ?

Cela fait 1 heure que je tente de créer un fichier compressé, à
partir d'un fichier dont le nom est en cyrillique. Et, au mieux, j'ai la

TB suivant :


Traceback (most recent call last):
File "D:devPythonzipuni.py", line 7, in ?
z.write(f)
File "C:Python24libzipfile.py", line 412, in write
self.fp.write(zinfo.FileHeader())
File "C:Python24libzipfile.py", line 166, in FileHeader
return header + self.filename + self.extra
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position
10: ordinal not in range(128)



Bonjour,
Je travaille assez peu avec Python. (Je m'en sers parfois pour créer des
objets COM utilisés ensuite dans d'autres langages.)Je ne suis pas du
tout spécialiste de ce langage.

Je me souviens avoir eu ce problème. Dans un premier temps j'utilisais :

path.encode('latin-1')
# path étant l'argument passé à la fonction unzip contenant le chemin et
le nom du fichier à dézipper.

Je crois bien en être venu à bout en ajoutant simplement en tête du
fichier :

if hasattr(sys,"setdefaultencoding"):
sys.setdefaultencoding('latin-1')
else:
pass


..et j'ai, par exemple, bidouillé une fonction unzip :

def unzip(self, path ):
path=os.path.normpath (path)
sortie=-1
tempexiste=0
try:
archive = ZipFile(path, "r", ZIP_DEFLATED)
names = archive.namelist()
try:
for name in names:
try:
if not (os.path.exists(os.path.dirname(name))):
os.makedirs(os.path.dirname(name))
temp = open(name, "wb")
tempexiste=1
data = archive.read(name)
temp.write(data)
finally:
if tempexiste == 1:
temp.close()
finally:
archive.close()
except (IOError,OSError):
sortie=0
pass
return sortie

Avatar
Hervé Cauwelier
Bonsoir !

zipfile est-il compatible, avec des fichiers dont le nom est en Unicode ?


Tu es sûr que le nom est écrit en unicode, et non codé en UTF-8 ou autre
? Ou que inversement le nom ne doit pas être codé au format du système
de fichier ?

Traceback (most recent call last):
File "D:devPythonzipuni.py", line 7, in ?
z.write(f)
File "C:Python24libzipfile.py", line 412, in write
self.fp.write(zinfo.FileHeader())
File "C:Python24libzipfile.py", line 166, in FileHeader
return header + self.filename + self.extra
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 10:
ordinal not in range(128)


Problème de codage, tu ne maîtrises pas celui de ton code source ou de
tes chaînes. Python n'a rien de mieux que ASCII pour coder ta chaîne. Et
comme il y a des caractères qui sortent d'ASCII...

Je suggère une bonne mise à niveau sur unicode, string et le codage des
codes source Python.

--
Hervé Cauwelier
http://www.oursours.net/

Avatar
Hervé Cauwelier
if hasattr(sys,"setdefaultencoding"):
sys.setdefaultencoding('latin-1')
else:
pass


Argh ! ARGH ! Lire la documentation de Python et en première ou deuxièe
ligne, mettre :

# -*- encoding: latin-1 -*-

ou encore :

# -*- encoding: iso-8859-1 -*-

Et utiliser un éditeur capable de comprendre la notion de codage de
caractère, ce qui est un minimum pour un logiciel se prétendant éditeur
de texte. S'il peut détecter lui-même cette ligne, c'est encore mieux.

--
Hervé Cauwelier
http://www.oursours.net/

Avatar
Do Re Mi chel La Si Do
Bonjour !

Je crains que le problème ne soit pas dans le code-source du script.

C'est le NOM DU FICHIER qui est en Cyrillique. Pas le script-source Python,
qui, lui, est en utf-8 (édité avec wScite).

D'ailleurs, si j'ouvre le fichier (f=open...), je n'ai pas de problème.
C'est donc bien DANS zipfile qu'à lieu le problème. Ce que montre la
TraceBack.


Je met le code source, mais je ne suis pas sûr que l'utf-8 passe, sur
usenet...


# -*- coding: utf-8 -*-

import zipfile
z=zipfile.ZipFile("aaa.zip",'w',zipfile.ZIP_DEFLATED)
z.write(u'c:u???.pdf')




@-salutations

MCI
Avatar
Do Re Mi chel La Si Do
Re !

Comme les caractères cyrilliques ne passent pas, j'ai envoyé, en réponse, le
même message en Html.
Je sais que seuls certains pourront le lire ; mais, comment faire ?

@-salutations

Michel Claveau
Avatar
Do Re Mi chel La Si Do
Bonjour !


Je ne peux pas utiliser le latin-1, car le nom du fichier est en cyrillique.
Si je tente d'encoder ce nom en utf-8, c'est l'os.stat, appelé par zipfile
qui ne trouve plus le fichier...
Avec utf-16 également, (un zéro terminal est détecté).

Maintenant, je me demande si le module os accepte des noms de fichier en
unicode...

Je vais faire quelques essais supplémentaires.


@-salutations

Michel Claveau



PS : je fais aussi des serveurs COM en Python. Pas beaucoup, mais de gros...
Avatar
Do Re Mi chel La Si Do
Re


Rien à faire. J'ai bien essayé de décoder en utf-8 (mon script est encodé en
utf-8).
Cela fonctionne pour f=open( pour os.stat( mais pas pour zipfile.

Dommage...


@-salutations

Michel Claveau
Avatar
tiissa
Je met le code source, mais je ne suis pas sûr que l'utf-8 passe, sur
usenet...


Je ne sais pas, mais sans les en-tetes 'Content-Type' et
'Content-Transfer-Encoding', ca me semble perdu d'avance.
Peut-etre en regardant du cote des parametres de votre lecteur de news,
si c'est possible ?
Enfin, ce n'est pas important.


# -*- coding: utf-8 -*-

import zipfile
z=zipfile.ZipFile("aaa.zip",'w',zipfile.ZIP_DEFLATED)
z.write(u'c:u???.pdf')


Ce n'est pas vraiment une solution, mais il est peut-etre possible de
creer l'archive dans un fichier temporaire puis de le renommer/deplacer
avec son nom en cyrillique.

Avatar
William Dode
On 24-07-2005, Do Re Mi chel La Si Do wrote:
Bonsoir !

zipfile est-il compatible, avec des fichiers dont le nom est en Unicode ?


Ne me demande pas pourquoi parceque je suis tenu au secret professionel, mais
les fichiers zip sont encodés en cp437, il faut donc encoder le nom en cp437.

Par ex :

# -*- encoding: latin-1 -*-
from zipfile import ZipFile
z = ZipFile("myzip.zip","w")
z.write("ààà",u"ààà".encode("cp437"))
z.close()



Cela fait 1 heure que je tente de créer un fichier compressé, à partir d'un
fichier dont le nom est en cyrillique. Et, au mieux, j'ai la TB suivant :


Traceback (most recent call last):
File "D:devPythonzipuni.py", line 7, in ?
z.write(f)
File "C:Python24libzipfile.py", line 412, in write
self.fp.write(zinfo.FileHeader())
File "C:Python24libzipfile.py", line 166, in FileHeader
return header + self.filename + self.extra
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 10:
ordinal not in range(128)


@-salutations

Michel Claveau






--
William Dodé - http://flibuste.net

Avatar
Do Re Mi chel La Si Do
Bonsoir !

Effectivement, c'est une idée. Disons que ça me permettra d'attendre Python
2.5, et son projet de refonte de ziplib.

Merci.

Michel Claveau
1 2