Python';s os.path被希伯来文文件名阻塞

Python';s os.path被希伯来文文件名阻塞,python,internationalization,hebrew,Python,Internationalization,Hebrew,我正在编写一个脚本,它必须移动一些文件,但不幸的是,它似乎不能很好地实现国际化。当我有用希伯来语命名的文件时,就会出现问题。以下是目录内容的屏幕截图: files = os.listdir('test_source') for f in files: pf = os.path.join('test_source', f) print pf, os.path.exists(pf) (来源:) 现在考虑这个目录中的文件: files = os.listdir('test_sou

我正在编写一个脚本,它必须移动一些文件,但不幸的是,它似乎不能很好地实现国际化。当我有用希伯来语命名的文件时,就会出现问题。以下是目录内容的屏幕截图:

files = os.listdir('test_source')

for f in files:
    pf = os.path.join('test_source', f)
    print pf, os.path.exists(pf)

(来源:)

现在考虑这个目录中的文件:

files = os.listdir('test_source')

for f in files:
    pf = os.path.join('test_source', f)
    print pf, os.path.exists(pf)
输出为:

test_source\ex True
test_source\joe True
test_source\mie.txt True
test_source\__()'''.txt True
test_source\????.txt False
注意
os.path.exists
认为希伯来文命名的文件根本不存在? 我怎样才能解决这个问题


Windows XP Home SP2上的ActivePython 2.5.2看起来像是Unicode vs ASCII问题-
os.listdir
正在返回ASCII字符串列表

编辑:我在Python3.0上试过,也在XPSP2上试过,并且
os.listdir
只是省略了希伯来文文件名,而没有列出它们

根据文件,这意味着它无法解码:

请注意,当os.listdir()返回 无法删除的字符串、文件名列表 正确地解码是省略的,而不是省略 而不是提出错误


在OS X上使用Python 2.5.1,它就像一个魔咒:

subdir/bar.txt True
subdir/foo.txt True
subdir/עִבְרִית.txt True
也许这意味着这与Windows XP有关

编辑:我还尝试使用unicode字符串来更好地模拟Windows行为:

for f in os.listdir(u'subdir'):
  pf = os.path.join(u'subdir', f)
  print pf, os.path.exists(pf)

subdir/bar.txt True
subdir/foo.txt True
subdir/עִבְרִית.txt True
在终端(os x stock命令提示符应用程序)中,即。使用IDLE仍能正常工作,但无法正确打印文件名。为了确保它确实是unicode,我检查了:

>>>os.listdir(u'listdir')[2]
u'\u05e2\u05b4\u05d1\u05b0\u05e8\u05b4\u05d9\u05ea.txt'
嗯,在向os.listdir提供unicode字符串时,这种方法似乎起作用:

files = os.listdir(u'test_source')

for f in files:

    pf = os.path.join(u'test_source', f)
    print pf.encode('ascii', 'replace'), os.path.exists(pf)
==>

以下是一些重要的观察结果:

  • Windows XP(与所有NT衍生产品一样)以unicode存储所有文件名
  • os.listdir
    (以及类似的函数,如
    os.walk
    )应该传递一个unicode字符串,以便正确使用unicode路径。以下是上述链接中的一段话:
os.listdir(),返回文件名, 提出了一个问题:它是否应该返回 文件名的Unicode版本,或 它应该返回8位字符串吗 包含编码版本? 根据具体情况,os.listdir()将同时执行这两项操作 关于您是否提供了目录 路径为8位字符串或Unicode 一串如果传递一个Unicode字符串 作为路径,文件名将被解码 使用文件系统的编码和 将显示Unicode字符串列表 在传递8位路径时返回 将返回8位版本的 文件名

  • 最后,
    print
    需要ascii字符串,而不是unicode,因此路径必须编码为ascii

问号是在特定编码中无法表示unicode字符时或多或少显示的通用符号。您的终端或Windows下的交互式会话可能正在使用ASCII或ISO-8859-1或其他信息。因此,实际的字符串是unicode,但它被转换为????当打印到终端时。这就是为什么它在使用OSX的PEZ中起作用。

我想我可以尝试一下,但它对我没有帮助,因为我目前无法升级到3.0。我相信2.5应该有一个解决方案,我认为这与Windows以Unicode存储所有文件名的事实有关。看看我自己的部分答案。如果我只是将pf传递给print,它会抛出一个编码异常。我想皮罗一定已经确定了(在对这个问题的另一个答案的评论中)。这是因为stdout.print的编码似乎并不挑剔所有环境中的ascii。请参阅我的答案。打印unicode没有问题:问题可能在于标准输出编码。如果控制台是unicode,则没有问题,否则需要显式编码。这非常好。这意味着,如果打印到具有正确编码集的文件句柄,则可以向报告Windows上的健全文件名。“替换”错误处理程序只是向我发出失败的信号。=)我可以让windoze终端显示unicode吗?OSX做了什么来很好地展示它?