如何检查在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