파일로 가득 찬 폴더가 있는데 확장자가 없습니다. 파일 형식은 어떻게 확인할 수 있습니까? 파일 유형을 확인하고 그에 따라 파일 이름을 변경하고 싶습니다. 함수 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'
답변
file
Python에 대한 공식 바인딩을 설치할 수도 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