[python] 파이썬에서 확장자가없는 파일 유형을 확인하는 방법은 무엇입니까?

파일로 가득 찬 폴더가 있는데 확장자가 없습니다. 파일 형식은 어떻게 확인할 수 있습니까? 파일 유형을 확인하고 그에 따라 파일 이름을 변경하고 싶습니다. 함수 filetype(x)png. 나는 이것을하고 싶다 :

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

어떻게해야합니까?



답변

콘텐츠 (일반적으로 헤더 / 매직 넘버)를 기반으로 파일을 인식 할 수 있고 파일 이름이나 확장자에 의존하지 않는 Python 라이브러리가 있습니다.

다양한 파일 형식을 처리하는 경우 python-magic. 그것은 잘 확립 된 magic라이브러리에 대한 파이썬 바인딩 일뿐 입니다. 이것은 좋은 평판과 (작은 보증) 내가 만든 제한된 사용으로 견고했습니다.

더 전문화 된 파일 유형을위한 라이브러리도 있습니다. 예를 들어 Python 표준 라이브러리에는 imghdr이미지 파일 유형에 대해서만 동일한 작업을 수행하는 모듈이 있습니다.

종속성이없는 (순수 Python) 파일 유형 검사가 필요한 경우 filetype.


답변

파이썬 매직 라이브러리는 당신이 필요로하는 기능을 제공합니다.

pip install python-magic다음과 같이 라이브러리를 설치 하고 사용할 수 있습니다.

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

이 경우 Python 코드 는 * NIX 명령 에서 사용하는 것과 동일한 라이브러리 인 libmagic내부적 으로 호출합니다 file. 따라서 이것은 하위 프로세스 / 쉘 기반 답변과 동일한 작업을 수행하지만 오버 헤드가 없습니다.


답변

유닉스와 리눅스에는 file파일 유형을 추측 하는 명령이 있습니다. 도있다 윈도우 포트 .

로부터 man 페이지 :

파일은 분류하기 위해 각 인수를 테스트합니다. 파일 시스템 테스트, 매직 넘버 테스트 및 언어 테스트의 순서로 수행되는 세 세트의 테스트가 있습니다. 성공한 첫 번째 테스트는 파일 형식이 인쇄되도록합니다.

모듈과 file함께 명령 을 실행 subprocess한 다음 결과를 구문 분석하여 확장을 알아 내야합니다.

편집 : 내 대답을 무시하십시오. 대신 Chris Johnson의 대답을 사용하십시오.


답변

이미지의 경우 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 문서
Python 3 imghdr 문서


답변

filePython에 대한 공식 바인딩을 설치할 수도 file-magic있습니다 (예 : ctypes를 사용하지 않음 python-magic).

PyPI에서는 file-magic으로 , Debian에서는 python-magic으로 사용할 수 있습니다. 저에게이 라이브러리는 PyPI와 Debian (그리고 아마도 다른 배포판)에서 사용할 수 있기 때문에 사용하기에 가장 좋으며 소프트웨어 배포 프로세스를 더 쉽게 만듭니다. 나는 그것을 사용하는 방법에 대해서도 블로그에 올렸다 .


답변

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

Steven이 지적했듯이 subprocess방법입니다. 이 게시물에서 말한 것처럼 위의 방법으로 명령 출력을 얻을 수 있습니다.


답변

최신 하위 프로세스 라이브러리를 사용하면 이제 다음 코드를 사용할 수 있습니다 (* 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