Python的os.path阻塞了希伯来文件名

时间:2009-01-30 21:03:25

标签: python internationalization hebrew

我正在编写一个脚本,必须移动一些文件,但遗憾的是os.path看起来并不像国际化。当我有希伯来语命名的文件时,有问题。这是目录内容的屏幕截图:

alt text
(来源:thegreenplace.net

现在考虑一下该代码覆盖此目录中的文件:

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

4 个答案:

答案 0 :(得分:17)

嗯,在some digging之后,似乎在为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)

===>

test_source\ex True
test_source\joe True
test_source\mie.txt True
test_source\__()'''.txt True
test_source\????.txt True

这里有一些重要的观察:

  • 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。

答案 1 :(得分:3)

看起来像是Unicode与ASCII问题 - os.listdir正在返回ASCII字符串列表。

编辑:我在Python 3.0上尝试过,也在XP SP2上,而os.listdir只是省略了希伯来文件名而不是列出它们。

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

  

请注意,当os.listdir()返回时   字符串列表,不能的文件名   被正确解码被省略了   而不是提出UnicodeError。

答案 2 :(得分:1)

它在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'

答案 3 :(得分:0)

问号是当unicode字符无法以特定编码表示时显示的或多或少的通用符号。 Windows下的终端或交互式会话可能使用ASCII或ISO-8859-1等。所以实际的字符串是unicode,但它被转换为????当打印到终端时。这就是为什么它适用于PEZ,使用OSX。