開業前に拡張子を事前に調べてもらえませんか?このようなアプローチの問題点は、ファイルの種類ごとに異なる方法で判別できることです。たとえば、gzip されたファイルにはヘッダーがある場合とない場合があります。ヘッダーがなければ、ファイルを解凍しようとする以外に、ファイルが gzip されているかどうかを知る実際の方法はありません。それぞれが特定のファイルタイプを探す方法を知っているいくつかのサブメソッドが必要になると思います。例えば、
is_jpeg()
is_tar()
is_gzip()
is_zip()
is_plain()
is_gif
is_fill_in_the_blank()
そして、への呼び出し
get_filetype(fd):
if is_jpeg(fd):
return "jpg"
elif is_tar(fd):
return "tar"
""" etc """
例:
def is_png(fd):
return fd[:4] == '\x89PNG'
def is_jpeg(fd):
return fd[:3] == '\xFF\xD8\xFF'
def is_tar(fd):
"""examine header bytes, or just try to do it"""
# check if timestamp is valid
fd[136:147] == 'a valid timestamp'
fd[156:157] in ('0', '1', '2')
# etc
from tarfile import TarFile, TarError
from StringIO import StringIO
io = StringIO(fd)
try:
tf = TarFile(fileobj=io)
return True
except TarError:
return False
def is_gzip(fd):
import zlib
from StringIO import StringIO
io = StringIO(fd)
for i in range(-15, 16):
try:
dec = zlib.uncompress(io, i)
return True
except:
pass
return False
特定のヘッダー バイトの場所を参照し、それらの式を記述できます。
http://en.wikipedia.org/wiki/Zip_(file_format )
http://www.gzip.org/zlib/rfc-gzip.html
http://en.wikipedia.org/wiki/JPEG
http:// en.wikipedia.org/wiki/Gif
http://en.wikipedia.org/wiki/Portable_Network_Graphics
http://en.wikipedia.org/wiki/Tar_(file_format )