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?


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 #

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.

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

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.


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.


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.


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.


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


Isso não funcionará em nomes de caminho do tipo UNC no Windows, conforme os documentos do Python para os.path stuff.
13133 ely
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.