Python – ¿Cómo convertir un nombre de archivo Unicode a CP437?

Tengo un archivo que tiene un nombre Unicode, diga 'קובץ.txt' . Quiero empacarlo, y estoy usando el archivo zip de python .

Puedo comprimir los archivos y abrirlos más tarde con un problema, excepto que los nombres de los archivos están mal al usar el explorador de archivos de Windows 7 para ver los archivos (7zip funciona muy bien).

Según los documentos, este es un problema común, y hay instrucciones sobre cómo lidiar con eso:

Desde ZipFile.write

Nota

No existe una encoding de nombre de archivo oficial para archivos ZIP. Si tiene nombres de archivos Unicode, debe convertirlos a cadenas de bytes en su encoding deseada antes de pasarlos a write (). WinZip interpreta todos los nombres de archivo como codificados en CP437, también conocido como DOS Latin.

Lo siento, pero parece que no entiendo qué debo hacer exactamente con el nombre de archivo. He intentado .encode('CP437') , .decode('CP437') ..

Tendrías que codificar tu cadena Unicode a CP437. Sin embargo, no puede codificar su ejemplo específico porque el códec CP437 no es compatible con el hebreo:

 >>> u'קובץ.txt'.encode('cp437') Traceback (most recent call last): File "", line 1, in  File "/Users/mjpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/encodings/cp437.py", line 12, in encode return codecs.charmap_encode(input,errors,encoding_map) UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-3: character maps to  

El error anterior le dice que los primeros 4 caracteres ( קובץ ) no se pueden codificar porque no hay tales caracteres en el conjunto de caracteres de destino. CP437 solo admite el alfabeto occidental (AZ y caracteres acentuados como ç y é), caracteres de dibujo de línea de IBM (como ╚ y ┤) y algunos símbolos griegos, principalmente para ecuaciones matemáticas (como Σ y φ).

Tendrá que generar un nombre de archivo diferente que solo use caracteres admitidos por el códec CP437 o vivir con el hecho de que WinZip nunca podrá mostrar nombres de archivos hebreos correctamente, y simplemente seguir con el conjunto de caracteres que funcionó para usted con 7zip.

prueba esto

 import zipfile p=b'\xd7\xa7\xd7\x95\xd7\x91\xd7\xa5.txt'.decode('utf8') # or just: # p='קובץ.txt' z=zipfile.ZipFile('test.zip','w') f=z.open(p.encode('utf8').decode('cp437'),'w') f.write(b'hello world') f.close() z.close() 

Lo he probado en un MacOSX, por lo que no es cp437 anterior, pero utf8, y funciona

Espero que esto funcione en windows

He probado la lectura de nombres de archivos chinos con encoding “gbk” o “gb18030” con códigos similares. Y funciona bien.

Cuando tenga un archivo zip desde (o necesite enviarlo a) Mac / Linux, cambie cp437 en el código a utf8 y todo funcionará

Cuando tenga un archivo zip desde (o necesite enviarlo a) Windows, deje cp437 sin cambios