我的文件夹充满了文件,没有扩展名。如何检查文件类型?我想检查文件类型并相应地更改文件名。假设函数filetype(x)
返回的文件类型为png
。我想做这个:
files = os.listdir(".")
for f in files:
os.rename(f, f+filetype(f))
我该怎么做呢?
我的文件夹充满了文件,没有扩展名。如何检查文件类型?我想检查文件类型并相应地更改文件名。假设函数filetype(x)
返回的文件类型为png
。我想做这个:
files = os.listdir(".")
for f in files:
os.rename(f, f+filetype(f))
我该怎么做呢?
file types
。您是说要确定它是gif,png,bmp还是jpg吗?您是否只想知道它是文本还是二进制?可执行的?
Answers:
有一些Python库可以根据文件的内容(通常是标头/幻数)识别文件,并且不依赖文件名或扩展名。
如果要处理许多不同的文件类型,则可以使用python-magic
。那只是完善的magic
库的Python绑定。在我的有限使用中,它具有良好的声誉和(很少认可),它是可靠的。
还有一些用于更专业的文件类型的库。例如,Python标准库具有imghdr
仅针对图像文件类型执行相同操作的模块。
如果需要无依赖项(纯Python)文件类型检查,请参见filetype
。
python-magic-win64
在Windows中对我
在Python的魔术库提供您需要的功能。
您可以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的答案具有相同的作用,但是没有开销。
import magic
但内容不兼容。有关更多信息,请参见stackoverflow.com/a/16203777/3189。
python-magic
库比使用子过程方法更有效率?
file
那么多。 # file arc.gif arc.gif: GIF image data, version 89a, 234 x 269
file
命令的一个好处是,它在(大多数?)Linux发行版中是本机的,而python-magic
不是,并且必须先下载并安装才能使用。如果使用该模块的脚本应该是可移植的,那么这是一个问题。
对于图像,可以使用该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'
您还可以安装file
Python的正式绑定,该库称为file-magic
(不使用ctypes之类的python-magic
)库。
它在PyPI上可作为file-magic使用,在Debian上可作为python-magic使用。对我来说,该库是最适合使用的库,因为它可在PyPI和Debian(以及其他发行版)上使用,从而简化了软件部署过程。我也写了关于如何使用它的博客。
import subprocess
p = sub.Popen('file yourfile.txt', stdout=sub.PIPE, stderr=sub.PIPE)
output, errors = p.communicate()
print(output)
正如史蒂文指出subprocess
的那样。你可以得到上面,因为这的方式输出指令后说
使用更新的子流程库,您现在可以使用以下代码(*仅nix解决方案):
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
shlex.split
为什么不运行而不是使用subprocess.check_output(['file', '--mime-type', filename])
?
您也可以使用以下代码(头文件的3个字节的纯python):
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"
没有安装任何软件包[和更新版本]
仅适用于Linux,但是使用“ sh” python模块,您可以简单地调用任何shell命令
点安装sh
进口sh
sh.file(“ / root / file”)
输出:/ root / file:ASCII文本