【问题标题】:python encoding gzip string [duplicate]python编码gzip字符串[重复]
【发布时间】:2016-08-19 03:41:55
【问题描述】:

我想解压这个字符串 "\x1F\x8B\x08\x00\x00\x00\x00\x00\x00\x00UP]k\xC3\x14\xFD+\xC3\xE7\xCD\xA8\xF9X\xE2\xEBX\xA1\x0CF\x1F\ xBA\xEE%\x10\xAC\xB1\xAD\xC4h\x88f%\x8C\xFD\xF7]\x1B\xDA\xAD\xF8\xE29\xE7z\xEE9~#\xE7\x11G\xAF\xBB\x1C =\x22\xDFv_j\x04H+@\xBAW\x1A\xEEe\x91>SF\x18+i\x9Ef\x04\x84\xA1;\x02/]\x8F\xA5Q\xC2\xF6\xC2\x075\xE2\ xFE8\x89\xB1m\xA4\x85\x89V\xFB\xC1\x88\x19\xA6\xDE\xB6\x1Fe\xB6y\x08\xCA\x87\xA7N\xCD\x1E\xC4^H\x10\xF6\ x19'\x19/\x14g\x92K\xC1[\x06\xCA\xB2\x9Ca\x82K@\x07m\x8F\x17B\x98\xC1\xD7\xC9a2\xA6\xD9W\xA4j\xBAI\x9E\x84\ xAB\x93\x7F\x80g\x18N\x9D,\xEB\xEA\x84fyJIAI\xCE'\xAF\xC6:\xB9\x0B\xE0\xF6\xDA\xA8\x95qg0\x8FE\x87Ke\x86iQbZU\x98\x924 \xD6\x1C];\xC9\xB0n\xA3Jhd\x8C\x08\xB7\xCF\x1AN\xCE\xAA-|R\x94\xB3\x82\xA6\xE0\x902v\x19\xB4*l\xE7! *\x9F\xEB\xD5\x1A\x88\xB3>\xE8\xBF\x85\xC1u\xCA\x22n\xA1\x11\xA4\x99wj|\x17\x8B\x0F\x86\xF2\x8D\x8C\ xE5\x85\x0Cn\x9Co\xDBt\xEF\xF5\xF2X\x1A\xADlx9\x09k\x95\xB9\x9A\xC8+DtI\xB0\xD116\xFA\xF9\x05\xBAs\xAET\xE0\x01\ x00\x00"

这个字符串是通过gzip编码压缩的,我想解压这个,所以我把这个字符串保存在文件中并读取文件来解压,这是行不通的,否则我使用python解释器模式并将字符串粘贴到命令行中代码是工作

我想这是字符集问题,但我无法修复它!所以我希望有人给我一个解决方案! 我的代码很糟糕,工作环境是linux。

  import zlib

  file_obj=open("compress_data.log","r+")

  for gz_data in file_obj.readlines():

       print gz_data

       decompressed_data = zlib.decompress(gz_data, 16+zlib.MAX_WBITS)

       print decompressed_data

【问题讨论】:

  • 使用 StringIO 模块。
  • file_obj = StringIO(gzip_string); decompressed_data = zlib.decompress(fileobj=file_obj)
  • error msg " 必须是字符串或只读缓冲区,而不是实例"
  • 你确定gzip_string 是一个字符串吗?

标签: python encoding gzip


【解决方案1】:

该数据采用“gzip”格式。尝试使用 Python 内置的gzip library

如果该数据的来源是磁盘文件,试试这个:

import gzip

for data in gzip.GzipFile("compress_data.log"):
    print data

如果该数据的来源是 Python 字符串,请尝试以下操作:

import gzip
import StringIO

compressed_data = "\x1F\x8B\x08\x00\x00\x00\x00\x00\x00\x00UP]k\xC3 \x14\xFD+\xC3\xE7\xCD\xA8\xF9X\xE2\xEBX\xA1\x0CF\x1F\xBA\xEE%\x10\xAC\xB1\xAD\xC4h\x88f%\x8C\xFD\xF7]\x1B\xDA\xAD\xF8\xE29\xE7z\xEE9~#\xE7\x11G\xAF\xBB\x1C=\x22\xDFv_j\x04H+@\xBAW\x1A\xEEe\x91>SF\x18+i\x9Ef\x04\x84\xA1;\x02/]\x8F\xA5Q\xC2\xF6\xC2\x075\xE2\xFE8\x89\xB1m\xA4\x85\x89V\xFB\xC1\x88\x19\xA6\xDE\xB6\x1Fe\xB6y\x08\xCA\x87\xA7N\xCD\x1E\xC4^H\x10\xF6\x19'\x19/\x14g\x92K\xC1[\x06\xCA\xB2\x9Ca\x82K@\x07m\x8F\x17B\x98\xC1\xD7\xC9a2\xA6\xD9W\xA4j\xBAI\x9E\x84\xAB\x93\x7F\x80g\x18N\x9D,\xEB\xEA\x84fyJIAI\xCE'\xAF\xC6:\xB9\x0B\xE0\xF6\xDA\xA8\x95qg0\x8FE\x87Ke\x86iQbZU\x98\x924\xD6\x1C];\xC9\xB0n\xA3Jhd\x8C\x08\xB7\xCF\x1AN\xCE\xAA-|R\x94\xB3\x82\xA6\xE0\x902v\x19\xB4*l\xE7!*\x9F\xEB\xD5\x1A\x88\xB3>\xE8\xBF\x85\xC1u\xCA\x22n\xA1\x11\xA4\x99wj|\x17\x8B\x0F\x86\xF2\x8D\x8C\xE5\x85\x0Cn\x9Co\xDBt\xEF\xF5\xF2X\x1A\xADlx9\x09k\x95\xB9\x9A\xC8+DtI\xB0\xD116\xFA\xF9\x05\xBAs\xAET\xE0\x01\x00\x00"

compressed_data = StringIO.StringIO(compressed_data)

for data in gzip.GzipFile(fileobj=compressed_data):
    print data

如果您的数据作为带有 Python 转义序列的 ASCII 文本存储在磁盘文件中,那么这个程序可能适合您:

from gzip import GzipFile
from StringIO import StringIO

with open("compress_data.log") as file_obj:
    gz_data = file_obj.read().rstrip('\n')
unescaped_data = gz_data.decode('string_escape')
decompressed_data = GzipFile(fileobj=StringIO(unescaped_data)).read()
print decompressed_data

注意:如果上述程序适用于您,则您的数据是无意义的格式。这可能是生成数据的程序中存在错误的结果。

【讨论】:

  • 我的 compress_data.log 是“ASCII 文本,行很长”,您的解决方案效果不佳!
  • 好的,这个问题已经解决了,谢谢 Rob!
  • 另一个问题,如果我想使用 file.readline 函数读取 compress_data.log,然后我该怎么办,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-30
  • 1970-01-01
相关资源
最近更新 更多