728x90
반응형

 티스토리 

 

개요

 tar.gz 파일을 윈도우 알집 프로그램으로 보면 파일의 끝이 열리지 않는 에러 메세지가 뜨지만, 파일들의 목록도 보이고 압축은 풀린다.

python의 tarfile 라이브러리로 파일을 열면 Readfile error 와 eof error 이 생기는데, 에러가 생겨도 파일을 읽고 풀수 있는 방법을 알아 보자.

파일의 끝이나 읽기 에러가 발생했을 때도 tarfile 라이브러리를 사용하여 압축 파일 내용을 읽고 압축을 해제할 수 있는 방법은, 에러를 무시하면서 파일을 열고 처리하는 것입니다. 이를 위해서는 먼저 파일을 열 때 ignore_errors=True 파라미터를 사용할 수 없음에 유의해야 합니다. 대신, try-except 블록을 사용하여 에러를 포착하고, 에러가 발생하더라도 프로세스를 계속 진행할 수 있게 합니다.

아래의 코드는 EOFError와 ReadError를 처리하는 방법을 보여줍니다. 이 코드는 압축 파일을 열고, 에러가 발생할 경우 이를 캐치하고, 가능한 모든 파일을 압축 해제합니다. 에러가 발생하더라도 가능한 모든 파일이 압축 해제될 때까지 진행됩니다.

 

 py7zr로 .7z와 함께 사용하는 방법은 아래 글 참조 바랍니다.
https://costzerocode.tistory.com/87
반응형

1.코드리뷰 

 tarfile 모듈의 open 함수를 사용할 때 mode 매개변수를 'r:*'로 설정하여 transparent compression을 사용하는 것이 추천됩니다. 

이는 gzip, bzip2, lzma 압축된 파일을 투명하게 읽을 수 있게 해주며, 자동으로 적절한 압축 해제 방법을 선택합니다. 또한, 파일을 열 때 발생할 수 있는 ReadError 또는 CompressionError를 처리하기 위해 예외 처리 구문을 사용합니다.

import tarfile

try:
    # 'r:*' 모드는 압축 형식을 자동으로 감지하여 읽기를 시도합니다.
    with tarfile.open('your_file.tar.gz', 'r:*') as tar:
        tar.extractall(path="extracted_files")
        for member in tar.getmembers():
            print(member.name)
except tarfile.ReadError as e:
    print(f"파일을 읽는 중 에러 발생: {e}")
except tarfile.CompressionError as e:
    print(f"압축 해제 중 에러 발생: {e}")

이 코드는 지정된 tar.gz 파일을 열고, try-except 블록을 사용하여 파일을 읽거나 압축을 해제하는 과정에서 발생할 수 있는 에러를 처리합니다. tarfile.open의 'r:*' 모드는 파일의 압축 방식을 자동으로 감지하고 해제하여, gzip, bzip2, lzma 압축된 파일을 투명하게 처리할 수 있게 해줍니다. 

이렇게 하면 다양한 압축 포맷의 파일을 보다 유연하게 처리할 수 있습니다.

 

2. 코드리뷰

import tarfile

def extract_tarfile_ignore_errors(filename, extract_path="."):
    try:
        # 압축 파일 열기
        with tarfile.open(filename, 'r:*') as tar:
            # 가능한 모든 멤버 추출
            for member in tar.getmembers():
                try:
                    tar.extract(member, path=extract_path)
                except (tarfile.TarError, EOFError) as e:
                    print(f"{member.name} 추출 중 오류 발생: {e}")
                    continue
    except (tarfile.ReadError, EOFError) as e:
        print(f"파일 열기 실패: {e}")

# 실제 파일 경로로 'your_file.tar.gz'를 교체하세요.
extract_tarfile_ignore_errors('your_file.tar.gz', 'extracted_files')

 

이 스크립트는 파일을 열 때 발생할 수 있는 ReadError와 멤버별로 압축 해제할 때 발생할 수 있는 EOFError 및 tarfile.TarError를 처리합니다각 멤버를 압축 해제할 때 에러가 발생하면, 그 멤버는 건너뛰고 다음 멤버로 넘어갑니다. 이 방법을 통해, 파일의 끝에 도달하거나 읽을 수 없는 부분이 있더라도 가능한 많은 파일을 추출할 수 있습니다.

 

728x90

 

마무리

- 이번 포스팅은 tar.gz 압축풀때 tarfile의 사용 방법에 대해 알아봤습니다.

 py7zr을 사용하여 .7z와 함께 사용하는 방법은 아래 글 참조 바랍니다.
https://costzerocode.tistory.com/87

 

궁금한 사항은 lution2@gmail.com로 문의사항  주시면 답변 드리겠습니다.
감사합니다.

 

 

728x90
반응형

+ Recent posts