gzip または bzip2 形式のプレーンな圧縮ファイル (.gz など) と gzip または bzip2 で圧縮された tarball (.tar.gz など) を区別する適切な方法は何ですか? サフィックス拡張子を使用した識別は信頼できるオプションではありませんファイルの名前が変更される可能性があるためです。
コマンドラインで、次のようなことができるようになりました。
bzip2 -dc test.tar.bz2 |head|file -
そこで、次の関数を使用して Python で同様のことを試みました。
def get_magic(self, store_file, buffer=False, look_deeper=False):
# see what we're indexing
if look_deeper == True:
m = magic.Magic(mime=True, uncompress=True)
else:
m = magic.Magic(mime=True)
if buffer == False:
try:
file_type = m.from_file(store_file)
except Exception, e:
raise e
else:
try:
file_type = m.from_buffer(store_file)
except Exception, e:
raise e
return file_type
次に、圧縮された tarball を読み取ろうとするときに、次の方法で別の場所からバッファを渡します。
file_buffer = open(file_name).read(8096)
archive_check = self.get_magic(file_buffer, True, True)
残念ながら、これは python-magic でuncompressフラグを使用すると問題になります。なぜなら、python-magic は、バッファを読み取るだけでよいのに、ファイル全体を渡すことを期待しているように見えるからです。私は例外で終わります:
bzip2 ERROR: Compressed file ends unexpectedly
私が見ているファイルのサイズが 2M から 20GB になる可能性があるため、これはかなり問題になります。ファイル全体を読みたくありません。
ハッキングして圧縮ファイルの末尾を切り取ってバッファに追加することはできますか? python-magic を使用してファイルを圧縮解除するという考えを無視し、代わりにバッファを渡して識別する前に実行する方がよいでしょうか:
file_buffer = open(file_name, "r:bz2").read(8096)
より良い方法はありますか?