geo1230 geo1230 - 1 year ago 119
Python Question

os.walk(directory) - AttributeError: 'tuple' object has no attribute 'endswith'

I am trying to make a script in python to search for certain type of files (eg:

, etc.). I started searching around for quite a while (including posts here in SO) and I found the following snippet of code:

for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith('.txt'):
print file

However, I can't understand why
root, dirs, files
is used. For example, if I just use
for file in os.walk(directory)
it throws the error:

"AttributeError: 'tuple' object has no attribute 'endswith'".

What am I missing here?

Thanks in advance!

Answer Source

The reason why you use root, dirs, files with os.walk is described in the docs:

For each directory in the tree rooted at directory top (including top itself), it yields a 3-tuple (dirpath, dirnames, filenames).

so, using root, dirs, files is a Pythonic way of handling this 3-tuple yield. Otherwise, you'd have to do something like:

data = os.walk('/')
for _ in data:
    root = _[0]
    dirs = _[1]
    files = _[2]

Tuples don't have an endswith attribute. Strings, which may or may not be contained in the tuple, do.