Объект Map не имеет len() в Python 3

У меня есть этот инструмент Python, написанный кем-то другим, чтобы запустить определенный микроконтроллер, но он написал этот инструмент для Python 2.6, и я использую Python 3.3.

Итак, большинство из них я портировал, но эта строка создает проблемы:

data = map(lambda c: ord(c), file(args[0], 'rb').read()) 

Функция file не существует в Python 3 и должна быть заменена на open. Но тогда функция, которая получает data в качестве аргумента, вызывает исключение: "TypeError: объект типа" map "не имеет len()".

Но то, что я вижу до сих пор в документации, заключается в том, что map должен присоединиться к итерабельным типам к одному большому итерабельному, я что-то упустил?

Что мне нужно сделать, чтобы перенести это на Python 3?

Ответы

Ответ 1

В Python 3, map возвращает итератор. Если ваша функция ожидает список, итератор должен быть явно преобразован, например:

data = list(map(...))

И мы можем сделать это просто, как этот

with open(args[0], "rb") as input_file:
    data = list(input_file.read())

rb относится к чтению в двоичном режиме. Таким образом, он фактически возвращает байты. Итак, нам просто нужно преобразовать их в список.

Цитата из open docs,

Python различает двоичный и текстовый ввод-вывод. Файлы, открытые в двоичный режим (включая "b" в аргументе mode) возвращает содержимое как байтов без декодирования.