Map object has no len() in Python 3

Question:

I have this Python tool written by someone else to flash a certain microcontroller, but he has written this tool for Python 2.6 and I am using Python 3.3.

So, most of it I got ported, but this line is making problems:

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

The file function does not exist in Python 3 and has to be replaced with open. But then, a function which gets data as an argument causes an exception:

TypeError: object of type 'map' has no len()

But what I see so far in the documentation is, that map has to join iterable types to one big iterable, am I missing something?

What do I have to do to port this to Python 3?

Asked By: user3219624

||

Answers:

In Python 3, map returns an iterator. If your function expects a list, the iterator has to be explicitly converted, like this:

data = list(map(...))

And we can do it simply, like this

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

rb refers to read in binary mode. So, it actually returns the bytes. So, we just have to convert them to a list.

Quoting from the open‘s docs,

Python distinguishes between binary and text I/O. Files opened in
binary mode (including ‘b’ in the mode argument) return contents as
bytes objects without any decoding.

Answered By: thefourtheye
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.