我有一个文件,其中有些行是我可以忽略的元数据,有些行是 struct.pack 调用的打印结果。说 f.txt 是:
key: 3175
\x00\x00\x00\x00\x00\x00\x00\x00
key: 3266
\x00\x00\x00\x00\x00\x00\x00\x00
在这种情况下,以“key”开头的行是元数据,字节字符串是我要提取的值。同样在这种情况下,两个字节字符串行是使用 struct.pack('d', 0) 生成的。以下代码是我想做的:
import struct
for line in open('f.txt', 'r'):
# if not metadata, remove newline character and unpack
if line[0:3] != 'key':
val = struct.unpack('d', line[0:-1])
appendToList(val) # do something else with val
有了这个,我得到:“struct.error:unpack 需要一个长度为 8 的字符串参数”。
如果我们稍微修改一下代码:
import struct
for line in open('f.txt', 'r'):
# if not metadata, remove newline character and unpack
if line[0:3] != 'key': print line[:-1]
然后输出如预期:
\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00
如果我将字节字符串直接放入 unpack 调用中,我就成功了:
import struct
# successful unpacking
struct.unpack('d', '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
我尝试将以下行的变体传递给解包,所有这些都给出相同的结果:
str(line)
repr(line)
b"%s" % line