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?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
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'
Method 2
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]
Method 3
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)
Method 4
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'
Method 5
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
Method 6
you can use pathlib
from pathlib import Path Path(r"C:folder1folder2filename.xml").parts[-2]
The output of the above was this:
'folder2'
Method 7
I made an improvement on the solutions available, namely the snippet that works with all of,
- File
- Directory with a training slash
- 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 ofswithout resolving it. -
.with_name("foo")– Adds a fake filefooto the path -
.parts[-2]returns second last part of the string.-1part will befoo
Method 8
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 '\'
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0