Extrair uma parte do caminho do arquivo (um diretório) em Python

163

Preciso extrair o nome do diretório pai de um determinado caminho. Isto é o que parece:

c:\stuff\directory_i_need\subdir\file

Estou modificando o conteúdo do "arquivo" com algo que usa o directory_i_need nome nele (não o caminho). Eu criei uma função que me dará uma lista de todos os arquivos e, em seguida ...

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.

Como eu posso fazer isso?

Thalia
fonte
1
Você pode querer verificar esta resposta: stackoverflow.com/a/4580931/311220
Acorn
O link acima me ajudou a entender como corrigir o que fiz de errado. Obrigado.
Thalia #
ou esta: stackoverflow.com/a/31273488/1048186
Josias Yoder

Respostas:

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 você pode continuar fazendo isso quantas vezes for necessário ...

Editar: do os.path , você pode usar os.path.split ou 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
fonte
Ele extrai partes do caminho - mas não sei como extrair o nome do diretório real do caminho.
Thalia
43

No Python 3.4, você pode usar o módulo 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
fonte
boa demonstração da API
Nadim Farhat
Isso também foi portado para versões mais antigas do Python: pathlib2
Phoenix
11

Tudo que você precisa é parentparte, se você usar pathlib.

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

Saída:

C:\Program Files\Internet Explorer    

Caso você precise de todas as partes (já abordadas em outras respostas), use parts:

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

Então você receberá uma lista:

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

Economiza tom de tempo.

prosti
fonte
5

Primeiro, veja se você possui splitunc()uma função disponível os.path. O primeiro item retornado deve ser o que você deseja ... mas estou no Linux e não tenho essa função ao importaros e tento usá-la.

Caso contrário, uma maneira semi-feia de realizar o trabalho é usar:

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

que mostra a recuperação do diretório logo acima do arquivo e o diretório logo acima dele.

ely
fonte
Editei minha entrada para mostrar o uso do rsplit, que faz o que você sugere - mas ainda me fornece o caminho, não apenas o nome do diretório.
Thalia #
1
Ainda não estou claro o que você está perguntando. Por que você não tira tudo à esquerda da próxima instância superior de \\ então? Finja que deseja o caminho e mantenha a última entrada quando você o dividir em \\. Isso deve funcionar, não?
Ely
Acabei dividindo o caminho e pegando a peça que queria, não funcionou antes, mas depois de ler todas essas respostas, descobri o que fiz de errado.
Thalia #
Se a leitura das respostas o ajudou, considere pelo menos votá-las e, possivelmente, aceitando uma delas. Estou feliz que você tenha visto o erro.
Ely
Gosto da maneira como essa maneira semi-feia funciona. Eu mudo o "\\" por um simples os.sep e funciona perfeitamente para recuperar apenas uma fração de um caminho.
precisa saber é o seguinte
1

Isto é o que eu fiz para extrair a parte do diretório:

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

Obrigado pela ajuda.

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

Isso também deve fazer o truque.

Basti Würzburg
fonte
-1

Você deve colocar o caminho inteiro como um parâmetro para os.path.split. Veja os documentos . Não funciona como uma divisão de cadeia.

Keith
fonte
Isso não funcionará em nomes de caminho do tipo UNC no Windows, conforme os documentos do Python para os.path stuff.
13133 ely