chunk — IFF 청크된 데이터 읽기

소스 코드: Lib/chunk.py

버전 3.11에서 폐지되었습니다, 버전 3.13에서 제거됩니다.: The chunk module is deprecated (see PEP 594 for details).


이 모듈은 EA IFF 85 청크를 사용하는 파일을 읽기 위한 인터페이스를 제공합니다. [1] 이 형식은 적어도 AIFF/AIFF-C (Audio Interchange File Format) 와 RMFF (Real Media File Format)에서 사용됩니다. WAVE 오디오 파일 형식은 밀접하게 관련되어 있으며 이 모듈을 사용하여 읽을 수도 있습니다.

청크의 구조는 다음과 같습니다:

오프셋

길이

내용

0

4

청크 ID

4

4

빅 엔디안 바이트 순서로 청크의 크기. 헤더는 포함하지 않습니다.

8

n

데이터 바이트. 여기서 n은 앞 필드에서 주어진 크기입니다.

8 + n

0 또는 1

n가 홀수이고 청크 정렬이 사용된 경우 필요한 패드 바이트

ID는 청크의 유형을 식별하는 4바이트 문자열입니다.

크기 필드(빅 엔디안 바이트 순서를 사용하여 인코딩된 32비트 값)는 청크 데이터의 크기를 제공하며, 8바이트 헤더는 포함하지 않습니다.

일반적으로 IFF 형식의 파일은 하나 이상의 청크로 구성됩니다. 여기에 정의된 Chunk 클래스의 제안 된 사용법은 각 청크의 시작 부분에서 인스턴스를 만들고 끝까지 도달할 때까지 인스턴스에서 읽는 것입니다. 그다음에 새 인스턴스를 만들 수 있습니다. 파일의 끝에서, 새 인스턴스를 만드는 것은 EOFError 예외로 실패합니다.

class chunk.Chunk(file, align=True, bigendian=True, inclheader=False)

청크를 나타내는 클래스. file 인자는 파일류 객체를 기대합니다. 이 클래스의 인스턴스가 특별히 허용됩니다. 필요한 유일한 메서드는 read()입니다. seek()tell() 메서드가 있고 예외를 발생시키지 않으면 이것들도 사용됩니다. 이러한 메서드가 존재하고, 예외가 발생하면, 객체가 변경되지 않았을 것으로 기대합니다. 선택적 인자 align이 참이면, 청크는 2바이트 경계에서 정렬되는 것으로 가정합니다. align이 거짓이면 정렬을 가정하지 않습니다. 기본값은 참입니다. 선택적 인자 bigendian이 거짓이면 청크 크기는 리틀 엔디안 순서로 간주합니다. 이것은 WAVE 오디오 파일에 필요합니다. 기본값은 참입니다. 선택적 인자 inclheader가 참이면, 청크 헤더에 주어진 크기는 헤더의 크기를 포함합니다. 기본값은 거짓입니다.

Chunk 객체는 다음 메서드를 지원합니다:

getname()

청크의 이름(ID)을 돌려줍니다. 이것은 청크의 처음 4바이트입니다.

getsize()

청크의 크기를 돌려줍니다.

close()

닫고 청크의 끝으로 건너뜁니다. 하부 파일을 닫지 않습니다.

나머지 메서드는 close() 메서드가 호출된 후에 호출되면 OSError를 발생시킵니다. 파이썬 3.3 이전에는 IOError를 발생시켰습니다. 이제는 OSError의 별칭입니다.

isatty()

False를 반환합니다.

seek(pos, whence=0)

청크의 현재 위치를 설정합니다. whence 인자는 선택 사항이며 기본값은 0(절대 파일 위치 지정)입니다; 다른 값은 1(현재 위치에 상대적인 탐색)과 2(파일의 끝에 상대적인 탐색)입니다. 반환 값이 없습니다. 하부 파일이 탐색을 허용하지 않으면, 정방향 탐색만 허용됩니다.

tell()

청크의 현재 위치를 반환합니다.

read(size=-1)

청크에서 최대 size 바이트를 읽습니다 (size 바이트를 얻기 전에 read가 청크 끝에 도달하면 덜 읽을 수 있습니다). size 인자가 음수이거나 생략되면, 청크의 끝까지 모든 데이터를 읽습니다. 청크의 끝이 즉시 발견되면 빈 바이트열 객체가 반환됩니다.

skip()

청크의 끝으로 건너뜁니다. 청크에 대한 모든 추가 read() 호출은 b''를 반환합니다. 청크의 내용에 관심이 없으면, 파일이 다음 청크의 시작을 가리키도록 이 메서드를 호출해야 합니다.

각주