0

当文件名包含非 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 字符的其他文件名。

有谁知道查询像这样命名的文件的文件系统属性的方法?

4

2 回答 2

1

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

引用文档:

返回文件名的 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))
于 2013-08-22T19:53:21.300 回答
0

正如您在 Windows 中一样,您应该尝试使用 ntpath 模块而不是 os.path

from ntpath import getmtime

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

于 2013-08-22T19:43:07.687 回答