Pythonで拡張子のないファイルの種類を確認する方法は?


87

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

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

どうすればよいですか?



に関してより具体的にする必要がありますfile types。gif、png、bmp、jpgのどれであるかを判断するという意味ですか?それがテキスト/バイナリかどうかを知りたいだけですか?実行可能?
JoeFish 2012年

@ thg435、MIMEタイプを取得したら、それを適切なファイル名拡張子に変換する方法はありますか?
マークランサム2012年

@Mark:はい、guess_extensionを使用しますが、実際には、mimetypeはファイル拡張子に基づいているため、ここでは機能しません。彼らに必要なのはlibmagicです(リンクの2番目の回答を参照してください)。
georg

1
このpypi.org/project/filetypeを試してみませんか?
zx19 8619年

回答:


89

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

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

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

依存関係のない(純粋なPython)ファイルタイプチェックが必要な場合は、を参照してくださいfiletype


2
パッケージには、python-magic-win64Windowsで私のために働いた
ChesuCR

2
ファイルタイプの組み合わせを使用したimghdrは、Windowsで機能しました
HrushikeshDhumal19年

61

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


6
python-magicと呼ばれるdebian / ubuntuパッケージは同じ名前のpipパッケージとは異なることに注意してください。どちらもimport magic互換性のない内容です。詳細については、stackoverflow.com / a / 16203777/3189を参照してください。
ハミッシュダウナー2015

1
@Richardオーバーヘッドの側面について詳しく説明してもよろしいですか?python-magicサブプロセスアプローチを使用するよりもライブラリを効率的にする理由は何ですか?
グレッグ

9

UNIXとLinuxには、fileファイルタイプを推測するコマンドがあります。Windowsポートあります

マニュアルページから:

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

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

編集: 私の答えを無視します。代わりに、ChrisJohnsonの回答を使用してください。


+1fileあまり気づかなかった。 # file arc.gif arc.gif: GIF image data, version 89a, 234 x 269
JoeFish 2012年

まあ、私は誰かがより良い答えを持っていることを望んでいました。OPにはまだ多くの作業があり、単純な関数呼び出しではありません。
Steven Rumbalski 2012年

2
+1fileコマンドを使用する利点の1つは、(ほとんど?)Linuxディストリビューションでネイティブであるのに対し、そうでpython-magicはなく、使用する前にダウンロードしてインストールする必要があることです。モジュールを使用するスクリプトが移植可能であると想定される場合、これは多少問題になります。
ハローグッバイ2014年


6

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

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


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

スティーブンが指摘したように、それsubprocessが方法です。この投稿が言ったように、上記の方法でコマンド出力を取得できます


そして、どのように出力をキャプチャしますか?
マークランサム2012年

@MarkRansom申し訳ありませんが、それは良い方法ではありませんでした。上記の更新をご覧ください
xvatar 2012年

Pythonライブラリを使用する代わりにシステムと対話する必要がある場合、APIが異なる他のオペレーティングシステムでは役に立たない可能性があるため、ほとんどの場合、ソリューションは最適ではありません。
erikbwork 2013

4

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

答えてくれてありがとう。ところで、コマンドラインでstr.split()を使用しないでください。shlex.split(cmd)insteedを使用します。
emnoor 2014

を使用する代わりにshlex.split、実行しないのはなぜsubprocess.check_output(['file', '--mime-type', filename])ですか?
flimm 2016

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"

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


xlsxを確認するにはどうすればよいですか?
Harsha Biyani

4バイトまたは8バイトで使用できます。XLSX(MS Office Open XML形式ドキュメント)=> 50 4B 03 04(4バイト)=> ASCII(PK••)またはXLSX(MS Office 2007ドキュメント)=> 50 4B 03 04 14 00 06 00(8バイト)= > ASCII(PK••••••)
常緑樹

0

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

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

pip install sh

インポートsh

sh.file( "/ root / file")

出力:/ root / file:ASCIIテキスト

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.