Get absolute paths of all files in a directory

Question:

How do I get the absolute paths of all the files in a directory that could have many sub-folders in Python?

I know os.walk() recursively gives me a list of directories and files, but that doesn’t seem to get me what I want.

Asked By: madCode

||

Answers:

If the argument given to os.walk is absolute, then the root dir names yielded during iteration will also be absolute. So, you only need to join them with the filenames:

import os

for root, dirs, files in os.walk(os.path.abspath("../path/to/dir/")):
    for file in files:
        print(os.path.join(root, file))
Answered By: wim

You can use os.path.abspath() to turn relative paths into absolute paths:

file_paths = []

for folder, subs, files in os.walk(rootdir):
  for filename in files:
    file_paths.append(os.path.abspath(os.path.join(folder, filename)))
Answered By: Blender

os.path.abspath makes sure a path is absolute. Use the following helper function:

import os

def absoluteFilePaths(directory):
    for dirpath,_,filenames in os.walk(directory):
        for f in filenames:
            yield os.path.abspath(os.path.join(dirpath, f))
Answered By: phihag

Try:

import os

for root, dirs, files in os.walk('.'):
    for file in files:
        p=os.path.join(root,file)
        print p
        print os.path.abspath(p)
        print
Answered By: the wolf

I wanted to keep the subdirectory details and not the files and wanted only subdirs with one xml file in them. I can do it this way:

for rootDirectory, subDirectories, files in os.walk(eventDirectory):
  for subDirectory in subDirectories:
    absSubDir = os.path.join(rootDirectory, subDirectory)
    if len(glob.glob(os.path.join(absSubDir, "*.xml"))) == 1:
      print "Parsing information in " + absSubDir
Answered By: Eamonn Kenny

If you have Python 3.4 or newer you can use pathlib (or a third-party backport if you have an older Python version):

import pathlib
for filepath in pathlib.Path(directory).glob('**/*'):
    print(filepath.absolute())
Answered By: MSeifert
from glob import glob


def absolute_file_paths(directory):
    return glob(join(directory, "**"))
Answered By: AmjadHD
for root, directories, filenames in os.walk(directory):
 for directory in directories:
         print os.path.join(root, directory)
 for filename in filenames:
     if filename.endswith(".JPG"):
        print filename
        print os.path.join(root,filename)
Answered By: Robert A

All files and folders:

x = [os.path.abspath(os.path.join(directory, p)) for p in os.listdir(directory)]

Images (.jpg | .png):

x = [os.path.abspath(os.path.join(directory, p)) for p in os.listdir(directory) if p.endswith(('jpg', 'png'))]
Answered By: user3041840

Try:

from pathlib import Path
path = 'Desktop'
files = filter(lambda filepath: filepath.is_file(), Path(path).glob('*'))
for file in files:
   print(file.absolute())
Answered By: Pygirl

Starting with python 3.5 the idiomatic solution would be:

import os

def absolute_file_paths(directory):
    path = os.path.abspath(directory)
    return [entry.path for entry in os.scandir(path) if entry.is_file()]

This not just reads nicer but also is faster in many cases.
For more details (like ignoring symlinks) see original python docs:
https://docs.python.org/3/library/os.html#os.scandir

Answered By: Titusz

Try This

pth=''
types=os.listdir(pth)
for type_ in types:
     file_names=os.listdir(f'{pth}/{type_}')
     file_names=list(map(lambda x:f'{pth}/{type_}/{x}',file_names))
     train_folder+=file_names
Answered By: Tom Huang

glob library will give you what you need directly:

from glob import glob
list_of_files = glob('your/directory/*')
Answered By: Maiia Bocharova
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.