将gzip压缩数据作为字符串放入脚本中

时间:2012-05-14 04:01:43

标签: python string io compression gzip

上周我抓住了Lorem Ipsupm发电机,我承认,这很酷。

我的问题:有人可以向我展示一个关于上述脚本的作者如何能够将gzip文件的内容作为字符串发布到他们的代码中的教程吗?我不断得到gzipping a regular file的例子,我感觉有点迷失在这里。

对于它的价值,我有另一个非常相似的模块(它生成随机名称,公司等),现在它从几个不同的文本文件中读取。我更喜欢这种方法;它需要在我的项目中少一个子目录来放置数据,它还为我提供了一种新的处理方式。

我对流,IO类型等都很陌生。随意把链接丢在我的腿上。 Snipptes也很受欢迎。

4 个答案:

答案 0 :(得分:4)

假设您处于* nix环境中,您只需要gzip和base64编码器来生成字符串。假设您的内容位于file.txt,为了本示例的目的,我使用具有该特定名称的随机字节创建了该文件。

所以你需要先压缩它:

$ gzip file.txt

这将生成一个file.txt.gz 文件,您现在需要将其嵌入到代码中。为此,您需要对其进行编码。一种常见的方法是使用Base64编码,可以使用base64程序完成:

$ base64 file.txt.gz
H4sICGmHsE8AA2ZpbGUudHh0AAGoAFf/jIMKME+MgnEhgS4vd6SN0zIuVRhsj5fac3Q1EV1EvFJK
fBsw+Ln3ZSX7d5zjBXJR1BUn+b2/S3jHXO9h6KEDx37U7iOvmSf6BMo1gOJEgIsf57yHwUKl7f9+
Beh4kwF+VljN4xjBfdCiXKk0Oc9g/5U/AKR02fRwI+zYlp1ELBVDzFHNsxpjhIT43sBPklXW8L5P
d8Ao3i2tQQPf2JAHRQZYYn3vt0tKg7drVKgAAAA=

现在,您已拥有在python脚本中使用该文件内容所需的所有内容:

from cStringIO import StringIO
from base64 import b64decode
from gzip import GzipFile

# this is the variable with your file's contents    
gzipped_data = """
H4sICGmHsE8AA2ZpbGUudHh0AAGoAFf/jIMKME+MgnEhgS4vd6SN0zIuVRhsj5fac3Q1EV1EvFJK
fBsw+Ln3ZSX7d5zjBXJR1BUn+b2/S3jHXO9h6KEDx37U7iOvmSf6BMo1gOJEgIsf57yHwUKl7f9+
Beh4kwF+VljN4xjBfdCiXKk0Oc9g/5U/AKR02fRwI+zYlp1ELBVDzFHNsxpjhIT43sBPklXW8L5P
d8Ao3i2tQQPf2JAHRQZYYn3vt0tKg7drVKgAAAA=
"""

# we now decode the file's content from the string and unzip it
orig_file_desc = GzipFile(mode='r', 
                          fileobj=StringIO(b64decode(gzipped_data)))

# get the original's file content to a variable
orig_file_cont = orig_file_desc.read()

# and close the file descriptor
orig_file_desc.close()

显然,你的程序将依赖于base64,gzip和cStringIO python模块。

答案 1 :(得分:3)

我不确定你究竟在问什么,但这是一个刺...

lipsum.py的作者将压缩数据作为Base64编码文本块嵌入其代码中。 Base64是一种使用可打印ASCII字符表示二进制数据的编码机制。它可用于在Python代码中包含二进制数据。它更常用于在电子邮件附件中包含二进制数据...下次有人向您发送图片或PDF文档时,请查看原始邮件,您会看到非常相同的事情。

Python的base64模块提供了在base64和数据的二进制表示之间进行转换的例程......一旦你拥有了数据的二进制表示,那么如何你真的不重要无论是通过从文件中读取它还是解码代码中嵌入的字符串都可以得到它。

Python的gzip模块可用于解压缩数据。它需要一个类似文件的对象......并且Python提供了StringIO模块来将字符串包装在正确的方法集中,使它们像文件一样运行。您可以在以下代码中的lipsum.py中看到:

sample_text_file = gzip.GzipFile(mode='rb',
    fileobj=StringIO(base64.b64decode(DEFAULT_SAMPLE_COMPRESSED)))

这是创建一个StringIO对象,其中包含存储在DEFAULT_SAMPLE_COMPRESSED中的base64编码值的二进制表示。

此处提到的所有模块都在Python standard library的文档中进行了描述。

除非你的数据很小且相对静态,否则我不建议在你的代码内联中包含这样的数据作为一个好主意。否则,将其打包到Python包中,这样可以更轻松地编辑和跟踪更改。

我是否回答了正确的问题?

答案 2 :(得分:1)

这个怎么样:对字符串进行拉链和编码,将其打印出来然后重新编码并再次解压缩。

from StringIO import StringIO
import base64
import gzip

contents = 'The quick brown fox jumps over the lazy dog'

zip_text_file = StringIO()

zipper = gzip.GzipFile(mode='wb', fileobj=zip_text_file)

zipper.write(contents)
zipper.close()

enc_text =  base64.b64encode(zip_text_file.getvalue())
print enc_text

sample_text_file = gzip.GzipFile(mode='rb',
    fileobj=StringIO(base64.b64decode(enc_text)))
DEFAULT_SAMPLE = sample_text_file.read()
sample_text_file.close()
print DEFAULT_SAMPLE

答案 3 :(得分:1)

老问题,但我最近不得不为 AWS 日志做这个。在 Python3 中使用 BytesIO 而不是 StringIO:

import base64
from io import BytesIO

DEFAULT_SAMPLE_COMPRESSED = "Some base 64 encoded and gzip compressed string"

sample_text_file = gzip.GzipFile(
    mode='rb',
    fileobj=BytesIO(base64.b64decode(DEFAULT_SAMPLE_COMPRESSED))
)

binary_text = sample_text_file.read() # This will be the final string as bianry
text = binary_text .decode() # This will make the binary text a string.