Risposte:
>>> import os
>>> os.path.abspath("mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'
Funziona anche se è già un percorso assoluto:
>>> import os
>>> os.path.abspath("C:/example/cwd/mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'
normpath()
come segue: normpath(join(os.getcwd(), path))
. Quindi, se mydir/myfile.txt
non sotto os.getcwd()
, il percorso assoluto non è il percorso reale .
mydir/myfile.txt
riferisce implicitamente a un percorso all'interno della directory di lavoro corrente, pertanto è equivalente a ./mydir/myfile.txt
. Potrebbe non essere il percorso che intendevi inserire, ma sembra la corretta interpretazione del percorso, per quanto posso dire. Potresti elaborare?
abspath
funzione e un file reale. Puoi dare qualsiasi percorso - i file inesistenti e le directory gerarchiche vanno bene - e abspath risolverà semplicemente i bit del percorso (incluso l' ..
elemento " " della directory padre ) e restituirà una stringa. Questa è solo una stringa calcolata dalla directory corrente; qualsiasi correlazione con un file reale è accidentale, a quanto pare. Prova os.path.abspath("/wow/junk/../blha/hooey")
. Funziona.
os.path.exists
. Al contrario, sistemi come PowerShell che insistono sul percorso esistente con la funzione di risoluzione del percorso standard sono un problema da usare.
relpath
path
relpath
È possibile utilizzare la nuova libreria Python 3.4 pathlib
. (Puoi anche ottenerlo per Python 2.6 o 2.7 utilizzando pip install pathlib
.) Gli autori hanno scritto : "Lo scopo di questa libreria è fornire una semplice gerarchia di classi per gestire i percorsi del filesystem e le operazioni comuni che gli utenti eseguono su di essi."
Per ottenere un percorso assoluto in Windows:
>>> from pathlib import Path
>>> p = Path("pythonw.exe").resolve()
>>> p
WindowsPath('C:/Python27/pythonw.exe')
>>> str(p)
'C:\\Python27\\pythonw.exe'
O su UNIX:
>>> from pathlib import Path
>>> p = Path("python3.4").resolve()
>>> p
PosixPath('/opt/python3/bin/python3.4')
>>> str(p)
'/opt/python3/bin/python3.4'
I documenti sono qui: https://docs.python.org/3/library/pathlib.html
os.path.abspath()
mi ha dato un errore :, l' AttributeError: 'NoneType' object has no attribute 'startswith'
utilizzo Path().resolve()
non ha lo stesso percorso file relativo. (Linux e Python3.4)
Meglio ancora, installa il modulo (che si trova su PyPI
), avvolge tutte le os.path
funzioni e le altre funzioni correlate in metodi su un oggetto che può essere usato ovunque vengano usate le stringhe:
>>> from path import path
>>> path('mydir/myfile.txt').abspath()
'C:\\example\\cwd\\mydir\\myfile.txt'
>>>
pathlib
. Vedi la mia risposta in questa discussione.
from path import Path
alloraPath('mydir/myfile.txt').abspath()
path
modulo diverso . Il modulo collegato utilizza una classe denominata path
.
Oggi puoi anche usare il unipath
pacchetto basato su path.py
: http://sluggo.scrapping.cc/python/unipath/
>>> from unipath import Path
>>> absolute_path = Path('mydir/myfile.txt').absolute()
Path('C:\\example\\cwd\\mydir\\myfile.txt')
>>> str(absolute_path)
C:\\example\\cwd\\mydir\\myfile.txt
>>>
Consiglierei di usare questo pacchetto in quanto offre un'interfaccia pulita alle comuni utility os.path .
Aggiornamento per Python 3.4+ pathlib
che risponde effettivamente alla domanda:
from pathlib import Path
relative = Path("mydir/myfile.txt")
absolute = relative.absolute() # absolute is a Path object
Se hai solo bisogno di una stringa temporanea, tieni presente che puoi usare gli Path
oggetti con tutte le funzioni rilevanti os.path
, incluso ovviamente abspath
:
from os.path import abspath
absolute = abspath(relative) # absolute is a str object
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))
Si noti che expanduser
è necessario (su Unix) nel caso in cui l'espressione data per il nome e la posizione del file (o della directory) possa contenere un carattere iniziale ~/
(la tilde si riferisce alla directory principale dell'utente) e expandvars
si occupa di qualsiasi altra variabile di ambiente (come $HOME
).
Questo ottiene sempre il nome file corretto dello script corrente, anche quando viene chiamato da un altro script. È particolarmente utile durante l'utilizzo subprocess
.
import sys,os
filename = sys.argv[0]
da lì, puoi ottenere il percorso completo dello script con:
>>> os.path.abspath(filename)
'/foo/bar/script.py'
Inoltre, semplifica la navigazione tra le cartelle semplicemente aggiungendo /..
tutte le volte che si desidera "salire" nella gerarchia delle directory.
Per ottenere il CWD:
>>> os.path.abspath(filename+"/..")
'/foo/bar'
Per il percorso principale:
>>> os.path.abspath(filename+"/../..")
'/foo'
Combinando "/.."
con altri nomi di file, è possibile accedere a qualsiasi file nel sistema.
Il modulo os
fornisce un modo per trovare il percorso degli addominali.
MA la maggior parte dei percorsi in Linux inizia con ~
(tilde), che non dà risultati soddisfacenti.
così puoi usarlo srblib
.
>>> import os
>>> os.path.abspath('~/hello/world')
'/home/srb/Desktop/~/hello/world'
>>> from srblib import abs_path
>>> abs_path('~/hello/world')
'/home/srb/hello/world'
installalo usando python3 -m pip install srblib
Preferisco usare glob
ecco come elencare tutti i tipi di file nella cartella corrente:
import glob
for x in glob.glob():
print(x)
ecco come elencare tutti (ad esempio) i file .txt nella cartella corrente:
import glob
for x in glob.glob('*.txt'):
print(x)
ecco come elencare tutti i tipi di file in una directory scelta:
import glob
for x in glob.glob('C:/example/hi/hello/'):
print(x)
spero che questo ti abbia aiutato
os.path.abspath()
) a qualunque percorso relativo glob
fornisca i primi due casi ...
se sei su un mac
import os
upload_folder = os.path.abspath("static/img/users")
questo ti darà un percorso completo:
print(upload_folder)
mostrerà il seguente percorso:
>>>/Users/myUsername/PycharmProjects/OBS/static/img/user