ファイルでいっぱいのフォルダがあり、拡張子がありません。ファイルの種類を確認するにはどうすればよいですか?ファイルの種類を確認し、それに応じてファイル名を変更したいと思います。関数filetype(x)
がのようなファイルタイプを返すと仮定しましょうpng
。私はこれをしたい:
files = os.listdir(".")
for f in files:
os.rename(f, f+filetype(f))
どうすればよいですか?
ファイルでいっぱいのフォルダがあり、拡張子がありません。ファイルの種類を確認するにはどうすればよいですか?ファイルの種類を確認し、それに応じてファイル名を変更したいと思います。関数filetype(x)
がのようなファイルタイプを返すと仮定しましょうpng
。私はこれをしたい:
files = os.listdir(".")
for f in files:
os.rename(f, f+filetype(f))
どうすればよいですか?
file types
。gif、png、bmp、jpgのどれであるかを判断するという意味ですか?それがテキスト/バイナリかどうかを知りたいだけですか?実行可能?
回答:
コンテンツ(通常はヘッダー/マジックナンバー)に基づいてファイルを認識でき、ファイル名や拡張子に依存しないPythonライブラリがあります。
多くの異なるファイルタイプに対応している場合は、を使用できますpython-magic
。これは、定評のあるmagic
ライブラリのPythonバインディングにすぎません。これは評判が良く、(少しの支持もありますが)私が作った限られた用途では、堅実です。
より特殊なファイルタイプ用のライブラリもあります。たとえば、Python標準ライブラリには、imghdr
画像ファイルタイプに対してのみ同じことを行うモジュールがあります。
依存関係のない(純粋なPython)ファイルタイプチェックが必要な場合は、を参照してくださいfiletype
。
python-magic-win64
Windowsで私のために働いた
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
コマンドで使用されるのと同じライブラリです。したがって、これはサブプロセス/シェルベースの回答と同じことを行いますが、そのオーバーヘッドはありません。
import magic
互換性のない内容です。詳細については、stackoverflow.com / a / 16203777/3189を参照してください。
python-magic
サブプロセスアプローチを使用するよりもライブラリを効率的にする理由は何ですか?
UNIXとLinuxには、file
ファイルタイプを推測するコマンドがあります。Windowsポートもあります。
マニュアルページから:
ファイルは、各引数を分類するためにテストします。この順序で実行されるテストには、ファイルシステムテスト、マジックナンバーテスト、言語テストの3つのセットがあります。成功した最初のテストにより、ファイルタイプが出力されます。
モジュールを使用file
してコマンドを実行しsubprocess
、結果を解析して拡張機能を見つける必要があります。
編集: 私の答えを無視します。代わりに、ChrisJohnsonの回答を使用してください。
file
あまり気づかなかった。 # file arc.gif arc.gif: GIF image data, version 89a, 234 x 269
file
コマンドを使用する利点の1つは、(ほとんど?)Linuxディストリビューションでネイティブであるのに対し、そうでpython-magic
はなく、使用する前にダウンロードしてインストールする必要があることです。モジュールを使用するスクリプトが移植可能であると想定される場合、これは多少問題になります。
画像の場合は、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'
file
Pythonの公式バインディングであると呼ばれるライブラリをインストールすることもできますfile-magic
(のようにctypesを使用しませんpython-magic
)。
PyPIではfile-magicとして、Debianではpython-magicとして利用できます。私にとって、このライブラリはPyPIとDebian(およびおそらく他のディストリビューション)で利用可能であり、ソフトウェアの展開プロセスを容易にするため、使用するのに最適です。私がしました、それを使用する方法についてブログにも、。
import subprocess
p = sub.Popen('file yourfile.txt', stdout=sub.PIPE, stderr=sub.PIPE)
output, errors = p.communicate()
print(output)
スティーブンが指摘したように、それsubprocess
が方法です。この投稿が言ったように、上記の方法でコマンド出力を取得できます
新しいサブプロセスライブラリでは、次のコードを使用できるようになりました(* 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
shlex.split
、実行しないのはなぜsubprocess.check_output(['file', '--mime-type', filename])
ですか?
また、このコードを使用することもできます(ヘッダーファイルの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"
パッケージのインストールなし[およびアップデートバージョン]
Linuxでのみ機能しますが、「sh」pythonモジュールを使用すると、任意のシェルコマンドを呼び出すことができます。
pip install sh
インポートsh
sh.file( "/ root / file")
出力:/ root / file:ASCIIテキスト