小编典典

Python的os.path希伯来语文件名令人窒息

python

我正在编写一个脚本,该脚本必须四处移动一些文件,但是不幸的是,它似乎os.path与国际化的结合程度不是很好。当我使用希伯来语命名的文件时,出现了问题。这是目录内容的屏幕截图:

替代文字
(来源: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


阅读 209

收藏
2021-01-20

共1个答案

小编典典

嗯,经过一番挖掘之后,似乎在为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。
2021-01-20