web-dev-qa-db-ja.com

Pythonで拡張子のないファイルの種類を確認するにはどうすればよいですか?

ファイルがいっぱいのフォルダーがありますが、これらには拡張子がありません。ファイルの種類を確認するにはどうすればよいですか?ファイルの種類を確認し、それに応じてファイル名を変更します。関数filetype(x)pngのようなファイルタイプを返すと仮定しましょう。私はこれをしたい:

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

どうすればいいですか?

65
emnoor

内容(通常はヘッダー/マジックナンバー)に基づいてファイルを認識でき、ファイル名や拡張子に依存しないPythonライブラリがあります。

さまざまな種類のファイルに対応している場合は、 python-magic を使用できます。これは、定評のあるmagicライブラリのPythonバインディングにすぎません。これは評判が良く、(小さな支持)私がそれを使った限られた使用で、それは堅実でした。

より特殊なファイルタイプ用のライブラリもあります。たとえば、Python標準ライブラリには imghdr モジュールがあり、画像ファイルタイプに対してのみ同じことを行います。

70
Chris Johnson

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 を呼び出しています。これは、* NIX fileコマンドで使用されるライブラリと同じです。したがって、これはサブプロセス/シェルベースの回答と同じことを行いますが、そのオーバーヘッドはありません。

54
Richard

UNIXおよびLinuxには、ファイルタイプを推測する file コマンドがあります。 windows port もあります。

manページ から:

ファイルは、各引数を分類しようとしてテストします。この順序で実行されるテストには、ファイルシステムテスト、マジックナンバーテスト、および言語テストの3つのセットがあります。最初に成功したテストにより、ファイルタイプが出力されます。

fileモジュールでsubprocessコマンドを実行し、結果を解析して拡張機能を把握する必要があります。

edit:答えを無視します。代わりにChris Johnsonの answer を使用してください。

10
import subprocess
p = sub.Popen('file yourfile.txt',stdout=sub.PIPE,stderr=sub.PIPE)
output, errors = p.communicate()
print output

Stevenが指摘したように、subprocessが道です。このように上記の方法でコマンド出力を取得できます post 前述

7
xvatar

Pythonの公式fileバインディング、file-magicと呼ばれるライブラリ(python-magicなどのctypesは使用しません)をインストールすることもできます。

PyPIでは file-magic として、Debianでは python-magic として利用できます。私にとって、このライブラリはPyPIおよびDebian(およびおそらく他のディストリビューション)で利用可能であり、ソフトウェアの展開プロセスを容易にするため、使用するのが最適です。 使用方法についてのブログ記事 も使用しました。

6
Álvaro Justen

画像の場合、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 doc
Python 3 imghdr doc

4
Lewis Diamond

新しいサブプロセスライブラリを使用すると、次のコードを使用できるようになりました(* 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
4
berniey

Linuxでのみ機能しますが、「sh」pythonモジュールを使用すると、任意のシェルコマンドを簡単に呼び出すことができます

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

pip install sh

インポートsh

sh.file( "/ root/file")

出力:/ root/file:ASCII text

1

また、このコードを使用することができます(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"

パッケージのインストールなし[および更新バージョン]

0
evergreen