2016-06-01 12 views
3

tarアーカイブに直接ファイルを作成する可能性はありますか?
コンテキスト:私はStringとして何らかの種類のコンテンツを作成するメソッドを持っています。このコンテンツをtarアーカイブにファイルとして保存したいと思います。 tmpファイルを作成する必要がありますか、またはtarアーカイブに直接ファイルを作成する可能性があります。まずファイルを保存せずにtarアーカイブにファイルを追加します

def save_files_to_tar(tarname): 
    archive = tarfile.open(tarname, mode='w') 
    for _ in range(some_number): 
     content = get_content() 
     # HERE add content to tar 
+0

[完全な圧縮tarファイルをPythonで作成するにはどうすればいいですか?](http://stackoverflow.com/questions/2032403/how-to-create-full-compressed-tar-file-using-python) – Will

+0

私はtar.gzファイルを必要としないので、この投稿は適用されません。 – PKuhn

+0

これは重複としては見えません。焦点はtarアーカイブに "Moved"するファイルの作成を避けることです。私は2番目の@pacholikを "考えて"これは明らかに 'import tarfile'の後では(ドキュメンテーションを引用して)可能ではありません" tarアーカイブは一連のブロックです。アーカイブメンバ(格納ファイル)はヘッダブロックデータブロックが続きます。また、APIをスキミングすることで、モジュールがメモリチャンク/変数の種類を受け入れて、メンバーとしてアーカイブに直接入れることはできません。しかし、@Ronanは、StingIO(またはcStringIO?)を介してオブジェクトのようなファイルを作成する可能性があることを示唆しています。 – Dilettant

答えて

4

は、私はあなたがメモリ内のオブジェクトのようなファイルを作成するには、StringIOをを使用し、そのように、偽のファイルを記述するためにはTarInfoを使うべきだと思う:

import StringIO 
import tarfile 

archive = tarfile.open(tarname, mode='w') 
for _ in range(some_number): 
    content = get_content() 
    s = StringIO.StringIO() 
    s.write(content) 
    s.seek(0) 
    tarinfo = tarfile.TarInfo(name="my filename") 
    tarinfo.size = len(s.buf) 
    archive.addfile(tarinfo=tarinfo, fileobj=s) 

archive.close() 

ホープ、このことができます。

+0

もちろん、そのコードのほとんどをsave_files_to_tar関数に置く必要があります。 – Ronan

+0

一時ファイル(エレガンス以外)を惜しまないために、パフォーマンスに関連する可能性があるので、 'cStringio'を提供することをお勧めしますか? – Dilettant

+0

真のcStringIOは、より良いperfsのためにまったく同じ使い方をしています。あなたがカスタム動作を必要としない限り、@DilettantのようにcStringIOを使うべきです。 – Ronan

関連する問題