Cara mendapatkan path file absolut dengan Python

Jawaban:

1056
>>> import os
>>> os.path.abspath("mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'

Juga berfungsi jika sudah menjadi jalur absolut:

>>> import os
>>> os.path.abspath("C:/example/cwd/mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'
sherbang
sumber
29
Catatan: Pada kebanyakan platform, ini setara dengan memanggil fungsi normpath()sebagai berikut: normpath(join(os.getcwd(), path)). Jadi jika mydir/myfile.txttidak di bawah os.getcwd(), jalur absolut bukanlah jalan nyata .
coanor
32
@coanor? Tanpa root eksplisit, mydir/myfile.txtsecara implisit merujuk ke jalur di dalam direktori kerja saat ini seperti yang setara dengan ./mydir/myfile.txt. Itu mungkin bukan jalan yang ingin Anda masukkan, tetapi sepertinya interpretasi yang benar dari jalan sejauh yang saya tahu. Bisakah Anda menguraikan?
jpmc26
2
@ jpmc26 Saya tidak benar-benar mengikuti coanor, tapi saya akan mengatakan itu (bertentangan dengan apa yang saya duga), tidak ada keterkaitan antara argumen dengan abspathfungsi dan file nyata. Anda bisa memberikan pathname- file yang tidak ada dan heirarki direktori baik-baik saja dan abspath hanya akan menyelesaikan bit path (termasuk ..elemen direktori induk " ") dan mengembalikan sebuah string. Ini hanya string yang dihitung dari direktori saat ini; korelasi apa pun dengan file aktual sepertinya tidak disengaja. Coba os.path.abspath("/wow/junk/../blha/hooey"). Berhasil.
Mike S
2
@ Mike Sejujurnya saya tidak yakin mengapa itu merupakan perilaku yang tidak terduga. Ini jalur absolut , bukan file atau direktori absolut. Jika Anda ingin pemeriksaan keberadaan, hubungi os.path.exists. Sebaliknya, sistem seperti PowerShell yang bersikeras pada jalur yang ada dengan fungsi resolusi jalur standar adalah rasa sakit untuk digunakan.
jpmc26
1
@ jpmc26 Untuk berasumsi bahwa path hanyalah sebuah string yang terlihat seperti nama path tidak jelas sama sekali, dan bertentangan dengan bagaimana saya telah berpikir dan berbicara tentang nama path selama bertahun-tahun. Saya mengutip Python 3 docs untuk ABSPATH: "Kembali versi dimutlakkan dinormalisasi dari pathname jalan ." Bukan "... versi jalur string ". Pathname, seperti yang didefinisikan oleh Posix, adalah "Sebuah string yang digunakan untuk mengidentifikasi file." Dokumen Python eksplisit tentang : "sistem file tidak diakses untuk mengkonfirmasi keberadaan atau sifat ". Jika argumen di sini jelas, mengapa harus eksplisit ? relpathpathrelpath
Mike S
77

Anda bisa menggunakan pustaka Python 3.4 baru pathlib. (Anda juga bisa mendapatkannya menggunakan Python 2.6 atau 2.7 pip install pathlib.) Para penulis menulis : "Tujuan perpustakaan ini adalah untuk menyediakan hierarki kelas sederhana untuk menangani jalur sistem file dan operasi umum yang dilakukan pengguna atas mereka."

Untuk mendapatkan jalur absolut di Windows:

>>> from pathlib import Path
>>> p = Path("pythonw.exe").resolve()
>>> p
WindowsPath('C:/Python27/pythonw.exe')
>>> str(p)
'C:\\Python27\\pythonw.exe'

Atau di UNIX:

>>> from pathlib import Path
>>> p = Path("python3.4").resolve()
>>> p
PosixPath('/opt/python3/bin/python3.4')
>>> str(p)
'/opt/python3/bin/python3.4'

Documents ada di sini: https://docs.python.org/3/library/pathlib.html

twasbrillig
sumber
4
Sangat membantu. Menggunakan os.path.abspath()memberi saya kesalahan:, AttributeError: 'NoneType' object has no attribute 'startswith'menggunakan Path().resolve()tidak dengan filepath relatif sama. (Linux dan Python3.4)
NuclearPeon
23

Lebih baik lagi, instal modul (ditemukan pada PyPI), itu membungkus semua os.pathfungsi dan fungsi terkait lainnya menjadi metode pada objek yang dapat digunakan di mana pun string digunakan:

>>> from path import path
>>> path('mydir/myfile.txt').abspath()
'C:\\example\\cwd\\mydir\\myfile.txt'
>>>
Tom
sumber
2
Sayang sekali mereka tidak pernah mendapatkan modul abstraksi nama file yang tepat ke stdlib.
Torsten Marek
1
@ Torsten Marek: ini penghilangan yang menyakitkan dan lama.
mengalir
4
Mereka melakukan sekarang ke Python 3.4: pathlib. Lihat jawaban saya di utas ini.
twasbrillig
Ada yypos dalam jawaban ini. Seharusnya from path import PathkemudianPath('mydir/myfile.txt').abspath()
frakman1
Tidak ada kesalahan ketik, Anda mungkin telah menggunakan pathmodul yang berbeda . Modul tertaut menggunakan kelas bernama path.
Tom
14

Hari ini Anda juga dapat menggunakan unipathpaket yang didasarkan pada 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
>>>

Saya akan merekomendasikan menggunakan paket ini karena menawarkan antarmuka yang bersih untuk utilitas os.path umum .


sumber
10

Pembaruan untuk Python 3.4+ pathlibyang benar-benar menjawab pertanyaan:

from pathlib import Path

relative = Path("mydir/myfile.txt")
absolute = relative.absolute()  # absolute is a Path object

Jika Anda hanya memerlukan string sementara, ingatlah bahwa Anda dapat menggunakan Pathobjek dengan semua fungsi yang relevan os.path, termasuk tentu saja abspath:

from os.path import abspath

absolute = abspath(relative)  # absolute is a str object
Fisikawan Gila
sumber
9
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))

Catatan yang expanduserdiperlukan (pada Unix) dalam kasus ekspresi yang diberikan untuk nama (atau direktori) nama dan lokasi dapat berisi yang terkemuka ~/(tilde merujuk ke direktori home pengguna), dan expandvarsmenangani variabel lingkungan lainnya (seperti $HOME).

benjimin
sumber
6

Ini selalu mendapatkan nama file yang tepat dari skrip saat ini, bahkan ketika itu dipanggil dari dalam skrip lain. Ini sangat berguna saat menggunakan subprocess.

import sys,os

filename = sys.argv[0]

dari sana, Anda bisa mendapatkan path lengkap skrip dengan:

>>> os.path.abspath(filename)
'/foo/bar/script.py'

Ini juga membuat lebih mudah untuk menavigasi folder hanya dengan menambahkan /..sebanyak yang Anda inginkan 'naik' dalam hierarki direktori.

Untuk mendapatkan cwd:

>>> os.path.abspath(filename+"/..")
'/foo/bar'

Untuk jalur induk:

>>> os.path.abspath(filename+"/../..")
'/foo'

Dengan menggabungkan "/.."dengan nama file lain, Anda dapat mengakses file apa saja di sistem.

Lucas Azevedo
sumber
Ini bukan yang diminta. Mereka bertanya tentang jalur dalam kaitannya dengan direktori kerja saat ini, yang tidak sama dengan direktori skrip, meskipun terkadang mereka mungkin memiliki nilai yang sama.
Unsur Penciptaan
3

Modul osmenyediakan cara untuk menemukan jalan abs.

TETAPI sebagian besar jalur di Linux dimulai dengan ~(tilde), yang tidak memberikan hasil yang memuaskan.

jadi kamu bisa menggunakannya srblibuntuk itu.

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

instal menggunakan python3 -m pip install srblib

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

srbcheema1
sumber
1

Saya lebih suka menggunakan glob

di sini adalah cara membuat daftar semua jenis file di folder Anda saat ini:

import glob
for x in glob.glob():
    print(x)

berikut adalah cara membuat daftar semua (misalnya) file .txt di folder Anda saat ini:

import glob
for x in glob.glob('*.txt'):
    print(x)

di sini adalah cara membuat daftar semua jenis file dalam direktori yang dipilih:

import glob
for x in glob.glob('C:/example/hi/hello/'):
    print(x)

Semoga ini bisa membantu Anda

F. Taylor
sumber
2
Anda sepertinya menjawab pertanyaan yang berbeda. Itu bukan "Bagaimana saya mendapatkan jalan?", Tetapi "jalan absolut". Orang dapat menerapkan jawaban yang benar ( os.path.abspath()) untuk jalur relatif apa pun yang globdisediakan untuk dua kasus pertama Anda ...
NichtJens
1

jika Anda menggunakan mac

import os
upload_folder = os.path.abspath("static/img/users")

ini akan memberi Anda jalan penuh:

print(upload_folder)

akan menunjukkan jalur berikut:

>>>/Users/myUsername/PycharmProjects/OBS/static/img/user
chikwapuro
sumber
1

Jika seseorang menggunakan python dan linux dan mencari path lengkap ke file:

>>> path=os.popen("readlink -f file").read()
>>> print path
abs/path/to/file
BND
sumber