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には、zipfilezipアーカイブの読み取り/書き込みを可能にするモジュールがあります。

このzipfile.ZipFileクラスにはwritestr()、文字列から直接アーカイブに「ファイル」を作成できるメソッドがあります。

したがって、アーカイブする前に文字列をファイルに書き込む必要はありません。

質問編集後に更新

あなたはアーカイブが必要ないと言いますが、リンクされたPHPコードはまさにそれを行います-PK-Zipアーカイブを作成します。Pythonでは、。を使用して同じことを行いzipfileます。これは、zipを作成し、それに1つのファイルを追加する例です。物理ファイルを使用せずにすべてメモリ内にあります。

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_stringPK-Zip形式の圧縮コンテンツになります。

送信側と受信側の両方を制御し、1つのデータチャンクで複数の圧縮ファイルを送信する必要がない場合、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

Pythonでは、zipfileモジュールを探しています-具体的にはZipFile.writestr()

zlib一般的に、あなたが話している種類の用途にはもっと多く使われていることに注意してください。

于 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 に答える