python magic无法识别unicode文件名

Pru*_*Raj 3 python unicode

在我的小项目中,我必须确定目录中的文件类型.所以我选择了python-magic模块并执行了以下操作:

from Tkinter import Tk
from tkFileDialog import askdirectory

def getDirInput():
    root = Tk()
    root.withdraw()
    return askdirectory()
di = getDirInput()
print('Selected Directory: ' + di)
for f in os.listdir(di):
    m = magic.Magic(magic_file='magic')
    print 'Type of ' + f + '  -->  ' + m.from_file(f)
Run Code Online (Sandbox Code Playgroud)

但是python-magic当我将它传递给from_file()函数时,似乎无法获取unicode文件名.这是一个示例输出:

Selected Directory: C:/Users/pruthvi/Desktop/vidrec/temp
Type of log.txt  -->  ASCII English text, with very long lines, with CRLF, CR line terminators
Type of TAEYEON ??_ I (feat. Verbal Jint)_Music Video.mp4  -->  cannot open `TAEYEON \355\234\227_ I (feat. Verbal Jint)_Music Video.mp4' (No such file or directory)
Type of test.py  -->  a python script text executable
Run Code Online (Sandbox Code Playgroud)

您可以观察到python-magic无法识别第二个文件的类型,TAEYEON...因为它中包含unicode字符.它显示了??字符,\355\234\227而我在两种情况下都通过了相同的字符.如何解决此问题并找到带有Unicode字符的文件类型?谢谢

bob*_*nce 5

但似乎python-magic无法获取unicode文件名

正确.实际上,Windows上的大多数跨平台软件都无法处理文件名中的非ASCII字符.

这是因为C标准库对所有文件名使用字节字符串,但Windows使用Unicode字符串(技术上,UTF-16代码单元字符串,但这里的区别并不重要).当使用C标准库的软件通过基于字节的字符串打开文件时,MS C运行时使用依赖于Windows的区域设置的编码(容易混淆的'ANSI'代码页)自动将其转换为Unicode字符串安装.您的ANSI代码页可能是1252,无法对韩文字符进行编码,因此无法使用该文件名.遗憾的是,ANSI代码页从来没有像UTF-8那样合理,因此它永远不会包含所有可能的Unicode字符.

Python的特殊之处在于它对Windows Unicode文件名有额外的支持,它绕过C标准库并直接为Unicode文件名调用底层的Win32 API.所以你可以使用eg传递一个unicode字符串open(),它适用于所有文件名.

然而python-magic,from_file调用不会从Python打开文件.相反,它将文件名传递给libmagic用纯C编写的库.libmagic没有Unicode的特殊Windows文件名代码路径,因此失败.

我建议你自己从Python打开文件,然后使用magic.from_buffer.