listdir no imprime letras que no estén en inglés correctamente

En Python 2.7,

for dir in os.listdir("E:/Library/Documents/Old - Archives/Case"): print dir 

imprime:

 Danny.xlsx Dannyh.xlsx ~$??? ?? ?????? ??? ???? ???????.docx 

mientras esto:

 # using a unicode literal for dir in os.listdir(u"E:/Library/Documents/Old - Archives/Case"): print dir 

imprime:

 Dan.xlsx Dann.xlsx Traceback (most recent call last): File "E:\...\FirstModule.py", line 31, in  print dir File "C:\Python27\lib\encodings\cp1252.py", line 12, in encode return codecs.charmap_encode(input,errors,encoding_table) UnicodeEncodeError: 'charmap' codec can't encode characters in position 2-4: character maps to  

El nombre del archivo está en hebreo, como tal: המסמך.xls

¿Cómo puedo hacer que aparezca en hebreo en Python también?

La versión con u'' cadena literal funciona bien: pregunte con un nombre de ruta Unicode y obtendrá un nombre de ruta Unicode en respuesta, lo que le permite trabajar con nombres de archivo que incluyen caracteres fuera de la página de códigos actual.

Su problema proviene únicamente de intentar print el nombre del archivo. Obtener una salida de Unicode a la solicitud de comando de Windows es una prueba.

La función de impresión de la biblioteca estándar de C predeterminada está limitada a la página de códigos de configuración regional. A menos que llame directamente a la función Win32 API WriteConsoleW (con ctypes), nunca obtendrá un soporte confiable de Unicode para la consola; e incluso entonces no funcionará a menos que se elija una fuente no predeterminada adecuada. Esto afecta a casi todas las herramientas de línea de comandos no nativas, no solo a Python.

El problema es que la consola de salida utiliza una encoding cp1252 según su mensaje de error, y el hebreo no se puede imprimir con esa encoding. Use un IDE que admita UTF-8 y una fuente en ese IDE que sea compatible con el hebreo y funcionará correctamente cuando use os.listdir con una ruta Unicode.

Aquí hay un ejemplo del IDE de PythonWin con y sin una ruta Unicode.

 PythonWin 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32. Portions Copyright 1994-2008 Mark Hammond - see 'Help/About PythonWin' for further copyright information. >>> import os >>> for f in os.listdir('.'): ... print f ... x.exe x.py x.pyc y.py ?????.xls >>> for f in os.listdir(u'.'): ... print f ... x.exe x.py x.pyc y.py המסמך.xls 

También tenga en cuenta que una statement de encoding en su archivo fuente no hace nada para generar resultados. Solo declara en qué encoding se guarda el archivo de origen, lo que afecta la capacidad de escribir caracteres que no son ASCII en el archivo de origen .

Resuelto: # -*- coding: utf-8 -*- en la parte superior del documento resuelto.