Ottieni il nome della cartella del file in Python


93

In Python quale comando devo usare per ottenere il nome della cartella che contiene il file con cui sto lavorando?

"C:\folder1\folder2\filename.xml"

Qui "folder2" cosa voglio ottenere.

L'unica cosa che ho pensato è di usare os.path.splitdue volte:

folderName = os.path.split(os.path.split("C:\folder1\folder2\filename.xml")[0])[1]

C'è un modo migliore per farlo?


Risposte:


173

Puoi usare dirname:

os.path.dirname(path)

Restituisce il nome della directory del pathname path. Questo è il primo elemento della coppia restituito passando il percorso alla funzione split ().

E dato il percorso completo, puoi dividere normalmente per ottenere l'ultima parte del percorso. Ad esempio, utilizzando basename:

os.path.basename(path)

Restituisce il nome di base del pathname path. Questo è il secondo elemento della coppia restituito passando il percorso alla funzione split (). Notare che il risultato di questa funzione è diverso dal programma di nome base Unix; dove basename per '/ foo / bar /' restituisce 'bar', la funzione basename () restituisce una stringa vuota ('').


Tutti insieme:

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

17

Stai cercando di usare dirname . Se vuoi solo quella directory, puoi usare os.path.basename ,

Quando messi insieme, assomiglia a questo:

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

Questo dovrebbe portarti "other_sub_dir"

Il seguente non è l'approccio ideale, ma originariamente ho proposto, usando os.path.split, e semplicemente ottieni l'ultimo elemento. che sarebbe simile a questo:

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

9

questo è piuttosto vecchio, ma se stai usando Python 3.4 o successivo usa 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)

8

os.path.dirname è quello che stai cercando -

os.path.dirname(r"C:\folder1\folder2\filename.xml")

Assicurati di anteporre r la stringa in modo che venga considerata come una stringa non elaborata.

Demo -

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

Se vuoi solo folder2, puoi usare os.path.basenamecon quanto sopra, Esempio -

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'

1

È possibile ottenere il percorso completo come stringa e quindi dividerlo in un elenco utilizzando il carattere separatore del sistema operativo. Quindi ottieni il nome del programma, il nome della cartella ecc. Accedendo agli elementi dalla fine dell'elenco utilizzando indici negativi.

Come questo:

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]}" )

L'output di quanto sopra era questo:

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

1

puoi usare pathlib

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

L'output di quanto sopra era questo:

'folder2'

0

Sto usando 2 modi per ottenere la stessa risposta: uno di loro usa:

   os.path.basename(filename)

a causa di errori che ho trovato nel mio script sono passato a:

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

è una soluzione alternativa a causa di python '\\'

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.