2

不知道这是否是一个错误,但我的脚本不再适用于 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 中,block[0] 的类型是“int”,block[1:] 的类型是“bytes”。这正如预期的那样。

在 Python 3.3 中,block[0] 的类型是“str”,block[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))

谢谢,

这是一个屏幕截图。

在此处输入图像描述

4

3 回答 3

1

好的,我发现了问题。出于某种原因,当我第一次从命令行运行它时,我认为 Python3.3 解释器正在运行,因为这是我路径中的第一个,但 Python 2.7 解释器必须已经运行。当我给出 python3.3 解释器的完整路径时,它可以工作。

于 2013-05-30T14:11:04.913 回答
0

做这个

while True:
    block = infile.read(size)
    assert isinstance(block[0], int)

并跟踪回溯。您会看到文件在某处以文本模式打开

于 2013-05-30T14:03:00.117 回答
0

我无法重现这个。在我的 Python 3.3.2 安装 (Win7 x64) 中,bytes对象切片的工作方式与往常一样:

>>> b"1234"[0]
49

然而

>>> "1234"[0]
'1'

因此,您可能没有以二进制模式打开文件。

于 2013-05-30T13:55:46.847 回答