236

たとえば、BLOB などの場所に大量のファイルを保存したいとします。これらのファイルを Web ページ経由で配信し、クライアントが正しいアプリケーション/ビューアを自動的に開くようにしたいとします。

前提: ブラウザーは、HTTP 応答の mime-type (content-type?) ヘッダーによって、使用するアプリケーション/ビューアーを判断します。

その仮定に基づいて、ファイルのバイトに加えて、MIME タイプも保存する必要があります。

ファイルの MIME タイプを調べるにはどうすればよいでしょうか。私は現在 Mac を使用していますが、これは Windows でも動作するはずです。

ファイルを Web ページに投稿するときに、ブラウザーはこの情報を追加しますか?

この情報を見つけるためのきちんとした python ライブラリはありますか? WebService または (さらに良い) ダウンロード可能なデータベース?

4

18 に答える 18

264

toivotuoによって提案された python-magic メソッドは時代遅れです。Python-magic の現在のトランクは Github にあり、そこの readme に基づいて、MIME タイプを見つけると、次のようになります。

# For MIME types
import magic
mime = magic.Magic(mime=True)
mime.from_file("testdata/test.pdf") # 'application/pdf'
于 2010-05-02T12:02:45.380 に答える
111

標準ライブラリのmimetypes モジュールは、ファイル拡張子から MIME タイプを決定/推測します。

ユーザーがファイルをアップロードしている場合、HTTP ポストにはデータとともにファイルの MIME タイプが含まれます。たとえば、Django はこのデータをUploadedFileオブジェクトの属性として使用できるようにします。

于 2008-09-04T12:12:20.690 に答える
51

mimetypes ライブラリを使用するよりも信頼性の高い方法は、python-magic パッケージを使用することです。

import magic
m = magic.open(magic.MAGIC_MIME)
m.load()
m.file("/tmp/document.pdf")

これは、file(1) を使用するのと同じです。

Django では、MIME タイプが UploadedFile.content_type のものと一致することを確認することもできます。

于 2010-01-25T16:39:06.130 に答える
45

これはとても簡単そうです

>>> from mimetypes import MimeTypes
>>> import urllib 
>>> mime = MimeTypes()
>>> url = urllib.pathname2url('Upload.xml')
>>> mime_type = mime.guess_type(url)
>>> print mime_type
('application/xml', None)

古い投稿を参照してください

更新- Python 3 以降のバージョンでは、より便利になりました。

import mimetypes
print(mimetypes.guess_type("sample.html"))
于 2014-02-13T13:09:49.320 に答える
13

13年後...
このページのPython 3に関する回答のほとんどは、時代遅れであるか不完全でした。
私が使用したMIMEタイプを取得するには:

import mimetypes

mt = mimetypes.guess_type("https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf")
if mt:
    print("Mime Type:", mt[0])
else:
    print("Cannot determine Mime Type")

# Mime Type: application/pdf

ライブデモ


Python ドキュメントから:

mimetypes.guess_type( URL厳密 = True )

urlで指定されたファイル名、パス、または URL に基づいてファイルの種類を推測します。URL は、文字列またはパスのようなオブジェクトにすることができます。

戻り値は、タイプが推測できない場合 (接尾辞がないか不明な場合) は type であるタプル、または MIME content-type ヘッダーに使用できる形式(type, encoding)文字列ですNone'type/subtype'

encodingNone、エンコードなし、またはエンコードに使用されるプログラムの名前 (例: compressまたはgzip ) です。エンコーディングは、 Content-Transfer-Encodingヘッダーとしてではなく、 Content-Encodingヘッダーとしての使用に適しています。マッピングはテーブル駆動です。エンコーディング サフィックスは大文字と小文字が区別されます。型サフィックスは、最初に大文字と小文字を区別して試行され、次に大文字と小文字を区別せずに試行されます。

オプションのstrict引数は、既知の MIME タイプのリストを IANA に登録された正式なタイプのみに制限するかどうかを指定するフラグです。strictが(デフォルト) の場合True、IANA タイプのみがサポートされます。strictがの場合False、非標準ではあるが一般的に使用される追加の MIME タイプも認識されます。

バージョン 3.8 で変更:パスのようなオブジェクトである url のサポートが追加されました。

于 2021-02-02T15:08:42.120 に答える
11

libmagic をラップする 3 つの異なるライブラリがあります。

そのうちの 2 つは pypi で利用できます (したがって、pip install は機能します)。

  • ファイルマジック
  • python-マジック

また、python-magic に似たものは、最新の libmagic ソースで直接入手できます。これは、おそらく Linux ディストリビューションに含まれているものです。

Debianでは、パッケージ python-magic はこれに関するものであり、toivotuoが言ったように使用され、Simon Zimmermannが言ったように廃止されていません(IMHO)。

それは私には別の見方のようです(libmagicの元の作者による)。

残念ながら、pypi で直接利用することはできません。

于 2012-09-06T10:22:50.630 に答える
10

python 2.6で:

import shlex
import subprocess
mime = subprocess.Popen("/usr/bin/file --mime " + shlex.quote(PATH), shell=True, \
    stdout=subprocess.PIPE).communicate()[0]
于 2009-11-02T15:48:09.143 に答える
7

使用しているWebサーバーについては述べていませんが、ApacheにはMime Magicと呼ばれる小さなモジュールがあり、指示されたときにファイルの種類を判別するために使用します。ファイルの内容の一部を読み取り、見つかった文字に基づいてファイルのタイプを把握しようとします。そして、Dave Webbが言及したように、拡張機能が便利であれば、PythonでMimeTypesモジュールが機能します。

または、UNIXボックスに座っている場合はsys.popen('file -i ' + fileName, mode='r')、MIMEタイプを取得するために使用できます。Windowsにも同等のコマンドがあるはずですが、それが何であるかはわかりません。

于 2008-09-04T12:22:55.720 に答える
7

@toivotuoの方法は、python3の下で私にとって最も確実に機能しました。私の目標は、信頼できる .gz 拡張子を持たない gzip ファイルを特定することでした。python3-magic をインストールしました。

import magic

filename = "./datasets/test"

def file_mime_type(filename):
    m = magic.open(magic.MAGIC_MIME)
    m.load()
    return(m.file(filename))

print(file_mime_type(filename))

gzip されたファイルの場合、次のものが返されます: application/gzip; 文字セット=バイナリ

解凍された txt ファイル (iostat データ) の場合: text/plain; charset=us-ascii

tar ファイルの場合: application/x-tar; 文字セット=バイナリ

bz2 ファイルの場合: application/x-bzip2; 文字セット=バイナリ

最後になりましたが、私にとっては .zip ファイルです: application/zip; 文字セット=バイナリ

于 2015-02-03T19:09:32.323 に答える
7

Python 3 参照: https://docs.python.org/3.2/library/mimetypes.html

mimetypes.guess_type(url, strict=True) url で指定されたファイル名または URL に基づいてファイルのタイプを推測します。戻り値はタプル (タイプ、エンコーディング) であり、タイプが推測できない場合 (接尾辞がないか不明な場合) はタイプが None であるか、MIME コンテンツ タイプ ヘッダーに使用可能な「タイプ/サブタイプ」形式の文字列です。

encoding は、エンコードなしの場合は None 、またはエンコードに使用されるプログラムの名前 (compress や gzip など) です。エンコーディングは、Content-Transfer-Encoding ヘッダーとしてではなく、Content-Encoding ヘッダーとしての使用に適しています。マッピングはテーブル駆動です。エンコーディング サフィックスは大文字と小文字が区別されます。型サフィックスは、最初に大文字と小文字を区別して試行され、次に大文字と小文字を区別せずに試行されます。

オプションの strict 引数は、既知の MIME タイプのリストを IANA に登録された正式なタイプのみに制限するかどうかを指定するフラグです。strict が True (デフォルト) の場合、IANA タイプのみがサポートされます。strict が False の場合、非標準ではあるが一般的に使用される追加の MIME タイプも認識されます。

import mimetypes
print(mimetypes.guess_type("sample.html"))
于 2019-09-15T05:05:07.720 に答える
3

最初に mimetypes ライブラリを試します。機能しない場合は、代わりに python-magic ライブラリを使用します。

import mimetypes
def guess_type(filename, buffer=None):
mimetype, encoding = mimetypes.guess_type(filename)
if mimetype is None:
    try:
        import magic
        if buffer:
            mimetype = magic.from_buffer(buffer, mime=True)
        else:
            mimetype = magic.from_file(filename, mime=True)
    except ImportError:
        pass
return mimetype
于 2019-05-22T01:18:59.103 に答える
1

mimetypesモジュールは、ファイル拡張子に基づいてファイルタイプを認識するだけです。拡張子のないファイルのファイルタイプを回復しようとすると、mimetypesは機能しません。

于 2012-06-19T12:51:55.647 に答える