代码之家  ›  专栏  ›  技术社区  ›  Eli Bendersky

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

  •  14
  • Eli Bendersky  · 技术社区  · 17 年前

    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 回复  |  直到 7 年前
        1
  •  17
  •   Eli Bendersky    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衍生产品一样)商店 所有
    • os.listdir os.walk )应该传递一个unicode字符串,以便正确使用unicode路径。以下是上述链接中的一句话:

    提出了一个问题:它是否应该返回 它应该返回8位字符串吗 包含编码版本? os.listdir()将同时执行这两项操作,具体取决于 关于您是否提供了目录 路径为8位字符串或Unicode 弦。如果传递Unicode字符串 作为路径,文件名将被解码 使用文件系统的编码和 Unicode字符串列表将是 将返回8位版本的

    • 最后, print
        2
  •  3
  •   Kiv    17 年前

    os.listdir

    编辑:我在Python 3.0和XP SP2上都试过了 os.listdir 只是省略了希伯来语文件名,而根本没有列出它们。

    请注意,当os.listdir()返回一个 不能使用的字符串和文件名列表 正确解码的内容被省略 而不是引发UnicodeError。

        3
  •  1
  •   PEZ    17 年前

    在OS X上使用Python 2.5.1时,它的工作原理非常棒:

    subdir/bar.txt True
    subdir/foo.txt True
    subdir/עִבְרִית.txt True
    

    编辑:我还尝试使用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'
    
        4
  •  0
  •   DNS    17 年前