Tenho uma pasta cheia de arquivos e eles não têm extensão. Como posso verificar os tipos de arquivo? Desejo verificar o tipo de arquivo e alterá-lo de acordo. Vamos supor que uma função filetype(x)
retorne um tipo de arquivo como png
. Eu quero fazer isso:
files = os.listdir(".")
for f in files:
os.rename(f, f+filetype(f))
Como eu faço isso?
python
filesystems
identification
emnoor
fonte
fonte
file types
. Você quer dizer determinar se é um gif, png, bmp ou jpg? Quer apenas saber se é texto / binário? Executável?Respostas:
Existem bibliotecas Python que podem reconhecer arquivos com base em seu conteúdo (geralmente um cabeçalho / número mágico) e que não dependem do nome ou extensão do arquivo.
Se estiver lidando com muitos tipos de arquivos diferentes, você pode usar
python-magic
. Isso é apenas uma ligação Python para amagic
biblioteca bem estabelecida . Isso tem uma boa reputação e (pequeno endosso) no uso limitado que fiz dele, tem sido sólido.Também existem bibliotecas para tipos de arquivos mais especializados. Por exemplo, a biblioteca padrão do Python possui o
imghdr
módulo que faz a mesma coisa apenas para tipos de arquivo de imagem.Se você precisar de verificação de tipo de arquivo livre de dependência (Python puro), consulte
filetype
.fonte
python-magic-win64
funcionou para mim no WindowsA biblioteca Python Magic fornece a funcionalidade de que você precisa.
Você pode instalar a biblioteca
pip install python-magic
e usá-la da seguinte maneira:>>> 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'
O código Python, neste caso, está chamando libmagic por baixo do capô, que é a mesma biblioteca usada pelo
file
comando * NIX . Portanto, isso faz a mesma coisa que as respostas baseadas em subprocesso / shell, mas sem essa sobrecarga.fonte
import magic
mas têm conteúdos incompatíveis. Consulte stackoverflow.com/a/16203777/3189 para obter mais informações.python-magic
biblioteca mais eficiente do que usar abordagens de subprocesso?No Unix e no Linux, existe o
file
comando para adivinhar os tipos de arquivo. Há até uma porta do Windows .Na página de manual :
Você precisaria executar o
file
comando com osubprocess
módulo e, em seguida, analisar os resultados para descobrir uma extensão.editar: Ignore minha resposta. Use a resposta de Chris Johnson .
fonte
file
que fiz muito.# file arc.gif arc.gif: GIF image data, version 89a, 234 x 269
file
comando é que ele é nativo na (maioria?) Distribuições Linux, enquanto opython-magic
não é e deve ser baixado e instalado antes de ser usado. Isso é um tanto problemático se o script que usa o módulo for portátil.No caso de imagens, você pode usar o
imghdr
módulo.>>> 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
fonte
Você também pode instalar a
file
ligação oficial para Python, uma biblioteca chamadafile-magic
(ela não usa ctypes, comopython-magic
).Ele está disponível no PyPI como arquivo mágico e no Debian como python-mágico . Para mim, esta biblioteca é a melhor para usar, pois está disponível no PyPI e no Debian (e provavelmente em outras distribuições), tornando o processo de implantação do seu software mais fácil. Também fiz um blog sobre como usá-lo .
fonte
import subprocess p = sub.Popen('file yourfile.txt', stdout=sub.PIPE, stderr=sub.PIPE) output, errors = p.communicate() print(output)
Como Steven apontou,
subprocess
é o caminho. Você pode obter a saída do comando acima como este post dissefonte
Com a biblioteca de subprocesso mais recente, agora você pode usar o seguinte código (solução apenas * 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
fonte
shlex.split
, por que não apenas corrersubprocess.check_output(['file', '--mime-type', filename])
?também você pode usar este código (python puro por 3 bytes de arquivo de cabeçalho):
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"
fonte
Só funciona para Linux, mas usando o módulo "sh" python você pode simplesmente chamar qualquer comando shell
https://pypi.org/project/sh/
pip instalar sh
Saída: / root / arquivo: texto ASCII
fonte