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 yourpath
het 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 yourpath
is het pad waarvoor u de ouder wilt.
Maar deze oplossing is niet perfect, omdat het niet aankan het geval waar yourpath
een 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 currentDir
waarde 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 N
os.pardir
s in os.path.join
samen 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))