100

我有一个装满文件的文件夹,它们没有扩展名。如何检查文件类型?我想检查文件类型并相应地更改文件名。让我们假设一个函数filetype(x)返回一个文件类型,如png. 我想做这个:

files = os.listdir(".")
for f in files:
    os.rename(f, f+filetype(f))

我该怎么做呢?

4

10 回答 10

107

有一些 Python 库可以根据文件的内容(通常是标题/幻数)识别文件,并且不依赖文件名或扩展名。

如果您要处理许多不同的文件类型,则可以使用python-magic. 这只是完善的magic库的 Python 绑定。这在我对它的有限使用中享有良好的声誉和(少量的认可),它一直很稳固。

还有一些用于更专业文件类型的库。例如,Python 标准库有一个imghdr模块,它只对图像文件类型做同样的事情。

如果您需要无依赖(纯 Python)文件类型检查,请参阅filetype.

于 2012-06-07T18:43:54.497 回答
71

Python Magic库提供了您需要的功能。

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,它与 *NIXfile命令使用的库相同。因此,这与基于子进程/shell 的答案的作用相同,但没有这种开销。

于 2014-06-26T14:51:07.383 回答
10

在 unix 和 linux 上有file猜测文件类型的命令。甚至还有一个windows 端口

手册页

File 测试每个参数以尝试对其进行分类。共有三组测试,按此顺序执行:文件系统测试、幻数测试和语言测试。第一个成功的测试会导致打印文件类型。

您需要file使用模块运行命令,subprocess然后解析结果以找出扩展名。

编辑: 忽略我的回答。改用克里斯约翰逊的答案

于 2012-06-07T18:12:45.557 回答
9

对于图像,您可以使用该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 文档

于 2014-10-07T16:00:53.270 回答
6
import subprocess as sub
p = sub.Popen('file yourfile.txt', stdout=sub.PIPE, stderr=sub.PIPE)
output, errors = p.communicate()
print(output)

正如史蒂文指出的那样,subprocess这就是方法。您可以通过上面的方式获取命令输出,如这篇文章所说

于 2012-06-07T18:25:01.373 回答
6

您还可以安装filePython 的官方绑定,一个名为file-magic(它不使用 ctypes,如python-magic)的库。

它在 PyPI 上以file-magic的形式提供,在 Debian 上以python-magic的形式提供。对我来说,这个库是最好用的,因为它可以在 PyPI 和 Debian(可能还有其他发行版)上使用,使部署软件的过程更容易。我也写过关于如何使用它的博客

于 2016-08-05T00:43:29.493 回答
4

使用较新的子流程库,您现在可以使用以下代码(*nix only 解决方案):

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
于 2014-06-06T03:14:02.823 回答
1

您也可以使用此代码(纯 python 的 3 字节头文件):

full_path = os.path.join(MEDIA_ROOT, pathfile)

try:
    image_data = open(full_path, "rb").read()
except IOError:
    return "Incorrect Request :( !!!"

header_byte = image_data[0:3].encode("hex").lower()

if header_byte == '474946':
    return "image/gif"
elif header_byte == '89504e':
    return "image/png"
elif header_byte == 'ffd8ff':
    return "image/jpeg"
else:
    return "binary file"

没有任何软件包安装[和更新版本]

于 2019-07-06T10:36:39.670 回答
0

仅适用于 Linux,但使用“sh”python 模块,您可以简单地调用任何 shell 命令

https://pypi.org/project/sh/

点安装 sh

进口sh

sh.file("/root/文件")

输出:/root/file:ASCII 文本

于 2019-02-02T18:45:16.407 回答
0

此代码以递归方式列出给定文件夹中给定扩展名的所有文件

import magic
import glob
from os.path import isfile

ROOT_DIR = 'backup'
WANTED_EXTENSION = 'sqlite'

for filename in glob.iglob(ROOT_DIR + '/**', recursive=True):
    if isfile(filename):
        extension = magic.from_file(filename, mime = True)
        if WANTED_EXTENSION in extension:
            print(filename)

https://gist.github.com/izmcm/6a5d6fa8d4ec65fd9851a1c06c8946ac

于 2021-08-30T21:28:54.963 回答