【问题标题】:Get properties of a file whose name contains special (non-ASCII) characters获取名称包含特殊(非 ASCII)字符的文件的属性
【发布时间】:2013-08-22 19:31:22
【问题描述】:

当文件名包含非 ASCII 字符时,我正在使用 python 并且在读取文件属性时遇到了一些问题。

例如,其中一个文件被命名为:

0-Channel-https∺∯∯services.apps.microsoft.com∯browse∯6.2.9200-1∯615∯Channel.dat

当我运行这个时:

list2 = os.listdir('C:\\Users\\James\\AppData\\Local\\Microsoft\\Windows Store\\Cache Medium IL\\0\\')
for data in list2:
    print os.path.getmtime(data) + '\n'

我得到错误:

WindowsError: [Error 123] The filename, directory name, or volume label syntax is incorrect: '0-Channel-https???services.apps.microsoft.com?browse?6.2.9200-1?615?Channel.dat'

我认为它是由特殊字符引起的,因为该代码适用于仅具有 ASCII 字符的其他文件名。

有没有人知道如何查询像这样命名的文件的文件系统属性?

【问题讨论】:

    标签: python filesystems non-ascii-characters


    【解决方案1】:

    如果这是 python 2.x,它是一个编码问题。如果您将 unicode 字符串传递给 os.listdir,例如 u'C:\\my\\pathname',它将返回 unicode 字符串并且它们应该具有正确编码的非 ascii 字符。请参阅文档中的 Unicode Filenames

    引用文档:

    os.listdir(),它返回文件名,提出了一个问题:它应该返回文件名的 Unicode 版本,还是应该返回包含编码版本的 8 位字符串? os.listdir() 将同时执行这两项操作,具体取决于您将目录路径提供为 8 位字符串还是 Unicode 字符串。如果您传递 Unicode 字符串作为路径,文件名将使用文件系统的编码进行解码,并返回 Unicode 字符串列表,而传递 8 位路径将返回 8 位版本的文件名。例如,假设默认文件系统编码为 UTF-8,运行以下程序:

    这段代码应该可以工作...

    directory_name = u'C:\\Users\\James\\AppData\\Local\\Microsoft\\Windows Store\\Cache Medium IL\\0\\'
    list2 = os.listdir(directory_name)
    for data in list2:
        print data, os.path.getmtime(os.path.join(directory_name, data))
    

    【讨论】:

    • 感谢您的帮助。它似乎已经解决了这个问题。如果我现在打印文件名,它包含特殊字符,而之前用问号替换它们。现在改为说:WindowsError:[错误2]系统找不到指定的文件:。即使它刚刚从 listdir 函数中收集到它。我肯定最终会弄明白的。再次感谢您的帮助
    • listdir 为您提供相对路径名,您还需要 os.path.join() - 我会更新帖子。我在我的机器上试过你的文件名,它工作正常,所以你必须靠近。
    【解决方案2】:

    当你在 Windows 中时,你应该尝试使用 ntpath 模块而不是 os.path

    from ntpath import getmtime
    

    由于我没有 Windows,因此无法对其进行测试。每个操作系统都有不同的路径约定,因此,Python 为最常见的操作系统提供了特定的模块。

    【讨论】:

    • 不,os.path 只是平台特定版本的别名。在 Windows 上,os.path 是 ntpath。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 2017-08-14
    相关资源
    最近更新 更多