我想使用 7z DLL 将少量数据附加到一个压缩文件中。目前我最好的猜测是解压缩 7z 文件,附加数据,然后重新压缩它。显然,如果 7z 文件的大小变大(比如 1 gb)并且我想每秒保存一个新块,这不是一个好的解决方案性能。我怎样才能以更好的方式做到这一点?
我可以使用 7z DLL 支持的任何压缩格式。
我想使用 7z DLL 将少量数据附加到一个压缩文件中。目前我最好的猜测是解压缩 7z 文件,附加数据,然后重新压缩它。显然,如果 7z 文件的大小变大(比如 1 gb)并且我想每秒保存一个新块,这不是一个好的解决方案性能。我怎样才能以更好的方式做到这一点?
我可以使用 7z DLL 支持的任何压缩格式。
看看Python LZMA 绑定(LZMA 是 7z 的压缩算法名称),你应该在没有 ctypes 的情况下做你想做的事。
编辑
有待确认,但快速查看py7zlib.py显示仅支持读取 7z 文件,不支持写入。但是在 src 目录中有一个pylzma_compressfile.c
,所以也许有一些事情要做。
编辑 2
pylzma.compressfile 函数似乎在那里,很好。
这不是我的答案。
我认为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 类型的数据类型(int、char、short、void*、...),并且可以按值或引用传递。它也可以返回特定的数据类型,尽管我的示例没有这样做(HLL API 通过修改通过引用传递的变量来返回值)。