在我的小项目中,我必须确定目录中的文件类型。所以我选择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字符的文件类型?谢谢
答案 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