3



请问,有人知道 Python 上的 function() 读取用 open() 函数打开的文件,然后返回文件的文件类型吗?

例如:ASCII 文本、.TAR 文件、.ZIP 文件、长文本文件等。

我可以使用子进程模块中的 POPEN 并调用 Linux 的“文件”程序来做到这一点。

但我需要使用 Python 函数来执行此操作,因为该脚本将在 Windows 和 Linux 上运行。

有人知道解决方案吗?

非常感谢!

4

5 回答 5

5

请参阅以下代码:

python -c 'import mimetypes; print(mimetypes.guess_type("/tmp/l.py", strict=True))'
('text/x-python', None)
于 2012-05-29T20:27:57.837 回答
2

试试mimetypes模块。

mimetypes 模块在文件名或 URL 和与文件扩展名关联的 MIME 类型之间进行转换。提供从文件名到 MIME 类型以及从 MIME 类型到文件扩展名的转换。

于 2012-05-29T20:26:18.997 回答
2

您不能在打开之前事先检查扩展名吗?任何此类方法的问题在于,将有不同的方法来确定每种类型的文件。例如,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 )

于 2012-05-29T20:27:59.763 回答
1

os.path你只是在寻找扩展名。

使用 splitext(路径)

于 2012-05-29T20:27:21.663 回答
0

只需安装“Windows 文件”: http: //gnuwin32.sourceforge.net/packages/file.htm - 下载“完整包,源除外”。不要忘记将“文件”路径从 /usr/bin/file 更改为安装,例如 C:/"Program Files (x86)"/GnuWin32/bin/file

我已经将它用于基于 Debian 的 Django 项目并在 Windows 上实现了它,只是为了检查它是否可行(经过一番麻烦后它确实可行:-))。

于 2013-03-06T12:19:04.450 回答