mimetypes — 파일 이름을 MIME 타입으로 매핑

mimetypes — 파일 이름을 MIME 타입으로 매핑

mimetypes 모듈은 파일 이름이나 URL과 파일 확장자에 연결된 MIME 타입 사이를 변환해요. 파일 이름에서 MIME 타입으로, 그리고 MIME 타입에서 파일 확장자로의 변환이 제공돼요. 후자의 변환은 인코딩을 지원하지 않아요.

이 모듈은 하나의 클래스와 여러 편의 함수를 제공해요. 함수가 이 모듈의 일반적인 인터페이스지만, 어떤 애플리케이션은 클래스에도 관심이 있을 수 있어요. 아래 설명하는 함수들이 이 모듈의 기본 인터페이스예요. 모듈이 아직 초기화되지 않았는데 이 함수들이 init()이 설정하는 정보에 의존한다면, init()을 호출할 거예요.

출처: Python 표준 라이브러리

본문

mimetypes.guess_type(url, strict=True)

url로 주어진 파일 이름, 경로 또는 URL을 기반으로 파일 타입을 추측해요. URL은 문자열이나 path-like 객체일 수 있어요.

반환값은 튜플 (type, encoding)이고, 타입을 추측할 수 없으면(. 접미사 누락 또는 알 수 없음) typeNone이거나 MIME content-type 헤더에 쓸 수 있는 'type/subtype' 형태의 문자열이에요. encoding은 인코딩이 없으면 None, 아니면 인코딩에 사용된 프로그램 이름(예: compress 또는 gzip)이에요. 인코딩은 Content-Encoding 헤더로 쓰기 적합하지 Content-Transfer-Encoding 헤더로는 적합하지 않아요. 매핑은 테이블 기반이에요.

인코딩 접미사는 대소문자를 구분하고, 타입 접미사는 먼저 대소문자 구분으로, 그다음 대소문자 무시로 시도돼요.

선택적 strict 인자는 알려진 MIME 타입 목록이 IANA에 등록된 공식 타입만으로 제한되는지 여부를 지정하는 플래그예요. 하지만 이 모듈의 동작은 밑바탕 운영체제에도 의존해요. OS가 인식하거나 Python 내부 데이터베이스에 명시적으로 등록된 파일 타입만 식별할 수 있어요. strictTrue(기본값)일 때는 IANA 타입만 지원되고, False일 때는 비표준이지만 흔히 쓰는 MIME 타입도 일부 인식돼요.

버전 3.8에서 변경: url이 path-like 객체인 것 지원 추가. 버전 3.13부터 소프트 폐기: URL 대신 파일 경로를 전달하는 것. 이것은 guess_file_type()을 사용하세요.

mimetypes.guess_file_type(path, *, strict=True)

path로 주어진 경로를 기반으로 파일 타입을 추측해요. guess_type() 함수와 비슷하지만 URL 대신 경로를 받아요. path는 문자열, bytes 객체 또는 path-like 객체일 수 있어요.

버전 3.13에 추가됨.

mimetypes.guess_all_extensions(type, strict=True)

type으로 주어진 MIME 타입을 기반으로 파일의 확장자를 추측해요. 반환값은 선행 점('.')을 포함한 모든 가능한 파일 확장자를 주는 문자열 리스트예요. 확장자는 특정 데이터 스트림과 연결됐다고 보장되지는 않지만, guess_type()guess_file_type()에 의해 MIME 타입 type으로 매핑될 거예요. 선택적 strict 인자는 guess_type() 함수와 같은 의미예요.

mimetypes.guess_extension(type, strict=True)

type으로 주어진 MIME 타입을 기반으로 파일의 확장자를 추측해요. 반환값은 선행 점('.')을 포함한 파일 확장자를 주는 문자열이에요. 확장자는 특정 데이터 스트림과 연결됐다고 보장되지는 않지만, guess_type()guess_file_type()에 의해 MIME 타입 type으로 매핑될 거예요. type에 대해 확장자를 추측할 수 없으면 None이 반환돼요. 선택적 strict 인자는 guess_type() 함수와 같은 의미예요.

모듈의 동작을 제어하는 데 쓸 수 있는 추가 함수와 데이터 항목이 몇 가지 있어요.

mimetypes.init(files=None)

내부 데이터 구조를 초기화해요. files가 주어지면 기본 타입 맵을 보강하는 데 사용할 파일 이름의 시퀀스여야 해요. 생략하면 사용할 파일 이름은 knownfiles에서 가져오고, Windows에서는 현재 레지스트리 설정이 로드돼요. files 또는 knownfiles에 이름이 있는 각 파일은 그보다 앞에 이름이 있는 파일보다 우선해요. init()을 반복 호출하는 건 허용돼요.

files에 빈 리스트를 지정하면 시스템 기본값이 적용되지 않아요. 내장 목록의 잘 알려진 값만 있게 되죠. filesNone이면 내부 데이터 구조가 완전히 초기 기본값으로 다시 만들어져요. 이것은 안정적인 연산이고 여러 번 호출해도 같은 결과를 내요.

버전 3.2에서 변경: 이전에는 Windows 레지스트리 설정이 무시됐음.

mimetypes.read_mime_types(file)

file로 이름이 주어진 파일에 있는 타입 맵을, 그 파일이 존재하면 로드해요. file은 읽을 파일 이름을 지정하는 문자열이어야 해요. 타입 맵은 선행 점('.')을 포함한 파일 확장자를 'type/subtype' 형태의 문자열로 매핑하는 딕셔너리로 반환돼요. 파일이 없거나 읽을 수 없으면 None이 반환돼요.

mimetypes.add_type(type, ext, strict=True)

MIME 타입 type에서 확장자 ext로의 매핑을 추가해요. 확장자가 이미 알려져 있으면 새 타입이 옛 타입을 대체해요. 타입이 이미 알려져 있으면 확장자가 알려진 확장자 목록에 추가돼요. strictTrue(기본값)이면 공식 MIME 타입에, 아니면 비표준 타입에 매핑이 추가돼요.

mimetypes.inited

전역 데이터 구조가 초기화됐는지 여부를 나타내는 플래그. init()에 의해 True로 설정돼요.

mimetypes.knownfiles

흔히 설치되는 타입 맵 파일 이름 목록. 이 파일들은 보통 mime.types라는 이름이고 각기 다른 패키지가 다른 위치에 설치해요.

mimetypes.suffix_map

접미사를 접미사로 매핑하는 딕셔너리. 인코딩과 타입이 같은 확장자로 표시되는 인코딩된 파일을 인식할 수 있게 해 줘요. 예를 들어 .tgz 확장자는 인코딩과 타입을 따로 인식할 수 있도록 .tar.gz에 매핑돼요.

mimetypes.encodings_map

파일 이름 확장자를 인코딩 타입으로 매핑하는 딕셔너리.

mimetypes.types_map

파일 이름 확장자를 MIME 타입으로 매핑하는 딕셔너리.

mimetypes.common_types

파일 이름 확장자를 비표준이지만 흔히 발견되는 MIME 타입으로 매핑하는 딕셔너리.

모듈 사용 예:

>>> import mimetypes
>>> mimetypes.init()
>>> mimetypes.knownfiles
['/etc/mime.types', '/etc/httpd/mime.types', ... ]
>>> mimetypes.suffix_map['.tgz']
'.tar.gz'
>>> mimetypes.encodings_map['.gz']
'gzip'
>>> mimetypes.types_map['.tgz']
'application/x-tar-gz'

MimeTypes 객체

MimeTypes 클래스는 MIME 타입 데이터베이스를 두 개 이상 원하는 애플리케이션에 유용할 수 있어요. mimetypes 모듈과 비슷한 인터페이스를 제공해요.

class mimetypes.MimeTypes(filenames=(), strict=True)

이 클래스는 MIME 타입 데이터베이스를 나타내요. 기본적으로 이 모듈의 나머지와 같은 데이터베이스에 접근을 제공해요. 초기 데이터베이스는 Python의 내장 MIME 타입 테이블에서 만들어져요. read() 또는 readfp() 메서드로 추가 mime.types-스타일 파일을 데이터베이스에 로드해 확장될 수 있어요. 기본 데이터가 원치 않으면 추가 데이터를 로드하기 전에 매핑 딕셔너리를 지울 수도 있어요. 선택적 filenames 매개변수로 기본 데이터베이스 "위에" 추가 파일을 로드하게 할 수 있어요.

  • suffix_map — 접미사를 접미사로 매핑하는 딕셔너리. 인코딩과 타입이 같은 확장자로 표시되는 인코딩된 파일을 인식할 수 있게 해 줘요. 예를 들어 .tgz 확장자는 인코딩과 타입을 따로 인식할 수 있도록 .tar.gz에 매핑돼요. 몇 가지 미리 정의된 값으로 초기화돼요.
  • encodings_map — 파일 이름 확장자를 인코딩 타입으로 매핑하는 딕셔너리. 미리 정의된 값으로 초기화돼요.
  • types_map — 파일 이름 확장자를 MIME 타입으로 매핑하는 두 딕셔너리를 담은 튜플. 첫 번째 딕셔너리는 비표준 타입용, 두 번째는 표준 타입용이에요. 미리 정의된 값과 filenames 인자로 지정된 파일에서 로드된 MIME 타입 정보로 초기화돼요.
  • types_map_inv — MIME 타입을 파일 이름 확장자 목록으로 매핑하는 두 딕셔너리를 담은 튜플. 첫 번째 딕셔너리는 비표준 타입용, 두 번째는 표준 타입용이에요. 미리 정의된 값과 filenames 인자로 지정된 파일에서 로드된 MIME 타입 정보로 초기화돼요.

guess_extension(type, strict=True)

객체의 일부로 저장된 테이블을 사용한다는 점 빼고 guess_extension() 함수와 비슷해요.

guess_type(url, strict=True)

객체의 일부로 저장된 테이블을 사용한다는 점 빼고 guess_type() 함수와 비슷해요.

guess_file_type(path, *, strict=True)

객체의 일부로 저장된 테이블을 사용한다는 점 빼고 guess_file_type() 함수와 비슷해요.

버전 3.13에 추가됨.

guess_all_extensions(type, strict=True)

객체의 일부로 저장된 테이블을 사용한다는 점 빼고 guess_all_extensions() 함수와 비슷해요.

read(filename, strict=True)

filename이라는 이름의 파일에서 MIME 정보를 로드해요. 파일을 파싱하는 데 readfp()를 사용해요. strictTrue이면 정보가 표준 타입 목록에, 아니면 비표준 타입 목록에 추가돼요.

readfp(fp, strict=True)

열린 파일 fp에서 MIME 타입 정보를 로드해요. 파일은 표준 mime.types 파일 형식이어야 해요. strictTrue이면 정보가 표준 타입 목록에, 아니면 비표준 타입 목록에 추가돼요.

read_windows_registry(strict=True)

Windows 레지스트리에서 MIME 타입 정보를 로드해요. 사용 가능: Windows에서만. strictTrue이면 정보가 표준 타입 목록에, 아니면 비표준 타입 목록에 추가돼요.

버전 3.2에 추가됨.

add_type(type, ext, strict=True)

MIME 타입 type에서 확장자 ext로의 매핑을 추가해요. 유효한 확장자는 '.'으로 시작하거나 비어 있어요. 확장자가 이미 알려져 있으면 새 타입이 옛 타입을 대체해요. 타입이 이미 알려져 있으면 확장자가 알려진 확장자 목록에 추가돼요. strictTrue(기본값)이면 공식 MIME 타입에, 아니면 비표준 타입에 매핑이 추가돼요.

버전 3.14부터 폐기, 3.16에서 제거: 유효하지 않고 점 없는 확장자는 Python 3.16에서 ValueError를 일으킴.

명령줄 사용법

mimetypes 모듈은 명령줄에서 스크립트로 실행할 수 있어요.

python -m mimetypes [-h] [-e] [-l] type [type ...]

다음 옵션이 받아들여져요:

  • -h, --help — 도움말 메시지를 보여 주고 종료.
  • -e, --extension — 타입 대신 확장자를 추측.
  • -l, --lenient — 흔하지만 비표준인 타입도 추가로 검색.

기본적으로 스크립트는 MIME 타입을 파일 확장자로 변환해요. 하지만 --extension을 지정하면 파일 확장자를 MIME 타입으로 변환해요. 각 타입 항목에 대해 스크립트는 표준 출력 스트림에 한 줄을 써요. 알 수 없는 타입이 나오면 표준 출력 스트림에 오류 메시지를 쓰고 반환 코드 1로 종료해요.

명령줄 예

명령줄 인터페이스의 전형적인 사용 예:

$ # get a MIME type by a file name
$ python -m mimetypes filename.png
type: image/png encoding: None

$ # get a MIME type by a URL
$ python -m mimetypes https://example.com/filename.txt
type: text/plain encoding: None

$ # get a complex MIME type
$ python -m mimetypes filename.tar.gz
type: application/x-tar encoding: gzip

$ # get a MIME type for a rare file extension
$ python -m mimetypes filename.pict
error: media type unknown for filename.pict

$ # now look in the extended database built into Python
$ python -m mimetypes --lenient filename.pict
type: image/pict encoding: None

$ # get a file extension by a MIME type
$ python -m mimetypes --extension text/javascript
.js

$ # get a file extension by a rare MIME type
$ python -m mimetypes --extension text/xul
error: unknown type text/xul

$ # now look in the extended database again
$ python -m mimetypes --extension --lenient text/xul
.xul

$ # try to feed an unknown file extension
$ python -m mimetypes filename.sh filename.nc filename.xxx filename.txt
type: application/x-sh encoding: None
type: application/x-netcdf encoding: None
error: media type unknown for filename.xxx
type: text/plain encoding: None

$ # try to feed an unknown MIME type
$ python -m mimetypes --extension audio/aac audio/opus audio/future audio/x-wav
.aac
.opus
error: unknown type audio/future