不知道这是不是一个bug,但我的脚本不再适用于Python 3.3,而它在Python 3.2上运行良好。
我有一个生成器函数来从二进制文件返回字节,如下所示:
def yield_record(infile, size = 1):
while True:
block = infile.read(size)
if len(block) == 0:
break
else:
yield (block[0], block[1:])
我的问题
使用Python 3.2,块[0]的类型是'int',块[1:]的类型是'bytes'。这是预期的。
使用Python 3.3,块[0]的类型是'str',块[1:]的类型也是'str'。这不是预期的,会导致接收数据的代码失败。
任何人都知道是什么?
以下是使用生成器的代码。
with open(infilename, mode='rb') as trace_stream:
# create an empty list of trace records
trace = []
record_count = 0
# iterate over each record in the binary stream
for record_type, record_data in yield_record(trace_stream,
size=RECORD_LENGTH):
record_count += 1
try:
# determine what class this record belongs to
record_class = RECORD_CLASS[record_type]
# instantiate the new record
new_record = record_class(record_data)
# append this new record to our trace
trace.append(new_record)
except KeyError as err:
print("Unhandled Record Type: {0} Record: {1}".format(record_type, record_count))
谢谢,
这是一个截屏。
答案 0 :(得分:1)
好的,我发现了这个问题。出于某种原因,当我第一次从命令行运行它时,我认为Python3.3解释器正在运行,因为这是我路径中的第一个,但Python 2.7解释器必须运行。当我给出python3.3解释器的完整路径时,它可以工作。
答案 1 :(得分:0)
我无法重现这一点。在我的Python 3.3.2安装(Win7 x64)中,bytes
对象切片的工作方式与以往一样:
>>> b"1234"[0]
49
然而
>>> "1234"[0]
'1'
因此,您可能无法以二进制模式打开文件。
答案 2 :(得分:0)
这样做
while True:
block = infile.read(size)
assert isinstance(block[0], int)
并按照追溯。您将看到文件正在某处以文本模式打开