一部の行が無視できるメタデータであり、一部の行が struct.pack 呼び出しの出力結果であるファイルがあります。f.txt は次のとおりです。
key: 3175
\x00\x00\x00\x00\x00\x00\x00\x00
key: 3266
\x00\x00\x00\x00\x00\x00\x00\x00
この場合、「キー」で始まる行はメタデータであり、バイト文字列は抽出したい値です。この場合も、2 バイトの文字列行が 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')
次のバリエーションの行を unpack に渡そうとしましたが、すべて同じ結果が得られます。
str(line)
repr(line)
b"%s" % line