pythonerror-handlingfile-not-found

Python raising FileNotFoundError for file name returned by os.listdir


I was trying to iterate over the files in a directory like this:

import os

path = r'E:/somedir'

for filename in os.listdir(path):
    f = open(filename, 'r')
    ... # process the file

But Python was throwing FileNotFoundError even though the file exists:

Traceback (most recent call last):
  File "E:/ADMTM/TestT.py", line 6, in <module>
    f = open(filename, 'r')
FileNotFoundError: [Errno 2] No such file or directory: 'foo.txt'

So what is wrong here?


Solution

  • It is because os.listdir does not return the full path to the file, only the filename part; that is 'foo.txt', when open would want 'E:/somedir/foo.txt' because the file does not exist in the current directory.

    Use os.path.join to prepend the directory to your filename:

    path = r'E:/somedir'
    
    for filename in os.listdir(path):
        with open(os.path.join(path, filename)) as f:
            ... # process the file
    

    (Also, you are not closing the file; the with block will take care of it automatically).