2011-05-17 17 views
1

7z DLLを使用して1つの圧縮ファイルに少量のデータを追加したいとします。現時点では私の推測では、7zファイルの圧縮を解除し、データを追加して再圧縮します。明らかに、これは、7zファイルのサイズが大きくなると(例えば1GB)、毎秒新しいチャンクを保存したい場合、優れたソリューションパフォーマンスが得策ではありません。どのように私はこれをより良い方法で行うことができますか?7z DLLを使用して多数の小さなデータを圧縮してファイルに追加する方法

7z DLLでサポートされている圧縮形式を使用できます。

+2

ctypesインターフェイス。 –

+1

@Jakob Bowyer:答えとして回答を投稿してください。私たちはそれをupvoteして適切にコメントすることができます。 –

+0

それは答えよりもポインタだったが、確かに。 –

答えて

0

これは私の回答ではありません。

How can I use a DLL file from Python?

私はctypesが進むべき道だと思います。

次のctypesの例は、私が書いた実際のコード(Python 2.5)です。これは、私があなたが求めていることをして見つけた最も簡単な方法でした。

import ctypes 

# Load DLL into memory. 

hllDll = ctypes.WinDLL ("c:\\PComm\\ehlapi32.dll") 

# Set up prototype and parameters for the desired function call. 
# HLLAPI 

hllApiProto = ctypes.WINFUNCTYPE (ctypes.c_int,ctypes.c_void_p, 
    ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p) 
hllApiParams = (1, "p1", 0), (1, "p2", 0), (1, "p3",0), (1, "p4",0), 

# Actually map the call ("HLLAPI(...)") to a Python name. 

hllApi = hllApiProto (("HLLAPI", hllDll), hllApiParams) 

# This is how you can actually call the DLL function. 
# Set up the variables and call the Python name with them. 

p1 = ctypes.c_int (1) 
p2 = ctypes.c_char_p (sessionVar) 
p3 = ctypes.c_int (1) 
p4 = ctypes.c_int (0) 
hllApi (ctypes.byref (p1), p2, ctypes.byref (p3), ctypes.byref (p4)) 

のctypesのものは、すべてのC型データ・タイプ(整数、文字、ショート、ボイド*、...)を有し、値または参照によって渡すことができます。私の例はそれをしませんが(HLL APIは参照渡しの変数を変更して値を返します)、特定のデータ型を返すこともできます。

2

Python LZMA bindings(LZMAは7zの圧縮アルゴリズム名です)を見てください。あなたはctypesのものがなければ何をしても構いません。確認する

EDIT

が、py7zlib.pyで簡単に見には、7Zファイルを読み込むための唯一のサポートを示して書いていません。しかしsrcディレクトリにはpylzma_compressfile.cがあるので、何かするべきことがあるかもしれません。

EDIT 2

pylzma.compressfile機能があり、そう罰金のようです。

+0

毎回ファイル全体を再圧縮せずに、たくさんの小さなデータを1つのファイルに圧縮するにはどうしたらいいですか? – David

関連する問題