0

先週Lorem Ipsupmジェネレーターを手に入れましたが、かなりクールだと認めます。

私の質問: 上記のスクリプトの作成者が gzip ファイルの内容を文字列としてコードに投稿する方法についてのチュートリアルを教えてもらえますか? 通常のファイルを gzip で圧縮する例を引き続き取得していますが、ここでちょっと迷っています。

価値があるのは、非常によく似た別のモジュール (ランダムな名前、会社などを生成する) があり、現在、いくつかの異なるテキスト ファイルから読み取ることです。私はこのアプローチの方が好きです。プロジェクト内でデータを配置するために必要なサブディレクトリが 1 つ少なくなり、新しい方法も提供されます。

私は、ストリームや 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に格納されている base64 でエンコードされた値のバイナリ表現を含むオブジェクトを作成しています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 に答える