Misunderstanding of python os.path.abspath

Most Wanted picture Most Wanted · Jul 11, 2014 · Viewed 45.1k times · Source

I have following code:

directory = r'D:\images'
for file in os.listdir(directory):
    print(os.path.abspath(file))

and I want next output:

  • D:\images\img1.jpg
  • D:\images\img2.jpg and so on

But I get different result:

  • D:\code\img1.jpg
  • D:\code\img2.jpg

where D:\code is my current working directory and this result is the same as

os.path.normpath(os.path.join(os.getcwd(), file))

So, the question is: What is the purpose of os.path.abspath while I must use

os.path.normpath(os.path.join(directory, file))

to get REAL absolute path of my file? Show real use-cases if possible.

Answer

unholysampler picture unholysampler · Jul 11, 2014

The problem is with your understanding of os.listdir() not os.path.abspath(). os.listdir() returns the names of each of the files in the directory. This will give you:

img1.jpg
img2.jpg
...

When you pass these to os.path.abspath(), they are seen as relative paths. This means it is relative to the directory from where you are executing your code. This is why you get "D:\code\img1.jpg".

Instead, what you want to do is join the file names with the directory path you are listing.

os.path.abspath(os.path.join(directory, file))