Hoe krijg ik de bovenliggende map in Python?

Kan iemand me vertellen hoe ik de bovenliggende map van een pad in Python op een platformonafhankelijke manier kan krijgen. Bijv.

C:\Program Files ---> C:\

en

C:\ ---> C:\

Als de map geen bovenliggende map heeft, wordt de map zelf geretourneerd. De vraag lijkt misschien eenvoudig, maar ik kon het niet opsporen via Google.


Antwoord 1, autoriteit 100%

Python 3.4

Gebruik de module pathlib.

from pathlib import Path
path = Path("/here/your/path/file.txt")
print(path.parent.absolute())

Oud antwoord

Probeer dit:

import os
print os.path.abspath(os.path.join(yourpath, os.pardir))

waarbij yourpathhet pad is waarvoor je de ouder wilt hebben.


Antwoord 2, autoriteit 58%

Gebruik os.path.dirname:

>>> os.path.dirname(r'C:\Program Files')
'C:\\'
>>> os.path.dirname('C:\\')
'C:\\'
>>>

Voorbehoud: os.path.dirname()geeft verschillende resultaten, afhankelijk van of er een afsluitende slash in het pad is opgenomen. Dit kan al dan niet de semantiek zijn die u zoekt. vgl. @kender’s antwoord met os.path.join(yourpath, os.pardir).


Antwoord 3, autoriteit 22%

De Pathlib-methode (Python 3.4+)

from pathlib import Path
Path('C:\Program Files').parent
# Returns a Pathlib object

De traditionele methode

import os.path
os.path.dirname('C:\Program Files')
# Returns a string

Welke methode moet ik gebruiken?

Gebruik de traditionele methode als:

  • Je maakt je zorgen over bestaande code-genererende fouten als het een Pathlib-object zou gebruiken. (Aangezien Pathlib-objecten niet kunnen worden samengevoegd met strings.)

  • Uw Python-versie is lager dan 3.4.

  • Je hebt een string nodig en je hebt een string ontvangen. Stel dat u bijvoorbeeld een tekenreeks hebt die een bestandspad vertegenwoordigt en dat u de bovenliggende map wilt krijgen, zodat u deze in een JSON-tekenreeks kunt plaatsen. Het zou een beetje dwaas zijn om daarvoor naar een Pathlib-object te converteren en weer terug.

Als geen van bovenstaande van toepassing is, gebruik dan Pathlib.


Wat is Pathlib?

Als je niet weet wat Pathlib is, is de Pathlib-module een geweldige module die het werken met bestanden nog makkelijker voor je maakt. De meeste, zo niet alle ingebouwde Python-modules die met bestanden werken, accepteren zowel Pathlib-objecten als strings. Ik heb hieronder een aantal voorbeelden uitgelicht uit de Pathlib-documentatiedie enkele van de leuke dingen die je kunt doen met Pathlib.

Navigeren in een mappenboom:

>>> p = Path('/etc')
>>> q = p / 'init.d' / 'reboot'
>>> q
PosixPath('/etc/init.d/reboot')
>>> q.resolve()
PosixPath('/etc/rc.d/init.d/halt')

Opvragen van padeigenschappen:

>>> q.exists()
True
>>> q.is_dir()
False

Antwoord 4, Autoriteit 7%

import os
p = os.path.abspath('..')

C:\Program Files— & GT; C:\\\

C:\— & GT; C:\\\


Antwoord 5, Autoriteit 5%

een alternatieve oplossing van @KENDER

import os
os.path.dirname(os.path.normpath(yourpath))

Waar yourpathis het pad waarvoor u de ouder wilt.

Maar deze oplossing is niet perfect, omdat het niet aankan het geval waar yourpatheen lege tekenreeks is, of een punt.

Deze andere oplossing behandelt mooier deze hoekzaak:

import os
os.path.normpath(os.path.join(yourpath, os.pardir))

Hier de uitgangen voor elk geval die kunnen vinden (invoerpad is relatief):

os.path.dirname(os.path.normpath('a/b/'))          => 'a'
os.path.normpath(os.path.join('a/b/', os.pardir))  => 'a'
os.path.dirname(os.path.normpath('a/b'))           => 'a'
os.path.normpath(os.path.join('a/b', os.pardir))   => 'a'
os.path.dirname(os.path.normpath('a/'))            => ''
os.path.normpath(os.path.join('a/', os.pardir))    => '.'
os.path.dirname(os.path.normpath('a'))             => ''
os.path.normpath(os.path.join('a', os.pardir))     => '.'
os.path.dirname(os.path.normpath('.'))             => ''
os.path.normpath(os.path.join('.', os.pardir))     => '..'
os.path.dirname(os.path.normpath(''))              => ''
os.path.normpath(os.path.join('', os.pardir))      => '..'
os.path.dirname(os.path.normpath('..'))            => ''
os.path.normpath(os.path.join('..', os.pardir))    => '../..'

Invoerpad is absoluut (Linux-pad):

os.path.dirname(os.path.normpath('/a/b'))          => '/a'
os.path.normpath(os.path.join('/a/b', os.pardir))  => '/a'
os.path.dirname(os.path.normpath('/a'))            => '/'
os.path.normpath(os.path.join('/a', os.pardir))    => '/'
os.path.dirname(os.path.normpath('/'))             => '/'
os.path.normpath(os.path.join('/', os.pardir))     => '/'

Antwoord 6, Autoriteit 3%

os.path.split(os.path.abspath(mydir))[0]

Antwoord 7, Autoriteit 2%

os.path.abspath(os.path.join(somepath, '..'))

Observeer:

import posixpath
import ntpath
print ntpath.abspath(ntpath.join('C:\\', '..'))
print ntpath.abspath(ntpath.join('C:\\foo', '..'))
print posixpath.abspath(posixpath.join('/', '..'))
print posixpath.abspath(posixpath.join('/home', '..'))

Antwoord 8

import os
print"------------------------------------------------------------"
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))
print("example 1: "+SITE_ROOT)
PARENT_ROOT=os.path.abspath(os.path.join(SITE_ROOT, os.pardir))
print("example 2: "+PARENT_ROOT)
GRANDPAPA_ROOT=os.path.abspath(os.path.join(PARENT_ROOT, os.pardir))
print("example 3: "+GRANDPAPA_ROOT)
print "------------------------------------------------------------"

Antwoord 9

>>> import os
>>> os.path.basename(os.path.dirname(<your_path>))

Bijvoorbeeld in Ubuntu:

>>> my_path = '/home/user/documents'
>>> os.path.basename(os.path.dirname(my_path))
# Output: 'user'

Bijvoorbeeld in Windows:

>>> my_path = 'C:\WINDOWS\system32'
>>> os.path.basename(os.path.dirname(my_path))
# Output: 'WINDOWS'

Beide voorbeelden geprobeerd in Python 2.7


Antwoord 10

Als u alleende naamwilt van de map die de directe ouder van het bestand is, opgegeven als argument en niet het absolute padnaar dat bestand:

os.path.split(os.path.dirname(currentDir))[1]

d.w.z. met een currentDirwaarde van /home/user/path/to/myfile/file.ext

Het bovenstaande commando zal terugkeren:

myfile


Antwoord 11

Stel dat we een directorystructuur hebben zoals

1]

/home/User/P/Q/R

We willen toegang krijgen tot het pad van “P” vanuit de directory R, dan kunnen we toegang krijgen met

ROOT = os.path.abspath(os.path.join("..", os.pardir));

2]

/home/User/P/Q/R

We willen toegang krijgen tot het pad van de “Q”-directory vanuit de directory R, dan kunnen we toegang krijgen met

ROOT = os.path.abspath(os.path.join(".", os.pardir));

Antwoord 12

import os
dir_path = os.path.dirname(os.path.realpath(__file__))
parent_path = os.path.abspath(os.path.join(dir_path, os.pardir))

Antwoord 13

import os.path
os.path.abspath(os.pardir)

Antwoord 14

Voeg gewoon iets toe aan het antwoord van de tung (u moet rstrip('/')gebruiken om meer van de veilige kant te zijn als u op een UNIX-vak staat).

>>> input = "../data/replies/"
>>> os.path.dirname(input.rstrip('/'))
'../data'
>>> input = "../data/replies"
>>> os.path.dirname(input.rstrip('/'))
'../data'

Maar als u niet gebruikt rstrip('/'), gezien uw invoer is

>>> input = "../data/replies/"

zou uitgaan,

>>> os.path.dirname(input)
'../data/replies'

Wat is waarschijnlijk niet wat u bekijkt zoals u wilt, zoals zowel "../data/replies/"en "../data/replies"NAAR gedraag je op dezelfde manier.


Antwoord 15

print os.path.abspath(os.path.join(os.getcwd(), os.path.pardir))

U kunt dit gebruiken om de bovenliggende map van de huidige locatie van uw PY-bestand te krijgen.


Antwoord 16

GET Parent Directory Pathen maak een nieuwe directory(naam new_dir)

Pagina bovenliggende map ophalen

os.path.abspath('..')
os.pardir

Voorbeeld 1

import os
print os.makedirs(os.path.join(os.path.dirname(__file__), os.pardir, 'new_dir'))

Voorbeeld 2

import os
print os.makedirs(os.path.join(os.path.dirname(__file__), os.path.abspath('..'), 'new_dir'))

Antwoord 17

os.path.abspath('D:\Dir1\Dir2\..')
>>> 'D:\Dir1'

Dus een ..helpt


Antwoord 18

import os
def parent_filedir(n):
    return parent_filedir_iter(n, os.path.dirname(__file__))
def parent_filedir_iter(n, path):
    n = int(n)
    if n <= 1:
        return path
    return parent_filedir_iter(n - 1, os.path.dirname(path))
test_dir = os.path.abspath(parent_filedir(2))

Antwoord 19

De antwoorden die hierboven zijn gegeven, zijn allemaal prima om één of twee directoryniveaus omhoog te gaan, maar ze kunnen een beetje omslachtig worden als men de directorystructuur met veel niveaus moet doorlopen (bijvoorbeeld 5 of 10). Dit kan beknopt worden gedaan door een lijst van Nos.pardirs in os.path.joinsamen te voegen. Voorbeeld:

import os
# Create list of ".." times 5
upup = [os.pardir]*5
# Extract list as arguments of join()
go_upup = os.path.join(*upup)
# Get abspath for current file
up_dir = os.path.abspath(os.path.join(__file__, go_upup))

Other episodes