如何压缩字符串?

时间:2012-05-04 14:05:32

标签: python ruby-on-rails

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

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

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

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

更新

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

4 个答案:

答案 0 :(得分:13)

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

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.'

答案 1 :(得分:4)

在Python下,您正在寻找the zipfile module - 特别是ZipFile.writestr()

我注意到,一般来说,zlib对于您所谈论的用途使用的内容更多。

答案 2 :(得分:3)

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是过度的。相反,您可以使用实现PK-Zip压缩的zlib模块。

import zlib

output_string = zlib.compress('some_bytes_to_compress')

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

decompressed_string = zlib.decompress(output_string)

答案 3 :(得分:2)

我不知道你到底需要什么,但你可能会觉得这很有趣。我在这里使用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启动