2013-04-26 2 views
1

파이썬에 문제가 있습니다.파이썬에서 원격 .gz 파일 압축 해제

내 경우 : 파트너 플랫폼에서 가져온 gzipped 파일 (ieh.p // .... namesite .../xxx) 브라우저에서 링크를 클릭하면 다음과 같은 파일이 다운로드됩니다 (예 : namefile.xml.gz).

그래서 ...이 파일을 파이썬으로 읽으면 압축을 풀고 읽을 수 있습니다.

코드 :

content = gzip.open(namefile.xml.gz,'rb') 
print content.read() 

하지만 난 수 없습니다 내가 원격 소스에서 파일을 읽으려고합니다. 원격 파일에서 인코딩 된 문자열 만 읽을 수는 있지만 디코딩 할 수는 없습니다.

코드 : 내가 문자열 인코딩 읽을 수있는 코드로

response = urllib2.urlopen(url) 
encoded =response.read() 
print encoded 

...하지만 난 gzip을하거나 lzip로를 디코딩 할 수 없습니다.

조언이 있으십니까? 감사 파이썬 V3.2에 대한 많은

답변

4

불행하게도 @Aya 메서드는 GzipFile이 파일 객체의 seek 메서드를 광범위하게 사용하기 때문에 (응답으로 지원되지 않음) 작동하지 않는다고 제안합니다.

  1. io.StringIO에 원격 파일의 내용을 읽고, (파일이 작은 경우) gzip.GzipFile로 개체를 전달

  2. 가로 파일을 다운로드 :

    그래서 당신은 기본적으로 두 가지 옵션이 있습니다 디스크에 임시 파일을 넣고 사용하십시오. gzip.open

다른 옵션이 있습니다 전자 코딩) - zlib 모듈을 사용하여 독자를 구현하십시오. 오히려 쉽지만 마법 상수 (How can I decompress a gzip stream with zlib?)에 대해 알아야합니다.

+0

감사합니다, 내 파일이 매우 크고 "임시 폴더"가 가장 좋은 방법이라고 생각합니다. – Nothing

0

이상, 당신은 것입니다 ...

import urllib2 
import gzip 

response = urllib2.urlopen(url) 
gunzip_response = gzip.GzipFile(fileobj=response) 
content = gunzip_response.read() 
print content 

... 이런 일에, urllib2.urlopen()에 의해 반환되는 파일 객체를 포장하는 gzip.GzipFile 클래스를 사용할 수 있습니다 읽는 동안 응답 스트림을 투명하게 압축 해제하십시오.

+0

으로, 원이 방법의 수정을 백 포트하지 않을 경우 파이썬 <3.2 (모든 2.x 버전 포함)로 작업하지 마십시오. –

0

당신은 고정되어 파이썬 3.2 (tell 지원을 필요로하는)을 GzipFile에서 나중에 버그를 사용하지만, 그들은 분명히 파이썬 2.x에서 언급 @newtover