Объект 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) возвращает содержимое как байтов без декодирования.