Diberikan jalur seperti "mydir/myfile.txt"
, bagaimana cara menemukan jalur absolut file relatif terhadap direktori kerja saat ini di Python? Misalnya pada Windows, saya mungkin berakhir dengan:
"C:/example/cwd/mydir/myfile.txt"
Diberikan jalur seperti "mydir/myfile.txt"
, bagaimana cara menemukan jalur absolut file relatif terhadap direktori kerja saat ini di Python? Misalnya pada Windows, saya mungkin berakhir dengan:
"C:/example/cwd/mydir/myfile.txt"
Jawaban:
>>> 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'
normpath()
sebagai berikut: normpath(join(os.getcwd(), path))
. Jadi jika mydir/myfile.txt
tidak di bawah os.getcwd()
, jalur absolut bukanlah jalan nyata .
mydir/myfile.txt
secara 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?
abspath
fungsi 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.
os.path.exists
. Sebaliknya, sistem seperti PowerShell yang bersikeras pada jalur yang ada dengan fungsi resolusi jalur standar adalah rasa sakit untuk digunakan.
relpath
path
relpath
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
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)
Lebih baik lagi, instal modul (ditemukan pada PyPI
), itu membungkus semua os.path
fungsi 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'
>>>
pathlib
. Lihat jawaban saya di utas ini.
from path import Path
kemudianPath('mydir/myfile.txt').abspath()
path
modul yang berbeda . Modul tertaut menggunakan kelas bernama path
.
Hari ini Anda juga dapat menggunakan unipath
paket 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 .
Pembaruan untuk Python 3.4+ pathlib
yang 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 Path
objek dengan semua fungsi yang relevan os.path
, termasuk tentu saja 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)))
Catatan yang expanduser
diperlukan (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 expandvars
menangani variabel lingkungan lainnya (seperti $HOME
).
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.
Modul os
menyediakan cara untuk menemukan jalan abs.
TETAPI sebagian besar jalur di Linux dimulai dengan ~
(tilde), yang tidak memberikan hasil yang memuaskan.
jadi kamu bisa menggunakannya srblib
untuk 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
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
os.path.abspath()
) untuk jalur relatif apa pun yang glob
disediakan untuk dua kasus pertama Anda ...
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