2011-06-12 5 views
0

데이터의 일부가 바이너리 (MySQL의 blob 데이터 유형)이며 실제로는 스크랩되고 gzipped 된 웹 페이지입니다. 이제 저는 그것들을 추출하여 각 레코드를 gzip 파일에 기록하고 싶습니다. gzip 파일은 gzip으로 압축 된 후 데이터라고 할 수 있습니다.파일에 gzipped-already 데이터 쓰기

하지만 어떻게해야합니까? 검색을 통해 gzip 파일을 쓰는 방법에 대한 수많은 예제를 원래 데이터 (gzip 된 데이터가 아님)에서 찾을 수 있습니다. gzip으로 된 문자열을 파일에 직접 작성해도 gzip 파일이 작성되지는 않습니다. "범위에없는 서수"예외는 없습니다.

도움을 주시겠습니까? 미리 감사드립니다. 나는

편집 ... 파이썬에 안돼서 :이 예외의 원인

def store_cache(self, content, news_id): 
     if not content: 
      return 
     # some of the records may contain normal data (not gzipp-ed), hence this try block 
     try: 
      content = self.gunzip(content) 
     except: 
      return 

     import gzip 
     with gzip.open('static/cache/%s' % (self.base36encode(news_id),), 'wb') as f: 
      f.write(content) 
      f.close() 

: 여기 내가 사용하는 방법입니다

<type 'exceptions.UnicodeEncodeError'> at /migrate 
'ascii' codec can't encode character u'\u1edb' in position 186: ordinal not in range(128) 

가 그리고 이것은 가장 안쪽의 역 추적입니다 :

E:\Python27\lib\gzip.py in write 
      self.crc = zlib.crc32(data, self.crc) & 0xffffffffL 
+2

파일을 저장하고 이러한 오류가 발생하는 코드를 게시하지 않는 이유는 무엇입니까? 어쩌면 누군가 당신이 그것을 바로 잡도록 도울 수 있습니다. – Mat

+3

바이너리 데이터 (MySQL Blob에서)를 .gz 확장자의 파일에 쓰면 작동합니까? –

+0

@ Yannick 아니요, UnicodeEncodeError가 항상 나타납니다. 나는 코덱, utf-8 인코딩/디코딩 등을 시도했다 ... –

답변

0

당신은 스스로 말했습니다 : 을 추출한 다음 작성하십시오. gzip 파일로 변환합니다. "gzipped 데이터에서"작성하는 데 특별한 것은 없습니다. 원래 데이터를 가져 오기 위해 데이터의 압축을 풀고 원본 데이터 인 것처럼 원본 데이터를 쓰는 것입니다. 문서에서는 이러한 작업을 수행하는 방법을 보여줍니다.

그러나 gzip은 아카이브 형식이 아닌 단지 압축 형식입니다. 여러 파일을 처리하도록 제작되지 않았으므로 다른 입력을 사용하여 여러 입력에서 단일 파일을 만들어야합니다. 일반적으로 gzip으로 압축 된 tar 아카이브를 작성하면됩니다. 이것을 tarfile 모듈을 사용하여 파이썬에서 할 수 있습니다. 데이터는 gzip 압축 해제 스트림에서 나올 것이므로 TarFile.addfile(tarinfo, fileobj) 메소드를 사용하여 압축 파일에 추가 할 수 있습니다. 이 방법을 추가하려면 gzip.GzipFile 인스턴스를 fileobj으로 사용할 수 있어야합니다.

+0

답변을 주셔서 감사합니다. Karl이 권고 한 바를 다시 시도해보십시오. gzip으로 압축 된 내용의 압축을 풀고 gzip 파일에 기록하십시오. 실제로 레코드 당 하나의 파일이므로'tarfile' 모듈이 필요 없습니다. 결과와 함께 계속 게시됩니다. –

+0

확인 내 마지막 질문을 포함하도록 질문을 편집했습니다. 다시 도움을받을 수 있습니까? –