In Python I'm accessing a binary file by reading it into a string and then using struct.unpack(...)
. Now I want to write to that string using struct.pack_into(...)
, but I get the error "Cannot use string as modifiable buffer". What would be a suitable buffer for use with the struct
module?
views:
298answers:
3
+4
A:
If you aren't trying to pack it into a specific object, just use struct.pack
to return a string.
Otherwise, ctypes.create_string_buffer
is one way to obtain a mutable buffer.
Mark Rushakoff
2009-11-14 00:12:45
The buffer is the memory for a simple virtual machine, so I need to pack into a specific object. The memory is small but copying 128-512k for a single memory access is not an option.
mdm
2009-11-14 00:24:14
+5
A:
As noted in another answer, struct_pack
is probably all you need and should use. However, objects of type array support the buffer protocol and can be modified:
>>> import array, struct
>>> a = array.array('c', ' ' * 1000)
>>> c = 'a'; i = 1
>>> struct.pack_into('ci', a, -0, c, i)
>>> a
array('c', 'a\x00\x00\x00\x01\x00\x00\x00 ...
The original buffer protocol was a bit of a hack primarily for C extensions. It has been deprecated and replaced by a new C-level buffer API and memoryview objects in Python 3 (and in the upcoming 2.7).
Ned Deily
2009-11-14 00:30:50