2013-05-30 3 views
2

Не знаю, является ли это ошибкой или нет, но мой скрипт больше не работает на Python 3.3, пока он отлично работает на Python 3.2.Python 3.3 vs Python 3.2 issue

У меня есть функция генератора, чтобы вернуть байты из двоичного файла, как так:

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:] - это «байты». Это так, как ожидалось.

С 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

+5

С моей установкой Python 3.3.2 (Win7 x64) 'block [0]' по-прежнему является 'int',' block [1:] 'является объектом' bytes'. –

+8

На 100% уверены, что вы все еще открываете 'trace_stream' как двоичный файл? Ваша проблема воспроизводится только при использовании файлов, открытых в текстовом режиме. –

+0

Как общее предложение: * Никогда не публикуйте скриншоты текстовых данных! *. Вы можете скопировать-вставить текст с консоли. Таким образом, другие люди могут копировать то, что вы набрали, люди, ищущие из Google, могут найти совпадение с кодом, который вы вводите, и т. Д. Использование изображений - всего лишь пустая трата пропускной способности. – Bakuriu

ответ

0

Я не могу воспроизвести это. В моей установки Python 3.3.2 (Win7 x64), bytes объект нарезка работает именно так, как он всегда имеет:

>>> b"1234"[0] 
49 

Однако

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

Таким образом, вы, вероятно, не открывая файл в двоичном Режим.

+0

Я использую идентичный скрипт, работающий под обоими интерпретаторами. Как показано выше, он открывается в режиме чтения-двоичный. Как и вы, я на Windows 7-64bit. – ACRL

0

ли это

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

И следовать отслеживающий. Вы увидите, что файл открывается в текстовом режиме где-то

1

OK Я обнаружил проблему. По какой-то причине, когда я запускал ее в первый раз из командной строки, я думал, что интерпретатор Python3.3 запущен, так как это первый в моем пути, но вместо этого должен работать интерпретатор Python 2.7. Когда я дал полный путь к интерпретатору python3.3, он работает.