Extrahieren Sie einen Teil des Dateipfads (ein Verzeichnis) in Python

162

Ich muss den Namen des übergeordneten Verzeichnisses eines bestimmten Pfads extrahieren. So sieht es aus:

c:\stuff\directory_i_need\subdir\file

Ich ändere den Inhalt der "Datei" mit etwas, das den directory_i_needNamen darin verwendet (nicht den Pfad). Ich habe eine Funktion erstellt, die mir eine Liste aller Dateien gibt, und dann ...

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.

Wie kann ich das machen?

Thalia
quelle
1
Vielleicht möchten Sie diese Antwort überprüfen: stackoverflow.com/a/4580931/311220
Acorn
Der obige Link hat mir geholfen zu verstehen, wie ich das beheben kann, was ich falsch gemacht habe. Danke dir.
Thalia
oder dieses: stackoverflow.com/a/31273488/1048186
Josiah Yoder

Antworten:

236
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
...

Und Sie können dies so oft wie nötig fortsetzen ...

Edit: von os.path können Sie entweder os.path.split oder os.path.basename verwenden:

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.
Nisan.H
quelle
Es extrahiert zwar Teile des Pfades - aber ich weiß nicht, wie ich den tatsächlichen Verzeichnisnamen aus dem Pfad extrahieren soll.
Thalia
42

In Python 3.4 können Sie das pathlib-Modul verwenden :

>>> 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
Noam Manos
quelle
schöne Demonstration der API
Nadim Farhat
Dies wurde auch auf ältere Versionen von Python zurückportiert
Phoenix
11

Alles was Sie brauchen ist ein parentTeil, wenn Sie verwenden pathlib.

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

Wird ausgegeben:

C:\Program Files\Internet Explorer    

Wenn Sie alle Teile benötigen (die bereits in anderen Antworten behandelt wurden), verwenden Sie parts:

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

Dann erhalten Sie eine Liste:

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

Spart Zeit.

Prosti
quelle
5

Überprüfen Sie zunächst, ob Sie splitunc()eine verfügbare Funktion in haben os.path. Das erste zurückgegebene Element sollte das sein, was Sie möchten ... aber ich bin unter Linux und habe diese Funktion nicht, wenn ich sie importiere osund versuche, sie zu verwenden.

Andernfalls besteht eine halb hässliche Möglichkeit, die Arbeit zu erledigen, darin, Folgendes zu verwenden:

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

Dies zeigt das Abrufen des Verzeichnisses direkt über der Datei und des Verzeichnisses direkt darüber.

ely
quelle
Ich habe meinen Eintrag bearbeitet, um die Verwendung von rsplit anzuzeigen, das genau das tut, was Sie vorschlagen - aber mir trotzdem den Pfad gibt, nicht nur den Verzeichnisnamen.
Thalia
1
Mir ist immer noch nicht klar, was Sie fragen. Warum entfernen Sie dann nicht alles links von der nächsthöheren Instanz von \\? Stellen Sie sich vor, Sie möchten den Pfad, und behalten Sie den letzten Eintrag bei, wenn Sie ihn auf \\ teilen. Das sollte funktionieren, nein?
Ely
Am Ende teilte ich den Weg und nahm das Stück, das ich wollte. Es funktionierte vorher nicht, aber nachdem ich all diese Antworten gelesen hatte, fand ich heraus, was ich falsch gemacht hatte.
Thalia
Wenn Ihnen das Lesen der Antworten geholfen hat, sollten Sie zumindest eine Abstimmung in Betracht ziehen und möglicherweise eine davon akzeptieren. Ich bin froh, dass Sie den Fehler entdeckt haben.
Ely
Ich mag die Art und Weise, wie diese halb hässliche Art funktioniert. Ich ändere das "\\" durch ein einfaches os.sep und es funktioniert perfekt, um nur einen Bruchteil eines Pfades abzurufen.
TazgerO
1

Folgendes habe ich getan, um den Teil des Verzeichnisses zu extrahieren:

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

Danke für Ihre Hilfe.

Thalia
quelle
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'

Dies sollte auch den Trick tun.

Basti Würzburg
quelle
-1

Sie müssen den gesamten Pfad als Parameter in os.path.split einfügen. Siehe Die Dokumente . Es funktioniert nicht wie String Split.

Keith
quelle
Dies funktioniert nicht unter Pfadnamen vom Typ UNC unter Windows, wie in den Python-Dokumenten für os.path angegeben.
ely