Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. Python
Code

파이썬에서 파일 압축 및 압축 해제하기

by
Difficulty:IntermediateLength:ShortLanguages:

Korean (한국어) translation by Dae-yeop Lee (you can also view the original English article)

컴퓨터를 한동안 사용해 왔다면 확장자가 .zip인 파일을 본 적이 있을 것입니다. 이 파일은 다른 여러 파일과 폴더, 하위 폴더를 압축한 내용을 담을 수 있는 특별한 파일입니다. 이 경우 인터넷을 통해 파일을 전송하는 데 매우 유용합니다. 파이썬을 이용해 파일을 압축하거나 압축 해제할 수 있다는 사실을 알고 계십니까?

이 튜토리얼에서는 파이썬의 zipfile 모듈을 이용해 개별 또는 여러 파일을 한꺼번에 압축하거나 압축 해제하는 방법을 설명합니다.

개별 파일 압축하기

개별 파일을 압축하는 것은 어렵지 않고 아주 적은 코드로 할 수 있습니다. 먼저 zipfile 모듈을 임포트한 다음 ZipFile 객체를 열 때 두 번째 매개변수를 'w'로 지정해서 쓰기 모드로 엽니다. 첫 번째 매개변수는 파일 자체의 경로입니다. 필요한 코드는 다음과 같습니다.

여기서는 모든 코드의 경로를 윈도우 형식으로 지정합니다. 따라서 리눅스나 맥에서는 이를 적절하게 변경해야 합니다.

다른 압축 방법을 지정해서 파일을 압축할 수도 있습니다. 최신 압축 방식인 BZIP2LZMA는 파이썬 3.3 버전에 추가됐으며, 이 두 가지 압축 방식을 지원하지 않는 다른 도구도 일부 있습니다. 이러한 이유로 DEFLATED 방식을 사용하는 편이 안전합니다. 그럼에도 압축된 파일의 크기 차이를 확인하려면 이러한 압축 방식들을 시험해 봐야 합니다.

여러 파일 압축하기

이 경우 모든 파일을 순회해야 하므로 약간 복잡합니다. 다음 코드는 지정한 폴더에서 확장자가 pdf인 파일을 모두 압축할 것입니다.

이번에는 os 모듈을 임포트한 다음 해당 모듈의 walk() 메서드를 이용해 원래 폴더의 모든 파일과 하위 폴더를 순회했습니다. 여기서는 단지 디렉터리에 들어있는 pdf 파일을 압축하고 있을 뿐입니다. if 문을 이용해 각 파일 형식마다 서로 다른 압축 파일을 만들 수도 있습니다.

디렉터리 구조를 유지하지 않으려면 다음과 같은 코드를 사용해 모든 파일을 함께 넣을 수 있습니다.

write() 메서드는 세 개의 매개변수를 받습니다. 첫 번째 매개변수는 압축하고자 하는 파일의 이름입니다. 두 번째 매개변수는 선택적이며, 압축된 파일에 대해 다른 파일명을 지정할 수 있게 해줍니다. 아무것도 지정하지 않으면 원래 이름이 사용됩니다.

모든 파일을 압축 해제하기

extractall() 메서드를 이용하면 zip 파일의 모든 파일과 폴더를 현재 작업 디렉터리로 압축 해제할 수 있습니다. extractall()에 폴더명을 전달해서 특정 디렉터리의 모든 파일과 폴더를 압축 해제할 수도 있습니다. 전달한 폴더가 존재하지 않으면 이 메서드가 직접 폴더를 만듭니다. 다음은 파일의 압축을 해제하는 데 사용할 수 있는 코드입니다.

여러 파일을 압축 해제하고 싶다면 리스트로 압축 해제할 파일의 이름들을 제공해야 합니다.

개별 파일을 압축 해제하기

개별 파일을 압축 해제하는 것은 여러 파일을 압축 해제하는 것과 비슷합니다. 한 가지 차이점은 이번에는 파일명을 먼저 입력하고 나중에 압축 해제할 경로를 지정해야 한다는 것입니다. 또한 extractall() 대신 extract() 메서드를 사용해야 합니다. 다음은 개별 파일을 압축 해제하는 기본 코드입니다.

Zip 파일 읽기

zip 압축 파일에 특정 파일이 포함돼 있는지 확인해야 하는 경우를 생각해 봅시다. 지금까지는 압축 파일에 들어있는 모든 파일을 압축 해제하는 방법밖에 없었습니다. 이와 비슷하게 특정 크기보다 큰 파일만 압축 해제해야 할 수도 있습니다. zipfile 모듈을 이용하면 압축 파일을 압축 해제하지 않고도 압축 파일의 내용을 조회할 수 있습니다.

ZipFile 객체의 namelist() 메서드는 압축 파일의 모든 멤버 리스트를 반환합니다. 압축 파일 내의 특정 파일에 대한 정보를 얻으려면 ZipFile 객체의 getinfo() 메서드를 이용하면 됩니다. 그럼 파일이 압축된 크기와 압축되지 않은 크기를 비롯해 마지막 수정 시간과 같은 해당 파일의 특정 정보에 접근할 수 있습니다. 이 부분에 대해서는 나중에 다시 살펴보겠습니다.

처리해야 할 파일이 많을 경우 모든 파일마다 getinfo() 메서드를 호출하는 것은 지루한 과정이 될 수 있습니다. 이 경우 infolist() 메서드를 이용해 압축 파일 내의 모든 멤버에 대한 ZipInfo 객체가 담긴 리스트를 반환할 수 있습니다. 리스트 내의 이러한 객체의 순서는 실제 zip 파일의 순서와 동일합니다.

read(file) 메서드를 이용해 압축 파일 내의 특정 파일의 내용을 직접 읽을 수도 있습니다. 여기서 file은 읽으려는 파일의 이름입니다. 그러자면 압축 파일을 반드시 읽기 또는 추가 모드로 열어야 합니다.

압축 파일로부터 개별 파일의 압축된 크기를 가져오려면 compress_size 속성을 사용하면 됩니다. 이와 비슷하게 압축되지 않은 크기를 알고 싶다면 file_size 특성을 사용하면 됩니다.

다음 코드는 앞서 설명한 속성과 메서드를 사용해 크기가 1MB 미만의 파일만 압축 해제합니다.

압축 파일 내의 특정 파일이 마지막으로 수정된 시간과 날짜를 확인하기 위해서는 date_time 속성을 사용하면 됩니다. 이 경우 6개의 값으로 구성된 튜플이 반환됩니다. 이 값들은 구체적인 순서에 따라 년, 월, 일, 시, 분, 초에 해당합니다. 연도는 항상 1980보다 크거나 같고 시간, 분, 초는 0부터 시작합니다.

원본 파일의 크기 및 압축된 파일 크기에 대한 이러한 정보는 파일을 압축할 가치가 있는지 여부를 결정하는 데 도움이 됩니다. 저는 이것을 다른 어떤 상황에서도 활용할 수 있다고 확신합니다.

정리

이번 튜토리얼에서 분명히 알 수 있듯이 zipfile 모듈을 이용해 파일을 압축하면 압축 파일을 다룰 때 크나큰 유연성을 얻을 수 있습니다. 디렉터리의 여러 파일을 형식, 이름, 크기에 따라 서로 다른 파일로 압축할 수 있습니다. 또한 디렉터리 구조를 유지할지 여부도 결정할 수 있습니다. 마찬가지로 파일의 압축을 해제할 때 크기 등의 기준에 따라 파일을 원하는 위치에 압축 해제할 수 있습니다.

솔직히 말해서, 직접 코드를 작성해서 파일을 압축하고 압축 해제하는 것도 저에겐 꽤나 흥미로운 경험이었습니다. 여러분도 이 튜토리얼을 즐겁게 읽으셨길 바랍니다. 질문이 있으시면 저에게 댓글로 알려주시기 바랍니다.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.