¿Cómo comprobar el tipo de archivos sin extensiones en python?

Tengo una carpeta llena de archivos y estos no tienen una extensión. ¿Cómo puedo verificar los tipos de archivos? Quiero comprobar el tipo de archivo y cambiar el nombre del archivo en consecuencia. Asummos que una función filetype(x) devuelve un tipo de archivo como png . Quiero hacer esto:

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

¿Cómo hago esto?

Hay bibliotecas de Python que pueden reconocer archivos según su contenido (generalmente un encabezado / número mágico) y que no dependen del nombre o la extensión del archivo.

Si te estás dirigiendo a muchos tipos de archivos diferentes, puedes usar python-magic . Eso es solo un enlace de Python para la biblioteca de magic bien establecida. Esto tiene una buena reputación y (pequeño respaldo) en el uso limitado que he hecho de ella, ha sido sólido.

También hay bibliotecas para tipos de archivos más especializados. Por ejemplo, la biblioteca estándar de Python tiene el módulo imghdr que hace lo mismo solo para los tipos de archivos de imagen.

La biblioteca de Python Magic proporciona la funcionalidad que necesitas.

Puede instalar la biblioteca con pip install python-magic y usarla de la siguiente manera:

 >>> 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' 

El código de Python en este caso está llamando a libmagic debajo del capó, que es la misma biblioteca utilizada por el comando de file * NIX. Por lo tanto, esto hace lo mismo que las respuestas de subproceso / basadas en shell, pero sin esa sobrecarga.

En Unix y Linux existe el comando de file para adivinar los tipos de archivos. Incluso hay un puerto de ventanas .

De la página del manual :

Archivo prueba cada argumento en un bash de clasificarlo. Hay tres conjuntos de pruebas, realizadas en este orden: pruebas de sistemas de archivos, pruebas de números mágicos y pruebas de idiomas. La primera prueba que tiene éxito hace que se imprima el tipo de archivo.

Necesitaría ejecutar el comando de file con el módulo de subprocess y luego analizar los resultados para descubrir una extensión.

editar: Ignorar mi respuesta. Utilice la respuesta de Chris Johnson en su lugar.

 import subprocess p = sub.Popen('file yourfile.txt',stdout=sub.PIPE,stderr=sub.PIPE) output, errors = p.communicate() print output 

Como Steven señaló, el subprocess es el camino. Puede obtener el comando de salida por el camino anterior como dice esta publicación

También puede instalar el enlace de file oficial para Python, una biblioteca llamada file-magic (no usa ctypes, como python-magic ).

Está disponible en PyPI como archivo-magia y en Debian como python-magia . Para mí, esta biblioteca es la mejor para usar ya que está disponible en PyPI y en Debian (y probablemente en otras distribuciones), lo que facilita el proceso de implementación de su software. He blogeado sobre cómo usarlo , también.

Con la nueva biblioteca de subprocesos, ahora puede usar el siguiente código (* solo solución de 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 

En el caso de imágenes, puede utilizar el módulo imghdr.

 >>> 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

Solo funciona para Linux, pero con el módulo “sh” de python puede simplemente llamar a cualquier comando de shell

https://pypi.org/project/sh/

pip instalar sh

importación sh

sh.file (“/ root / file”)

Salida: / root / file: texto ASCII