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

0

これを再現できません。私の Python 3.3.2 インストール (Win7 x64) では、bytesオブジェクトのスライスは通常どおりに機能します。

>>> b"1234"[0]
49

でも

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

したがって、ファイルをバイナリ モードで開いていない可能性があります。

于 2013-05-30T13:55:46.847 に答える
0

これを行う

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

そして、トレースバックに従います。ファイルがどこかでテキストモードで開かれていることがわかります

于 2013-05-30T14:03:00.117 に答える