python magic无法识别unicode文件名

时间:2016-01-17 09:12:00

标签: 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)

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

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

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

2 个答案:

答案 0 :(得分: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标准库并直接调用基础Win32 API以获取Unicode文件名。因此,您可以使用例如open()传递一个unicode字符串,它将适用于所有文件名。

python-magic的{​​{1}}调用无法从Python打开文件。相反,它将文件名传递给以{C}编写的from_file库。libmagic没有Unicode的特殊Windows文件名代码路径,因此失败。

我建议您自己从Python打开文件,然后使用libmagic

答案 1 :(得分:2)

魔术模块的响应似乎表明你的角色在某处被错误地翻译了 - 只显示了一半的字符串而@user.route('/', methods=['POST']) def create(): form = CreateUserForm() if form.validate_on_submit(): user_datastore.create_user(form) 的字节顺序错误 - 它至少应该是

由于这是在Windows上,这会引发UTF-16字节顺序警报铃声。

可以通过编码为UTF-16来解决这个问题。正如其他评论者所建议的那样,您需要在目录前加上前缀。

\355\227\234