请问,有人知道 Python 上的 function() 读取用 open() 函数打开的文件,然后返回文件的文件类型吗?
例如:ASCII 文本、.TAR 文件、.ZIP 文件、长文本文件等。
我可以使用子进程模块中的 POPEN 并调用 Linux 的“文件”程序来做到这一点。
但我需要使用 Python 函数来执行此操作,因为该脚本将在 Windows 和 Linux 上运行。
有人知道解决方案吗?
非常感谢!
请问,有人知道 Python 上的 function() 读取用 open() 函数打开的文件,然后返回文件的文件类型吗?
例如:ASCII 文本、.TAR 文件、.ZIP 文件、长文本文件等。
我可以使用子进程模块中的 POPEN 并调用 Linux 的“文件”程序来做到这一点。
但我需要使用 Python 函数来执行此操作,因为该脚本将在 Windows 和 Linux 上运行。
有人知道解决方案吗?
非常感谢!
请参阅以下代码:
python -c 'import mimetypes; print(mimetypes.guess_type("/tmp/l.py", strict=True))'
('text/x-python', None)
试试mimetypes模块。
mimetypes 模块在文件名或 URL 和与文件扩展名关联的 MIME 类型之间进行转换。提供从文件名到 MIME 类型以及从 MIME 类型到文件扩展名的转换。
您不能在打开之前事先检查扩展名吗?任何此类方法的问题在于,将有不同的方法来确定每种类型的文件。例如,gzip 文件可能有也可能没有标题。如果没有标头,您将无法真正知道文件是否经过 gzip 压缩,除非尝试解压缩它。我认为您必须有几个子方法,每个子方法都知道如何查找特定的文件类型。例如,
is_jpeg()
is_tar()
is_gzip()
is_zip()
is_plain()
is_gif
is_fill_in_the_blank()
然后打电话给
get_filetype(fd):
if is_jpeg(fd):
return "jpg"
elif is_tar(fd):
return "tar"
""" etc """
例子:
def is_png(fd):
return fd[:4] == '\x89PNG'
def is_jpeg(fd):
return fd[:3] == '\xFF\xD8\xFF'
def is_tar(fd):
"""examine header bytes, or just try to do it"""
# check if timestamp is valid
fd[136:147] == 'a valid timestamp'
fd[156:157] in ('0', '1', '2')
# etc
from tarfile import TarFile, TarError
from StringIO import StringIO
io = StringIO(fd)
try:
tf = TarFile(fileobj=io)
return True
except TarError:
return False
def is_gzip(fd):
import zlib
from StringIO import StringIO
io = StringIO(fd)
for i in range(-15, 16):
try:
dec = zlib.uncompress(io, i)
return True
except:
pass
return False
您可以参考特定的标头字节位置并为这些位置编写公式:
http://en.wikipedia.org/wiki/Zip_(file_format )
http://www.gzip.org/zlib/rfc-gzip.html
http://en.wikipedia.org/wiki/JPEG
http:// en.wikipedia.org/wiki/Gif
http://en.wikipedia.org/wiki/Portable_Network_Graphics
http://en.wikipedia.org/wiki/Tar_(file_format )
os.path你只是在寻找扩展名。
使用 splitext(路径)
只需安装“Windows 文件”: http: //gnuwin32.sourceforge.net/packages/file.htm - 下载“完整包,源除外”。不要忘记将“文件”路径从 /usr/bin/file 更改为安装,例如 C:/"Program Files (x86)"/GnuWin32/bin/file
我已经将它用于基于 Debian 的 Django 项目并在 Windows 上实现了它,只是为了检查它是否可行(经过一番麻烦后它确实可行:-))。