10

python中这个类的等价物是什么?https://gist.github.com/2594962

在 PHP 中,它允许您压缩字符串。

我试图在以下语言中找到等价物:Python、Ruby on Rails 和 ASP。

我希望这些语言有内置的功能。我在 PHP 中找不到一个。

更新

当我说 Zip 时,我指的是 windows 使用的标准算法。不是档案的意义。我目前使用该类压缩字符串,base64 对其进行编码并将其作为请求发送到内部 API。

4

4 回答 4

22

要使用存档中使用的相同方法压缩字符串.zip,只需zlib直接使用模块(这是 Python 的zipfile模块所做的)。这是一个简单的例子:

import zlib

teststr = """Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus
pretium justo eget elit eleifend, et dignissim quam eleifend. Nam vehicula nisl
posuere velit volutpat, vitae scelerisque nisl imperdiet. Phasellus dignissim,
dolor amet."""

cmpstr = zlib.compress(teststr.encode('utf-8'))
uncmpstr = zlib.decompress(cmpstr)

fmt = '{:>8}: (length {}) {!r}'
print(fmt.format('teststr', len(teststr), teststr))
print(fmt.format('cmpstr', len(cmpstr), cmpstr))
print(fmt.format('uncmpstr', len(uncmpstr), uncmpstr))

输出:

 teststr: (length 237) 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus\npretium justo eget elit eleifend, et dignissim quam eleifend. Nam vehicula nisl\nposuere velit volutpat, vitae scelerisque nisl imperdiet. Phasellus dignissim,\ndolor amet.'
  cmpstr: (length 157) 'x\x9cMO[\x0e\xc30\x08\xfb\xef)8@\xd5\x93L\xd3\xae\x10%^\xcb\x94W\x03\xf4\xfc\xa3\x9d\xb4\xed\x07\tcc\xfb\xd6\x06\nq\x17+\x94Zn\x83\x84\x95B\x81\xce\x14[\x15D\x85\xda\xa0\x90\xb8\xb3D\xae+!\xb3.\xf4\xd8\x82 g\x93\xa9\x0f(\xbb\xfce\xa2\x8d\xb0B/\x8a\x0f\xf0\x135\xcd\xe4H\xe2\xb5\xb2\x08\x17\xda-\x94\xefm\xa1\xbbo\x076\x8e\x96\x039%O\xbd\x89a\xc0\xd1\xf3\xcb\xd1\xb2i\x0f\x1e\xe7`\r \x89\xae\x1d,\xbb\xe1\xa2\x13\x97\x8e\x91\x18\xff\x99~v\xf3\xf4iu6Z\xde\xf8\xa6X\r'
uncmpstr: (length 237) 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus\npretium justo eget elit eleifend, et dignissim quam eleifend. Nam vehicula nisl\nposuere velit volutpat, vitae scelerisque nisl imperdiet. Phasellus dignissim,\ndolor amet.'
于 2012-05-04T15:59:33.337 回答
6

Python 有一个zipfile模块可以让你读/写 zip 档案。

该类zipfile.ZipFile有一个writestr()方法可以直接从字符串在存档中创建“文件”。

所以不,您不必在归档之前将字符串写入文件。

问题编辑后更新

您说您不需要存档,但链接的 PHP 代码就是这样做的——创建一个 PK-Zip 存档。在 Python 中,您对zipfile. 这是一个创建 zip 并向其中添加一个文件的示例——所有文件都在内存中,没有物理文件。

import zipfile
from cStringIO import StringIO

f = StringIO()
z = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED)
z.writestr('name', 'some_bytes_to_compress')
z.close()

output_string = f.getvalue()

output_string将是 PK-Zip 格式的压缩内容。

如果您同时控制发送端和接收端,并且不需要在一个数据块中发送多个压缩文件,那么使用 PK-Zip 就大材小用了。相反,您可以只使用zlib实现 PK-Zip 压缩的模块。

import zlib

output_string = zlib.compress('some_bytes_to_compress')

然后你可以解压它(假设是 Python):

decompressed_string = zlib.decompress(output_string)
于 2012-05-04T14:11:47.850 回答
5

Under Python, you are looking for the zipfile module - specifically ZipFile.writestr().

I'd note that in general, zlib is used a lot more for the kind of uses you are talking about.

于 2012-05-04T14:09:31.660 回答
4

我不知道你到底需要什么,但你可能会觉得这很有趣。我在这里使用带有类似字符串文件的对象的 zipfile 模块

import zipfile
import StringIO

s = StringIO.StringIO()  # s is a file like object
z = zipfile.ZipFile(s, 'w')  # this is a zip archive
z.writestr('file1.txt', 'Hello, world') # create a "file" inside the archive called 'file1.txt' and write 'hello world' into it
z.close() # close the archive

print s.getvalue()  # this is the content of the string
s.close()  # close the string file-like object

看字符串里面的PK开始

于 2012-05-04T14:21:41.743 回答