如何检查在Python中没有扩展名的文件types?
我有一个文件夹充满文件,这些没有扩展名。 我怎样才能检查文件types? 我想检查文件types并相应地更改文件名。 让我们假设一个函数filetype(x)
返回像png
这样的文件types。 我想这样做:
files = os.listdir(".") for f in files: os.rename(f, f+filetype(f))
我如何做到这一点?
有些Python库可以根据文件的内容识别文件(通常是头/幻数),而不依赖文件名或扩展名。
如果你正在寻找许多不同的文件types,你可以使用python-magic
。 这对于已经build立的magic
库来说只是一个Python绑定。 这在我用它做的有限使用方面有很好的声誉和(小的认可),它是坚实的。
还有更多专门文件types的库。 例如,Python标准库有imghdr
模块, imghdr
为图像文件types做同样的事情。
Python Magic库提供了您所需要的function。
你可以用pip install python-magic
来安装库,并按如下方式使用它:
>>> 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'
在这种情况下,Python代码正在调用libmagic的引擎之下,这是* NIX file
命令使用的库。 因此,这与基于子stream程/基于shell的答案完全相同,但没有这种开销。
在Unix和Linux上有file
命令来猜测文件types。 甚至有一个Windows端口 。
从手册页 :
文件testing每个参数以尝试对其进行分类。 有三组testing,按此顺序执行:文件系统testing,幻数testing和语言testing。 成功的第一个testing会导致打印文件types。
您将需要运行与subprocess
模块的file
命令,然后parsing结果找出一个扩展名。
编辑:忽略我的答案。 改用Chris Johnson的回答 。
import subprocess p = sub.Popen('file yourfile.txt',stdout=sub.PIPE,stderr=sub.PIPE) output, errors = p.communicate() print output
正如史蒂文指出的那样, subprocess
就是这样。 你可以通过上面的方式获得命令输出,正如这篇文章所说的
你也可以安装Python的官方file
绑定,一个名为file-magic
的库(它不使用ctypes,就像python-magic
)。
它可以在PyPI上以file-magic的forms获得 ,在Debian上以python-magic的forms获得 。 对我来说,这个库是最好用的,因为它可以在PyPI和Debian(以及其他发行版)上使用,从而使得部署软件的过程更加简单。 我也在博客上介绍如何使用它 。
在图像的情况下,您可以使用imghdr模块。
>>> import imghdr >>> imghdr.what('8e5d7e9d873e2a9db0e31f9dfc11cf47') # You can pass a file name or a file object as first param. See doc for optional 2nd param. 'png'
Python 2 imghdr文档
Python 3 imghdr文档
使用更新的subprocess库,现在可以使用以下代码(* nix only解决scheme):
import subprocess import shlex filename = 'your_file' cmd = shlex.split('file --mime-type {0}'.format(filename)) result = subprocess.check_output(cmd) mime_type = result.split()[-1] print mime_type