Extraire une partie du chemin du fichier (un répertoire) en Python

163

J'ai besoin d'extraire le nom du répertoire parent d'un certain chemin. Voici à quoi cela ressemble:

c:\stuff\directory_i_need\subdir\file

Je modifie le contenu du "fichier" avec quelque chose qui utilise le directory_i_neednom (pas le chemin). J'ai créé une fonction qui me donnera une liste de tous les fichiers, puis ...

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.

Comment puis je faire ça?

Thalia
la source
1
Vous voudrez peut-être vérifier cette réponse: stackoverflow.com/a/4580931/311220
Acorn
Le lien ci-dessus m'a aidé à comprendre comment réparer ce que j'avais mal fait. Je vous remercie.
Thalia
ou celui-ci: stackoverflow.com/a/31273488/1048186
Josiah Yoder

Réponses:

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

Et vous pouvez continuer à le faire autant de fois que nécessaire ...

Edit: depuis os.path , vous pouvez utiliser soit os.path.split, soit 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.
Nisan.H
la source
Il extrait des parties du chemin - mais je ne sais pas comment extraire le nom du répertoire réel du chemin.
Thalia
43

Dans Python 3.4, vous pouvez utiliser le module 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
Noam Manos
la source
belle démonstration de l'API
Nadim Farhat
Cela a également été rétroporté vers les anciennes versions de Python: pathlib2
phoenix
11

Tout ce dont vous avez besoin est une parentpièce si vous l'utilisez pathlib.

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

Sortira:

C:\Program Files\Internet Explorer    

Si vous avez besoin de toutes les pièces (déjà couvertes dans d'autres réponses), utilisez parts:

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

Ensuite, vous obtiendrez une liste:

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

Gain de temps.

prosti
la source
5

Tout d'abord, voyez si vous avez splitunc()une fonction disponible dans os.path. Le premier élément retourné doit être ce que vous voulez ... mais je suis sous Linux et je n'ai pas cette fonction lorsque j'importe oset que j'essaye de l'utiliser.

Sinon, une façon semi-laide de faire le travail est d'utiliser:

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

qui montre la récupération du répertoire juste au-dessus du fichier, et le répertoire juste au-dessus.

ely
la source
J'ai modifié mon entrée pour montrer l'utilisation de rsplit qui fait ce que vous suggérez - mais me donne toujours le chemin et pas seulement le nom du répertoire.
Thalia
1
Je ne sais toujours pas ce que vous demandez. Pourquoi ne supprimez-vous pas tout à gauche de la prochaine instance supérieure de \\ alors? Faites comme si vous vouliez le chemin, puis conservez simplement la dernière entrée de celui-ci lorsque vous l'avez divisé sur \\. Cela devrait fonctionner, non?
ely
J'ai fini par fendre le chemin et prendre le morceau que je voulais, ça n'a pas marché avant mais après avoir lu toutes ces réponses, j'ai découvert ce que j'avais mal fait.
Thalia
Si la lecture des réponses vous a aidé, envisagez au moins de les voter et d'accepter éventuellement l'une d'entre elles. Je suis content que vous ayez repéré l'erreur.
ely
J'aime la façon dont fonctionne cette manière semi-laide. Je change le "\\" par un simple os.sep et cela fonctionne parfaitement pour récupérer juste une fraction d'un chemin.
TazgerO
1

Voici ce que j'ai fait pour extraire le morceau du répertoire:

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

Merci de votre aide.

Thalia
la source
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'

Cela devrait également faire l'affaire.

Basti Würzburg
la source
-1

Vous devez mettre le chemin complet en paramètre dans os.path.split. Voir les documents . Cela ne fonctionne pas comme le fractionnement de chaîne.

Keith
la source
Cela ne fonctionnera pas sur les noms de chemin de type UNC sous Windows, comme l'état de la documentation Python pour os.path.
ely