Obtenha o nome da pasta do arquivo em Python

87

Em Python, qual comando devo usar para obter o nome da pasta que contém o arquivo com o qual estou trabalhando?

"C:\folder1\folder2\filename.xml"

Aqui "folder2"está o que eu quero obter.

A única coisa que descobri é usar os.path.splitduas vezes:

folderName = os.path.split(os.path.split("C:\folder1\folder2\filename.xml")[0])[1]

Existe alguma maneira melhor de fazer isso?

Vasily
fonte

Respostas:

162

Você pode usar dirname:

os.path.dirname(path)

Retorne o nome do diretório do caminho do nome do caminho. Este é o primeiro elemento do par retornado pela passagem do caminho para a função split ().

E dado o caminho completo, então você pode dividir normalmente para obter a última parte do caminho. Por exemplo, usando basename:

os.path.basename(path)

Retorne o nome base do caminho do nome do caminho. Este é o segundo elemento do par retornado pela passagem do caminho para a função split (). Observe que o resultado desta função é diferente do programa de nome de base do Unix; onde o nome de base para '/ foo / bar /' retorna 'bar', a função de nome de base () retorna uma string vazia ('').


Todos juntos:

>>> import os
>>> path=os.path.dirname("C:/folder1/folder2/filename.xml")
>>> path
'C:/folder1/folder2'
>>> os.path.basename(path)
'folder2'
fedorqui 'então pare de prejudicar'
fonte
7
Como alternativa, para obter a última parte, você pode usaros.path.basename
mgilson
@mgilson bom ponto!
Atualizei
17

Você está tentando usar dirname . Se você quiser apenas aquele diretório, pode usar os.path.basename ,

Quando tudo junto, fica assim:

os.path.basename(os.path.dirname('dir/sub_dir/other_sub_dir/file_name.txt'))

Isso deve render a você "other_sub_dir"

A abordagem a seguir não é a abordagem ideal, mas originalmente propus, usando os.path.split, e simplesmente obter o último item. que ficaria assim:

os.path.split(os.path.dirname('dir/sub_dir/other_sub_dir/file_name.txt'))[-1]
idjaw
fonte
5
em vez de dividir com str.split, é melhor usar os.path.split(que lida melhor com as diferenças de diferentes sistemas operacionais).
mgilson
Sim. Você está certo! Fugiu da minha mente. Obrigado @mgilson
idjaw
9

isso é muito antigo, mas se você estiver usando Python 3.4 ou superior, use PathLib .

# using OS
import os
path=os.path.dirname("C:/folder1/folder2/filename.xml")
print(path)
print(os.path.basename(path))

# using pathlib
import pathlib
path = pathlib.PurePath("C:/folder1/folder2/filename.xml")
print(path.parent)
print(path.parent.name)
dfresh22
fonte
8

os.path.dirname é o que você está procurando -

os.path.dirname(r"C:\folder1\folder2\filename.xml")

Certifique-se de rcolocar o prefixo na string de forma que seja considerada uma string bruta.

Demo -

In [46]: os.path.dirname(r"C:\folder1\folder2\filename.xml")
Out[46]: 'C:\\folder1\\folder2'

Se você apenas quiser folder2, pode usar os.path.basenamecom o exemplo acima,

os.path.basename(os.path.dirname(r"C:\folder1\folder2\filename.xml"))

Demo -

In [48]: os.path.basename(os.path.dirname(r"C:\folder1\folder2\filename.xml"))
Out[48]: 'folder2'
Anand S Kumar
fonte
1

Você pode obter o caminho completo como uma string e dividi-lo em uma lista usando o caractere separador do seu sistema operacional. Em seguida, você obtém o nome do programa, o nome da pasta etc. acessando os elementos do final da lista usando índices negativos.

Como isso:

import os
strPath = os.path.realpath(__file__)
print( f"Full Path    :{strPath}" )
nmFolders = strPath.split( os.path.sep )
print( "List of Folders:", nmFolders )
print( f"Program Name :{nmFolders[-1]}" )
print( f"Folder Name  :{nmFolders[-2]}" )
print( f"Folder Parent:{nmFolders[-3]}" )

O resultado do acima foi este:

Full Path    :C:\Users\terry\Documents\apps\environments\dev\app_02\app_02.py
List of Folders: ['C:', 'Users', 'terry', 'Documents', 'apps', 'environments', 'dev', 'app_02', 'app_02.py']
Program Name :app_02.py
Folder Name  :app_02
Folder Parent:dev
tjd sydney
fonte
1

você pode usar pathlib

from pathlib import Path
Path(r"C:\folder1\folder2\filename.xml").parts[-2]

O resultado do acima foi este:

'folder2'
Allen Jing
fonte