Python을 사용하여 gz 파일의 압축을 푸는 방법


83

FTP 사이트에서 로컬 Windows 파일 서버로 다운로드 한 gz 파일을 추출해야합니다. 파일의 로컬 경로에 대한 변수가 설정되어 있으며 GZIP 머들에서 사용할 수 있다는 것을 알고 있습니다.

어떻게 할 수 있습니까? GZ 파일 내부의 파일은 XML 파일입니다.


5
당신이 시도한 것을 볼 수 있습니까?
heinst

1
이것이 왜 그렇게 반대 투표입니까? 위의 단일 찬성표에 2 개의 답변이 있다는 점을 감안할 때 질문은 그렇게 나쁠 수 없습니다.
파울로 네 베스

@PauloNeves 아마도 질문에 저자의 연구가 전혀 없기 때문일 것입니다.
bfontaine

답변:


141
import gzip
import shutil
with gzip.open('file.txt.gz', 'rb') as f_in:
    with open('file.txt', 'wb') as f_out:
        shutil.copyfileobj(f_in, f_out)

2
왜 두 번째를 넣었습니까? 그게 일반적인 관행인가요? 동일한 맥락 관리자와 여러 파일을 열 수 있습니다
RomainL을.

1
아마도 f_in을 읽고 f_out을 작성했기 때문일 것입니다. 문서에 따르면 읽기 obj 및 쓰기 obj docs.python.org/3/library/shutil.html#shutil.copyfileobj에 대한 매개 변수가 필요합니다 .
paxton91michael

@Matt shouldnt u 또한 f_in과 f_out을 닫아야합니까?
JeyJ

7
@JeyJ : 이것이 'with'문의 목적입니다. "with"섹션이있을 때 f_in.close ()를 실행합니다. (예외와 같은) 문제가 발생하면 정말 유용합니다. 그것은 확실히 리소스가 닫혀 있습니다
sweetdream

1
참고 shutil.copyfileobj()세번째 파라미터를 가진다는 length: 주어진 경우 "정수 길이가 버퍼 크기 특히, 음 길이 값 수단 청크 소스 데이터에 반복없이 데이터를 복사하기 위해, 기본적으로 데이터를 청크로 판독된다. 제어되지 않은 메모리 소비를 피하십시오. "
norok2

30

문서에서 :

import gzip
f = gzip.open('file.txt.gz', 'rb')
file_content = f.read()
f.close()

이 솔루션은 감사 @heinst, 어떤 라이브러리를 가져 오지 않고 파이썬 2.7에 나를 위해 많은 일
자드 Farazmand에게

9

판다에게도 전달하고 싶을 수도 있습니다.

with gzip.open('features_train.csv.gz') as f:

    features_train = pd.read_csv(f)

features_train.head()

2
이것이 팬더와 무슨 관련이 있습니까? " GZ 파일 내부의 파일은 XML 파일입니다. "-OP
cz

4

xml 데이터를 사용하고 있고 현재 pd.read_xml()기능 이 없기 때문에 정확한 답은 아니지만 (v0.23.4부터) pandas (v0.21.0부터 시작)는 파일의 압축을 풀 수 있습니다! 감사합니다 Wes!

import pandas as pd
import os
fn = '../data/file_to_load.json.gz'
print(os.path.isfile(fn))
df = pd.read_json(fn, lines=True, compression='gzip')
df.tail()

3
이 코드가 질문에 답할 수 있지만 문제를 해결하는 방법 및 / 또는 이유에 대한 추가 컨텍스트를 제공하면 답변의 장기적인 가치가 향상됩니다.
Nic3500

1
좋은 대답입니다. 압축 된 json을 매우 간단한 (pythonic) 방식으로 읽습니다.
lordcenzin

3

압축을 풀고 파일을 파싱하는 경우 파일을 바이너리로 열 때 decode () 메서드 를 사용하는 것을 잊지 마십시오 .

import gzip
with gzip.open(file.gz, 'rb') as f:
    for line in f:
        print(line.decode().strip())

2
from sh import gunzip

gunzip('/tmp/file1.gz')

13
참고 sh표준 설치를의 일부가 아닙니다.
Noumenon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.