Mam folder pełen plików i nie mają one rozszerzenia. Jak mogę sprawdzić typy plików? Chcę sprawdzić typ pliku i odpowiednio zmienić nazwę pliku. Załóżmy, że funkcja filetype(x)
zwraca typ pliku, taki jak png
. Chce to zrobić:
files = os.listdir(".")
for f in files:
os.rename(f, f+filetype(f))
Jak mam to zrobic?
python
filesystems
identification
emnoor
źródło
źródło
file types
. Masz na myśli określenie, czy jest to gif, png, bmp czy jpg? Czy chcesz tylko wiedzieć, czy jest to tekst / plik binarny? Wykonywalne?Odpowiedzi:
Istnieją biblioteki Pythona, które potrafią rozpoznawać pliki na podstawie ich zawartości (zwykle nagłówek / numer magiczny) i które nie opierają się na nazwie ani rozszerzeniu pliku.
Jeśli adresujesz wiele różnych typów plików, możesz użyć
python-magic
. To tylko powiązanie Pythona z dobrze znanąmagic
biblioteką. Ma dobrą reputację i (niewielka aprobata) w ograniczonym zakresie, w jakim go wykorzystałem, był solidny.Istnieją również biblioteki dla bardziej wyspecjalizowanych typów plików. Na przykład standardowa biblioteka Pythona ma
imghdr
moduł, który robi to samo tylko dla typów plików obrazów.Jeśli potrzebujesz sprawdzania typu plików bez zależności (czysty Python), zobacz
filetype
.źródło
python-magic-win64
działał dla mnie w systemie WindowsBiblioteka Python Magic zapewnia potrzebną funkcjonalność.
Możesz zainstalować bibliotekę
pip install python-magic
i używać jej w następujący sposób:>>> 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'
Kod Pythona w tym przypadku wywołuje libmagic pod maską, która jest tą samą biblioteką, której używa
file
polecenie * NIX . Tak więc robi to to samo, co odpowiedzi oparte na podprocesie / powłoce, ale bez tego narzutu.źródło
import magic
ale mają niezgodną zawartość. Więcej informacji znajdziesz na stackoverflow.com/a/16203777/3189 .python-magic
biblioteka jest bardziej wydajna niż stosowanie podejść podprocesowych?W systemach Unix i Linux istnieje
file
polecenie odgadywania typów plików. Jest nawet port Windows .Od strony man :
Trzeba by uruchomić
file
polecenie zsubprocess
modułem, a następnie przeanalizować wyniki, aby znaleźć rozszerzenie.edycja: Ignoruj moją odpowiedź. Skorzystaj Chrisa Johnsona odpowiedź zamiast.
źródło
file
że zrobiłem tyle.# file arc.gif arc.gif: GIF image data, version 89a, 234 x 269
file
polecenia jest to, że jest natywna w (większości?) Dystrybucjach Linuksa, podczas gdypython-magic
nie jest i musi zostać pobrana i zainstalowana przed użyciem. Jest to pewien problem, jeśli skrypt używający modułu ma być przenośny.W przypadku obrazów można skorzystać z
imghdr
modułu.>>> 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'
Python 2 imghdr doc
Python 3 imghdr doc
źródło
Możesz także zainstalować oficjalne
file
powiązanie dla Pythona, bibliotekę o nazwiefile-magic
(nie używa ctypów, takich jakpython-magic
).Jest dostępny na PyPI jako magia plików, a na Debianie jako magia pythona . Dla mnie ta biblioteka jest najlepsza w użyciu, ponieważ jest dostępna na PyPI i na Debianie (i prawdopodobnie w innych dystrybucjach), ułatwiając proces wdrażania oprogramowania. Pisałem też na blogu o tym, jak go używać .
źródło
import subprocess p = sub.Popen('file yourfile.txt', stdout=sub.PIPE, stderr=sub.PIPE) output, errors = p.communicate() print(output)
Jak zauważył Steven,
subprocess
jest droga. Możesz uzyskać dane wyjściowe polecenia w powyższy sposób, jak powiedział ten postźródło
Dzięki nowszej bibliotece podprocesów możesz teraz użyć następującego kodu (tylko rozwiązanie * 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
źródło
shlex.split
, dlaczego nie po prostu uruchomićsubprocess.check_output(['file', '--mime-type', filename])
?możesz również użyć tego kodu (czysty Python przez 3 bajty pliku nagłówkowego):
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"
źródło
Działa tylko dla Linuksa, ale używając modułu Pythona "sh" możesz po prostu wywołać dowolne polecenie powłoki
https://pypi.org/project/sh/
pip install sh
Wyjście: / root / file: tekst ASCII
źródło