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


87

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

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

어떻게해야합니까?



에 대해 더 구체적이어야합니다 file types. gif, png, bmp 또는 jpg인지 결정하는 것을 의미합니까? 텍스트 / 바이너리인지 알고 싶습니까? 실행 가능?
JoeFish 2012-06-07

@ thg435, MIME 유형이 있으면 적절한 파일 이름 확장자로 변환하는 방법이 있습니까?
Mark Ransom

@Mark : 예, guess_extension을 사용 하지만 실제로는 파일 확장자를 기반으로하기 때문에 mimetypes가 작동하지 않습니다. 필요한 것은 libmagic입니다 (링크의 두 번째 답변 참조).
georg

1
pypi.org/project/filetype을 사용해보십시오 .
zx1986

답변:


89

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

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

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

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


2
패키지 python-magic-win64Windows에서 나를 위해 일한
ChesuCR

2
imghdr 의 조합으로 파일 형식 창에서 나를 위해 일한
Hrushikesh 두멀

61

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

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. 따라서 이것은 하위 프로세스 / 쉘 기반 답변과 동일한 작업을 수행하지만 오버 헤드가 없습니다.


6
python-magic이라는 debian / ubuntu 패키지는 같은 이름의 pip 패키지와 다릅니다. 둘 다 import magic호환되지 않는 내용이 있습니다. 자세한 내용은 stackoverflow.com/a/16203777/3189 를 참조하십시오 .
Hamish Downer 2015

1
@Richard 오버 헤드 측면에 대해 자세히 설명해 주시겠습니까? python-magic하위 프로세스 접근 방식을 사용하는 것보다 라이브러리를 더 효율적으로 만드는 것은 무엇입니까 ?
Greg

9

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

로부터 man 페이지 :

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

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

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


+1 file그렇게 많이했는지 몰랐습니다. # file arc.gif arc.gif: GIF image data, version 89a, 234 x 269
JoeFish 2012-06-07

글쎄요, 누군가가 더 나은 답을 주길 바랬어요. OP에는 여전히 많은 작업이 있으며 단순한 함수 호출이 아닙니다.
Steven Rumbalski 2012-06-07

2
+1이 file명령 을 사용하는 한 가지 이점 은 (대부분?) Linux 배포판에서는 기본이지만 사용하려면 python-magic먼저 다운로드하여 설치해야한다는 것입니다. 모듈을 사용하는 스크립트가 이식 가능해야하는 경우 다소 문제가됩니다.
HelloGoodbye 2014 년


6

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

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


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

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


그리고 출력을 어떻게 캡처합니까?
Mark Ransom

@MarkRansom 죄송 좋은 방법이 아니라고, 위의 내 업데이트를 참조하십시오
xvatar

Python 라이브러리를 사용하는 대신 시스템과 상호 작용해야하는 경우 다른 API를 사용하는 다른 운영 체제에서는 유용하지 않을 가능성이 높기 때문에 솔루션은 대부분 차선책입니다.
erikbwork

4

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

답변 해주셔서 감사합니다. BTW, cmd 행에 str.split ()을 사용해서는 안됩니다. shlex.split (cmd) insteed를 사용하십시오.
emnoor

사용하는 대신 shlex.split왜 그냥 실행하지 subprocess.check_output(['file', '--mime-type', filename])않습니까?
Flimm

1

또한이 코드를 사용할 수 있습니다 (헤더 파일의 3 바이트에 의한 순수한 파이썬) :

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"

패키지 설치없이 [및 업데이트 버전]


xlsx를 어떻게 확인할 수 있습니까?
Harsha Biyani

4 바이트 또는 8 바이트까지 사용할 수 있습니다. XLSX (MS Office Open XML 형식 문서) => 50 4B 03 04 (4 바이트) => ASCII (PK ••) 또는 XLSX (MS Office 2007 문서) => 50 4B 03 04 14 00 06 00 (8 바이트) = > ASCII (PK ••••••)
상록수

0

Linux에서만 작동하지만 "sh"python 모듈을 사용하면 모든 쉘 명령을 간단히 호출 할 수 있습니다.

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

pip 설치 sh

수입 sh

sh.file ( "/ root / file")

출력 : / root / file : ASCII 텍스트

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.