Estrarre una parte del percorso file (una directory) in Python


163

Ho bisogno di estrarre il nome della directory principale di un determinato percorso. Ecco come appare:

c:\stuff\directory_i_need\subdir\file

Sto modificando il contenuto del "file" con qualcosa che usa il directory_i_neednome (non il percorso). Ho creato una funzione che mi darà un elenco di tutti i file e quindi ...

for path in file_list:
   #directory_name = os.path.dirname(path)   # this is not what I need, that's why it is commented
   directories, files = path.split('\\')

   line_replace_add_directory = line_replace + directories  
   # this is what I want to add in the text, with the directory name at the end 
   # of the line.

Come lo posso fare?


1
Potresti voler dare un'occhiata a questa risposta: stackoverflow.com/a/4580931/311220
Ghianda

Il link sopra mi ha aiutato a capire come risolvere ciò che ho fatto di sbagliato. Grazie.
Thalia,

Risposte:


238
import os
## first file in current dir (with full path)
file = os.path.join(os.getcwd(), os.listdir(os.getcwd())[0])
file
os.path.dirname(file) ## directory of file
os.path.dirname(os.path.dirname(file)) ## directory of directory of file
...

E puoi continuare a farlo tutte le volte che è necessario ...

Modifica: da os.path , è possibile utilizzare os.path.split o os.path.basename:

dir = os.path.dirname(os.path.dirname(file)) ## dir of dir of file
## once you're at the directory level you want, with the desired directory as the final path node:
dirname1 = os.path.basename(dir) 
dirname2 = os.path.split(dir)[1] ## if you look at the documentation, this is exactly what os.path.basename does.

Estrae parti del percorso, ma non so come estrarre il nome della directory effettiva dal percorso.
Thalia,

43

In Python 3.4 puoi usare il modulo pathlib :

>>> from pathlib import Path
>>> p = Path('C:\Program Files\Internet Explorer\iexplore.exe')
>>> p.name
'iexplore.exe'
>>> p.suffix
'.exe'
>>> p.root
'\\'
>>> p.parts
('C:\\', 'Program Files', 'Internet Explorer', 'iexplore.exe')
>>> p.relative_to('C:\Program Files')
WindowsPath('Internet Explorer/iexplore.exe')
>>> p.exists()
True

bella dimostrazione dell'API
Nadim Farhat

Questo è stato anche riportato alle versioni precedenti di Python: pathlib2
phoenix,

11

Tutto ciò di cui hai bisogno è parentparte se lo usi pathlib.

from pathlib import Path
p = Path(r'C:\Program Files\Internet Explorer\iexplore.exe')
print(p.parent) 

Uscita:

C:\Program Files\Internet Explorer    

Nel caso in cui siano necessarie tutte le parti (già trattate in altre risposte) utilizzare parts:

p = Path(r'C:\Program Files\Internet Explorer\iexplore.exe')
print(p.parts) 

Quindi otterrai un elenco:

('C:\\', 'Program Files', 'Internet Explorer', 'iexplore.exe')

Salva il tono del tempo.


5

Per prima cosa, vedi se hai splitunc()una funzione disponibile all'interno os.path. Il primo oggetto restituito dovrebbe essere quello che vuoi ... ma sono su Linux e non ho questa funzione durante l'importazioneos e provo a usarlo.

Altrimenti, un modo semi-brutto che fa il lavoro è usare:

>>> pathname = "\\C:\\mystuff\\project\\file.py"
>>> pathname
'\\C:\\mystuff\\project\\file.py'
>>> print pathname
\C:\mystuff\project\file.py
>>> "\\".join(pathname.split('\\')[:-2])
'\\C:\\mystuff'
>>> "\\".join(pathname.split('\\')[:-1])
'\\C:\\mystuff\\project'

che mostra il recupero della directory appena sopra il file e la directory appena sopra quella.


Ho modificato la mia voce per mostrare l'uso di rsplit che fa quello che mi suggerisci, ma mi dà ancora il percorso non solo il nome della directory.
Thalia,

1
Non sono ancora chiaro cosa stai chiedendo. Perché non togli tutto a sinistra della prossima istanza superiore di \\ allora? Fai finta di volere il percorso, quindi mantieni l'ultima voce quando lo dividi su \\. Questo dovrebbe funzionare, no?
ely,

Ho finito per dividere il percorso e prendere il pezzo che volevo, non ha funzionato prima ma dopo aver letto tutte queste risposte, ho scoperto cosa avevo fatto di sbagliato.
Thalia,

Se leggere le risposte ti ha aiutato, considera almeno di votarle e, eventualmente, accettarne una. Sono contento che tu abbia notato l'errore però.
ely,

Mi piace il modo in cui funziona questo modo semi-brutto. Cambio "\\" con un semplice os.sep e funziona perfettamente per recuperare solo una frazione di percorso.
Tazger,

1

Questo è quello che ho fatto per estrarre il pezzo della directory:

for path in file_list:
  directories = path.rsplit('\\')
  directories.reverse()
  line_replace_add_directory = line_replace+directories[2]

Grazie per l'aiuto.


0
import os

directory = os.path.abspath('\\') # root directory
print(directory) # e.g. 'C:\'

directory = os.path.abspath('.') # current directory
print(directory) # e.g. 'C:\Users\User\Desktop'

parent_directory, directory_name = os.path.split(directory)
print(directory_name) # e.g. 'Desktop'
parent_parent_directory, parent_directory_name = os.path.split(parent_directory)
print(parent_directory_name) # e.g. 'User'

Questo dovrebbe anche fare il trucco.


-1

Devi inserire l'intero percorso come parametro in os.path.split. Vedi i documenti . Non funziona come lo split delle stringhe.


Questo non funzionerà su percorsi di tipo UNC su Windows, come lo stato roba dei documenti Python per os.path.
ely,
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.