我有一个充满文件的文件夹,而这些文件没有扩展名。如何检查文件类型?我想检查文件类型并相应地更改文件名。假设函数filetype(x)
返回的文件类型为png
。我想这样做:
files = os.listdir(".")
for f in files:
os.rename(f, f+filetype(f))
我该怎么做?
[有些Python库可以根据文件的内容(通常是标头/幻数)识别文件,并且不依赖文件名或扩展名。
如果要处理许多不同的文件类型,则可以使用python-magic
。那只是完善的python-magic
库的Python绑定。在我的有限使用中,它具有良好的声誉和(很少认可),它是可靠的。
还有一些用于更专业文件类型的库。例如,Python标准库具有magic
模块,仅对图像文件类型执行相同的操作。
imghdr
库提供了您需要的功能。
您可以使用imghdr
安装该库,并按以下方式使用它:
Python Magic
在这种情况下,Python代码正在调用内部的pip install python-magic
,该库与* NIX >>> import magic
>>> magic.from_file('iceland.jpg')
'JPEG image data, JFIF standard 1.01'
>>> magic.from_file('iceland.jpg', mime=True)
'image/jpeg'
>>> magic.from_file('greenland.png')
'PNG image data, 600 x 1000, 8-bit colormap, non-interlaced'
>>> magic.from_file('greenland.png', mime=True)
'image/png'
命令使用的库相同。因此,这与基于子进程/基于shell的答案具有相同的作用,但没有开销。
在UNIX和Linux上,有libmagic命令来猜测文件类型。甚至还有file
。
从file
:
文件会测试每个参数以尝试对其进行分类。有三种按此顺序执行的测试集:文件系统测试,幻数测试和语言测试。第一个成功的测试导致要打印的文件类型。
您需要使用file
模块运行windows port命令,然后解析结果以找出扩展名。
edit:忽略我的答案。请改用Chris Johnson的man page。
file
正如史蒂文指出的,subprocess
是方法。您可以通过上面的方式获取命令输出,如[answer说]]
您还可以为Python安装官方的import subprocess
p = sub.Popen('file yourfile.txt',stdout=sub.PIPE,stderr=sub.PIPE)
output, errors = p.communicate()
print output
绑定,这是一个名为subprocess
的库(它不使用ctypes,例如post)。
使用更新的子流程库,您现在可以使用以下代码(*仅nix解决方案):
对于图像,可以使用imghdr模块。
仅适用于Linux,但是使用“ sh” python模块,您可以简单地调用任何shell命令
您也可以使用此代码(由头文件的3个字节组成的纯python):