Get folder name of the file in Python

PythonPython 3.xDirectory

Python Problem Overview


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

"C:\folder1\folder2\filename.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:\folder1\folder2\filename.xml")[0])[1]

Is there any better way to do it?

Python Solutions


Solution 1 - Python

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'

Solution 2 - Python

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]

Solution 3 - Python

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)

Solution 4 - Python

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

os.path.dirname(r"C:\folder1\folder2\filename.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:\folder1\folder2\filename.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:\folder1\folder2\filename.xml"))

Demo -

In [48]: os.path.basename(os.path.dirname(r"C:\folder1\folder2\filename.xml"))
Out[48]: 'folder2'

Solution 5 - Python

you can use pathlib

from pathlib import Path
Path(r"C:\folder1\folder2\filename.xml").parts[-2]

The output of the above was this:

'folder2'

Solution 6 - Python

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:\Users\terry\Documents\apps\environments\dev\app_02\app_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

Solution 7 - Python

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

Solution 8 - Python

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 '\\'

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionVasilyView Question on Stackoverflow
Solution 1 - PythonfedorquiView Answer on Stackoverflow
Solution 2 - PythonidjawView Answer on Stackoverflow
Solution 3 - Pythondfresh22View Answer on Stackoverflow
Solution 4 - PythonAnand S KumarView Answer on Stackoverflow
Solution 5 - PythonAllen JingView Answer on Stackoverflow
Solution 6 - Pythontjd sydneyView Answer on Stackoverflow
Solution 7 - PythonTAbdiukovView Answer on Stackoverflow
Solution 8 - PythonRenato AlvesView Answer on Stackoverflow