listdir不能正确打印非英文字母

时间:2012-03-31 10:04:56

标签: python unicode python-2.x

在Python 2.7上,

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

打印出来:

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

虽然:

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

打印出来:

Dan.xlsx
Dann.xlsx

Traceback (most recent call last):
  File "E:\...\FirstModule.py", line 31, in <module>
    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 <undefined>

文件的名称是希伯来语,因此:המסמך.xls

如何在Python中以希伯来语出现?

3 个答案:

答案 0 :(得分:6)

具有u''字符串文字的版本可以正常工作:请求使用Unicode路径名,您将获得响应的Unicode路径名,允许您使用包含当前代码页之外字符的文件名。

您的问题完全来自尝试print文件名。将Unicode输出转换为Windows命令提示符是一个试用版。

默认的C标准库打印功能仅限于区域设置代码页。除非你直接调用Win32 API函数WriteConsoleW(使用ctypes),否则你永远不会获得可靠的控制台Unicode支持;即使这样,除非选择合适的非默认字体,否则它将无效。这几乎影响了所有非本机命令行工具,而不仅仅是Python。

答案 1 :(得分:1)

问题是您的输出控制台根据您的错误消息使用cp1252编码,并且无法在该编码下打印希伯来语。使用支持UTF-8的IDE,以及该IDE中支持希伯来语的字体,当使用带有Unicode路径的os.listdir时,它将正常工作。

以下是PythonWin IDE中带有和不带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

另请注意,源文件中的编码声明 nothing 用于生成输出。 声明保存源文件的编码,这会影响在源文件中编写非ASCII字符的能力

答案 2 :(得分:1)

解决了它:文档顶部的# -*- coding: utf-8 -*-解决了它。