100

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

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

どうすればいいですか?

4

10 に答える 10

107

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

多くの異なるファイル タイプに対処している場合は、python-magic. magicこれは、確立されたライブラリの単なる Python バインディングです。これは評判が良く、(小さな裏書)私が作った限られた用途では、しっかりしています.

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

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

于 2012-06-07T18:43:54.497 に答える
10

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

マニュアルページから:

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

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

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

于 2012-06-07T18:12:45.557 に答える
6

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

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

于 2016-08-05T00:43:29.493 に答える
6
import subprocess as sub
p = sub.Popen('file yourfile.txt', stdout=sub.PIPE, stderr=sub.PIPE)
output, errors = p.communicate()
print(output)

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

于 2012-06-07T18:25:01.373 に答える
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
于 2014-06-06T03:14:02.823 に答える