我正试图使用http://grantcox.com.au/2012/01/decoding-b4u-binary-file-format/Python代码将.b4u文件导出为HTML格式,但由于某些原因,在程序点之后:
# find the initial caret position - this changes between files for some reason - search for the "Cards" string
for i in range(3):
addr = 104 + i*4
if ''.join(self.parser.read('sssss', addr)) == 'Cards':
caret = addr + 32
break
if caret is None:
return
我得到以下错误:
if ''.join(self.parser.read('sssss', addr)) == 'Cards':
TypeError: sequence item 0: expected str instance, bytes found
我使用的Python版本是:Python 3.3.1(v3.3.1:d9893d13c628 2013年4月6日,20:25:12)。
你知道怎么解决这个问题吗?
最佳答案
我让它在Python2.7.4下工作,我的Python3.3.2也给出了同样的错误。如果我发现如何将这段代码移植到Python3,我会给您回复的。x.x必须与Python3中字符串的默认unicode有关。
我想出了一个解决办法:
def read(self, fmt, offset):
if self.filedata is None:
return None
read = struct.unpack_from('<' + fmt, self.filedata, offset)
xread = []
for each in range(0,len(read)):
try:
xread.append(read[each].decode())
except:
xread.append(read[each])
read = xread
if len(read) == 1:
return read[0]
return read
def string(self, offset):
if self.filedata is None:
return None
s = u''
if offset > 0:
length = self.read('H', offset)
for i in range(length):
raw = self.read('H', offset + i*2 +2)
char = raw ^ 0x7E
s = s + chr(char)
return s
def plain_fixed_string(self, offset):
if self.filedata is None:
return None
plain_bytes = struct.unpack_from('<ssssssssssssssssssssssss', self.filedata, offset)
xplain_bytes = []
for each in range(0,len(plain_bytes)):
try:
xplain_bytes.append(plain_bytes[each].decode())
except:
xplain_bytes.append(plain_bytes[each])
plain_bytes = xplain_bytes
plain_string = ''.join(plain_bytes).strip('\0x0')
return plain_string
您可以使用这些方法,而不是由原始作者提供。
注意,如果您在任何地方看到unicode()时,也应该将其更改为str(),将unichr()更改为chr()。还要记住,print是一个函数,没有括号()就不能使用。
关于python - Python-读取.b4u文件-错误序列项0:预期的str实例,找到的字节,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16125451/