Do I need to pass the full path of a file in another directory to open()?

62

I have a folder with ten files in it which I want to loop through. When I print out the name of the file my code works fine:

import os
indir = '/home/des/test'
for root, dirs, filenames in os.walk(indir):
    for f in filenames:
        print(f)

Which prints:

1
2
3
4
5
6
7
8
9
10

But if I try to open the file in the loop I get an IO error:

import os
indir = '/home/des/test'
for root, dirs, filenames in os.walk(indir):
    for f in filenames:
        log = open(f, 'r')

Traceback (most recent call last):
File "/home/des/my_python_progs/loop_over_dir.py", line 6, in <module>
log = open(f, 'r')
IOError: [Errno 2] No such file or directory: '1'
>>> 

Do I need to pass the full path of the file even inside the loop to open() them?

This question is tagged with python file-io absolute-path

~ Asked on 2012-08-03 18:30:01

The Best Answer is


26

Yes, you need the full path.

log = open(os.path.join(root, f), 'r')

Is the quick fix. As the comment pointed out, os.walk decends into subdirs so you do need to use the current directory root rather than indir as the base for the path join.

~ Answered on 2012-08-03 18:32:00


92

If you are just looking for the files in a single directory (ie you are not trying to traverse a directory tree, which it doesn't look like), why not simply use os.listdir():

import os  
for fn in os.listdir('.'):
     if os.path.isfile(fn):
        print (fn)

in place of os.walk(). You can specify a directory path as a parameter for os.listdir(). os.path.isfile() will determine if the given filename is for a file.

~ Answered on 2012-08-03 18:32:13


Most Viewed Questions: