Given a path, how can I extract just the containing folder name?

Question:

In Python what command should I use to get the name of the folder which contains the file I’m working with?

"C:folder1folder2filename.xml"

Here "folder2" is what I want to get.

The only thing I’ve come up with is to use os.path.split twice:

folderName = os.path.split(os.path.split("C:folder1folder2filename.xml")[0])[1]

Is there any better way to do it?

Asked By: Vasily

||

Answers:

You can use dirname:

os.path.dirname(path)

Return the directory name of pathname path. This is the first element
of the pair returned by passing path to the function split().

And given the full path, then you can split normally to get the last portion of the path. For example, by using basename:

os.path.basename(path)

Return the base name of pathname path. This is the second element of
the pair returned by passing path to the function split(). Note that
the result of this function is different from the Unix basename
program; where basename for ‘/foo/bar/’ returns ‘bar’, the basename()
function returns an empty string (”).


All together:

>>> import os
>>> path=os.path.dirname("C:/folder1/folder2/filename.xml")
>>> path
'C:/folder1/folder2'
>>> os.path.basename(path)
'folder2'
Answered By: fedorqui

os.path.dirname is what you are looking for –

os.path.dirname(r"C:folder1folder2filename.xml")

Make sure you prepend r to the string so that its considered as a raw string.

Demo –

In [46]: os.path.dirname(r"C:folder1folder2filename.xml")
Out[46]: 'C:\folder1\folder2'

If you just want folder2 , you can use os.path.basename with the above, Example –

os.path.basename(os.path.dirname(r"C:folder1folder2filename.xml"))

Demo –

In [48]: os.path.basename(os.path.dirname(r"C:folder1folder2filename.xml"))
Out[48]: 'folder2'
Answered By: Anand S Kumar

You are looking to use dirname. If you only want that one directory, you can use os.path.basename,

When put all together it looks like this:

os.path.basename(os.path.dirname('dir/sub_dir/other_sub_dir/file_name.txt'))

That should get you “other_sub_dir”

The following is not the ideal approach, but I originally proposed,using os.path.split, and simply get the last item. which would look like this:

os.path.split(os.path.dirname('dir/sub_dir/other_sub_dir/file_name.txt'))[-1]
Answered By: idjaw

this is pretty old, but if you are using Python 3.4 or above use PathLib.

# using OS
import os
path=os.path.dirname("C:/folder1/folder2/filename.xml")
print(path)
print(os.path.basename(path))

# using pathlib
import pathlib
path = pathlib.PurePath("C:/folder1/folder2/filename.xml")
print(path.parent)
print(path.parent.name)
Answered By: dfresh22

You could get the full path as a string then split it into a list using your operating system’s separator character.
Then you get the program name, folder name etc by accessing the elements from the end of the list using negative indices.

Like this:

import os
strPath = os.path.realpath(__file__)
print( f"Full Path    :{strPath}" )
nmFolders = strPath.split( os.path.sep )
print( "List of Folders:", nmFolders )
print( f"Program Name :{nmFolders[-1]}" )
print( f"Folder Name  :{nmFolders[-2]}" )
print( f"Folder Parent:{nmFolders[-3]}" )

The output of the above was this:

Full Path    :C:UsersterryDocumentsappsenvironmentsdevapp_02app_02.py
List of Folders: ['C:', 'Users', 'terry', 'Documents', 'apps', 'environments', 'dev', 'app_02', 'app_02.py']
Program Name :app_02.py
Folder Name  :app_02
Folder Parent:dev
Answered By: tjd sydney

you can use pathlib

from pathlib import Path
Path(r"C:folder1folder2filename.xml").parts[-2]

The output of the above was this:

'folder2'
Answered By: Allen Jing

I’m using 2 ways to get the same response:
one of them use:

   os.path.basename(filename)

due to errors that I found in my script I changed to:

Path = filename[:(len(filename)-len(os.path.basename(filename)))]

it’s a workaround due to python’s '\'

Answered By: Renato Alves

I made an improvement on the solutions available, namely the snippet that works with all of,

  1. File
  2. Directory with a training slash
  3. Directory without a training slash

My solution is,

from pathlib import Path

def path_lastname(s):
    Path(s).with_name("foo").parts[-2]

Explanation

  • Path(s) – Creates a custom Path object out of s without resolving it.

  • .with_name("foo") – Adds a fake file foo to the path

  • .parts[-2] returns second last part of the string. -1 part will be foo

Answered By: TAbdiukov
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.