Python 3.3 vs Python 3.2问题

时间:2013-05-30 13:47:12

标签: python python-3.x

不知道这是不是一个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))

谢谢,

这是一个截屏。

enter image description here

3 个答案:

答案 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)

并按照追溯。您将看到文件正在某处以文本模式打开