0

上周我买了一个Lorem Ipsupm生成器,我承认它非常酷。

我的问题:有人可以向我展示上述脚本的作者如何能够将 gzip 压缩文件的内容作为字符串发布到他们的代码中的教程吗?我不断收到gzip 压缩常规文件的示例,我感觉有点迷失在这里。

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

我对流、IO 类型等很陌生。随意将链接倾倒在我的腿上。片段也总是受到赞赏。

4

4 回答 4

5

假设您在 *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 模块。

于 2012-05-14T04:30:21.257 回答
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.

这里提到的所有模块都在Python 标准库的文档中进行了描述。

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

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

于 2012-05-14T04:17:26.807 回答
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
于 2012-05-14T04:47:10.477 回答
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.
于 2021-07-22T18:58:19.940 回答