Gérer les fichiers zip avec des noms de fichiers japonais dans Python 3

Les spécifications récentes permettent aux fichiers zip de stocker les noms de fichiers en UTF-8, mais dans de nombreux cas, le code de caractère hérité dépendant de l'environnement est utilisé pour stocker les noms de fichiers. Dans le cas du japonais, Shift-JIS (cp932) est souvent utilisé selon Windows.

Dans Python 2, le nom de fichier renvoyé par le module zipfile était une chaîne d'octets, donc le nom de fichier de cp932 était retourné tel quel, mais dans Python 3, la chaîne de caractères était unifiée en Unicode, donc lorsque le fichier zip est lu, le nom de fichier est décodé. Il sera renvoyé sous forme de chaîne de caractères. Cependant, bien sûr, les coutumes japonaises ne sont pas le comportement par défaut, de sorte que les caractères seront brouillés tels quels.

Quand j'ai lu le module zipfile Python 3.4, il ressemblait à ceci:

            if flags & 0x800:
                # UTF-8 file names extension
                filename = filename.decode('utf-8')
            else:
                # Historical ZIP filename encoding
                filename = filename.decode('cp437')

Une erreur UnicodeDecodeError ne se produirait-elle pas lors du décodage d'une chaîne codée cp932?

>>> len(bytes(range(256)).decode('cp437'))
256

cp437 semble décoder tous les octets un à un par caractère. Donc, il semble bon de ré-encoder avec cp437, puis de décoder à nouveau avec cp932.

import zipfile
zf = zipfile.ZipFile('foo.zip')
for name in zf.namelist():
    print(name.encode('cp437').decode('cp932')

Recommended Posts

Gérer les fichiers zip avec des noms de fichiers japonais dans Python 3
Extraire récursivement des fichiers zip avec python
Gérer les fichiers Excel CSV avec Python
Lire des fichiers en parallèle avec Python
Comment gérer le japonais avec Python
[Python] Récupérez les fichiers dans le dossier avec Python
Résoudre l'erreur d'écriture japonaise UnicodeEncodeError dans le fichier Python
Gérez Excel avec python
Manipuler rabbimq avec python
Créer une image avec des caractères avec python (japonais)
Encodage de caractères lors du traitement de fichiers en Python 3
Gérer le démarquage avec python
Sortie japonaise avec Python
Extraire le zip avec Python (prend en charge les noms de fichiers japonais)
[Python] Comment gérer les caractères japonais avec openCV
Convertissez l'image au format .zip en PDF avec Python
Sortie japonaise lors de l'utilisation de python dans Visual Studio
Gérer les données ambiantes en Python
Envoyer du courrier japonais avec Python3
J'ai écrit python en japonais
Grattage au sélénium en Python
Exploitez LibreOffice avec Python
Grattage avec chromedriver en python
Débogage avec pdb en Python
Gérer les variables d'environnement en Python
Gérer les sons en Python
Tri des fichiers image avec Python (2)
Grattage avec du sélénium en Python
Trier de gros fichiers avec python
Tri des fichiers image avec Python (3)
Grattage avec Tor en Python
[Astuces] Gérez Athena avec Python
Tweet avec image en Python
Tri des fichiers image avec Python
Combiné avec ordinal en Python
Analyse morphologique japonaise avec Python
Intégrez des fichiers PDF avec Python
Lire des fichiers .txt avec Python
Je comprends Python en japonais!
Travailler avec des fichiers JSON dans Matlab
Gérer les nombres complexes en Python
Obtenez des synonymes japonais avec Python
[R] [Python] Memo pour lire plusieurs fichiers csv dans plusieurs fichiers zip
Mettez en place le géocodage inversé en japonais avec l'API Python Google Maps
Reconnaissance des nombres dans les images avec Python
Translocation de fichiers CSV avec Python Partie 1
Gérez les clés Base91 avec python + redis.
Tester avec des nombres aléatoires en Python
GOTO en Python avec Sublime Text 3
Travailler avec LibreOffice en Python: import
Manipulation des fichiers EAGLE .brd avec Python
Analyse CSS avec cssutils en Python
Gérez facilement les listes avec python + sqlite3
Manipuler des fichiers et des dossiers en Python
[Python] Fichiers wav POST avec requêtes [POST]
Gérer les files d'attente de messages posix en python
Gérez les données au format NetCDF avec Python
Numer0n avec des objets fabriqués avec Python
Gérez le format GDS II avec Python
Gestion des fichiers JSON en Python