ファイルがいっぱいのフォルダーがありますが、これらには拡張子がありません。ファイルの種類を確認するにはどうすればよいですか?ファイルの種類を確認し、それに応じてファイル名を変更します。関数filetype(x)
がpng
のようなファイルタイプを返すと仮定しましょう。私はこれをしたい:
files = os.listdir(".")
for f in files:
os.rename(f, f+filetype(f))
どうすればいいですか?
内容(通常はヘッダー/マジックナンバー)に基づいてファイルを認識でき、ファイル名や拡張子に依存しないPythonライブラリがあります。
さまざまな種類のファイルに対応している場合は、 python-magic
を使用できます。これは、定評のあるmagic
ライブラリのPythonバインディングにすぎません。これは評判が良く、(小さな支持)私がそれを使った限られた使用で、それは堅実でした。
より特殊なファイルタイプ用のライブラリもあります。たとえば、Python標準ライブラリには imghdr
モジュールがあり、画像ファイルタイプに対してのみ同じことを行います。
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
コマンドで使用されるライブラリと同じです。したがって、これはサブプロセス/シェルベースの回答と同じことを行いますが、そのオーバーヘッドはありません。
UNIXおよびLinuxには、ファイルタイプを推測する file
コマンドがあります。 windows port もあります。
manページ から:
ファイルは、各引数を分類しようとしてテストします。この順序で実行されるテストには、ファイルシステムテスト、マジックナンバーテスト、および言語テストの3つのセットがあります。最初に成功したテストにより、ファイルタイプが出力されます。
file
モジュールでsubprocess
コマンドを実行し、結果を解析して拡張機能を把握する必要があります。
edit:答えを無視します。代わりにChris Johnsonの answer を使用してください。
import subprocess
p = sub.Popen('file yourfile.txt',stdout=sub.PIPE,stderr=sub.PIPE)
output, errors = p.communicate()
print output
Stevenが指摘したように、subprocess
が道です。このように上記の方法でコマンド出力を取得できます post 前述
Pythonの公式file
バインディング、file-magic
と呼ばれるライブラリ(python-magic
などのctypesは使用しません)をインストールすることもできます。
PyPIでは file-magic として、Debianでは python-magic として利用できます。私にとって、このライブラリはPyPIおよびDebian(およびおそらく他のディストリビューション)で利用可能であり、ソフトウェアの展開プロセスを容易にするため、使用するのが最適です。 使用方法についてのブログ記事 も使用しました。
画像の場合、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'
新しいサブプロセスライブラリを使用すると、次のコードを使用できるようになりました(* 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
Linuxでのみ機能しますが、「sh」pythonモジュールを使用すると、任意のシェルコマンドを簡単に呼び出すことができます
pip install sh
インポートsh
sh.file( "/ root/file")
出力:/ root/file:ASCII text
また、このコードを使用することができます(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"
パッケージのインストールなし[および更新バージョン]