Come ottenere un percorso file assoluto in Python


Risposte:


1056
>>> 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'

29
Nota: Nella maggior parte delle piattaforme, questo equivale a chiamare la funzione normpath()come segue: normpath(join(os.getcwd(), path)). Quindi, se mydir/myfile.txtnon sotto os.getcwd(), il percorso assoluto non è il percorso reale .
coanor

32
@coanor? Senza una radice esplicita, si mydir/myfile.txtriferisce 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?
jpmc26,

2
@ jpmc26 Non seguo esattamente coanor, ma direi che (contrariamente a quanto presumevo), non esiste alcun collegamento tra l'argomento alla abspathfunzione 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.
Mike S,

2
@MikeS Sinceramente non sono sicuro del perché questo sarebbe un comportamento inaspettato. È percorso assoluto , non file o directory assoluti. Se si desidera un controllo di esistenza, chiamare 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.
jpmc26,

1
@ jpmc26 Supporre che un percorso sia solo una stringa che assomiglia a un nome di percorso non è affatto chiaro e va contro il modo in cui ho pensato e parlato di nomi di percorso per molti anni. Cito i documenti di Python 3 per abspath: "Restituisce una versione normalizzata normalizzata del percorso del percorso ". Non una "... versione del percorso della stringa ". Un percorso, come definito da Posix, è "Una stringa utilizzata per identificare un file". I documenti di Python sono espliciti su : "non si accede al filesystem per confermare l'esistenza o la natura di ". Se l'argomento qui è ovvio, perché essere esplicito per ? relpathpathrelpath
Mike S,

77

È 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


4
Molto utile. L'utilizzo 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)
NuclearPeon

23

Meglio ancora, installa il modulo (che si trova su PyPI), avvolge tutte le os.pathfunzioni 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'
>>>

2
Peccato che non abbiano mai ottenuto un modulo di astrazione del nome file corretto nello stdlib.
Torsten Marek,

1
@Torsten Marek: è un'omissione dolorosa e di vecchia data.
flusso

4
Hanno fatto adesso per Python 3.4: pathlib. Vedi la mia risposta in questa discussione.
twasbrillig,

Ci sono yypos in questa risposta. Dovrebbe essere from path import PathalloraPath('mydir/myfile.txt').abspath()
frakman1,

Non ci sono errori di battitura, potresti aver utilizzato un pathmodulo diverso . Il modulo collegato utilizza una classe denominata path.
Tom,


10

Aggiornamento per Python 3.4+ pathlibche 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 Pathoggetti con tutte le funzioni rilevanti os.path, incluso ovviamente abspath:

from os.path import abspath

absolute = abspath(relative)  # absolute is a str object

9
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 expandvarssi occupa di qualsiasi altra variabile di ambiente (come $HOME).


6

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.


Questo non è ciò che è stato chiesto. Hanno chiesto informazioni su un percorso in relazione alla directory di lavoro corrente, che non è la stessa cosa della directory di script, anche se a volte possono avere lo stesso valore.
The Elemental of Creation

3

Il modulo osfornisce 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

https://pypi.org/project/srblib/


1

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


2
Sembra che tu stia rispondendo a una domanda diversa. Non era "Come posso ottenere un percorso?", Ma "un percorso assoluto". Si potrebbe applicare la risposta corretta ( os.path.abspath()) a qualunque percorso relativo globfornisca i primi due casi ...
NichtJens,

1

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

1

Nel caso in cui qualcuno stia usando Python e Linux e stia cercando il percorso completo del file:

>>> path=os.popen("readlink -f file").read()
>>> print path
abs/path/to/file
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.