Python дээр ажиллаж байгаа файлын байршлыг (замыг) олж авах: __file__.

Бизнес эрхэлдэг

Python дээр ажиллаж байгаа скрипт файлын байршлыг (замыг) олж авахын тулд __file__ ашиглана уу. Энэ нь ажиллаж буй файлын байршил дээр үндэслэн бусад файлуудыг ачаалахад тустай.

Python 3.8 хүртэл __file__ нь python командыг (эсвэл зарим орчинд python3 тушаалыг) гүйцэтгэх үед заасан замыг буцаана. Хэрэв харьцангуй замыг зааж өгсөн бол харьцангуй замыг буцаана; хэрэв туйлын замыг зааж өгсөн бол үнэмлэхүй замыг буцаана.

Python 3.9 ба түүнээс хойших хувилбаруудад ажиллах хугацаанд заасан замыг үл харгалзан үнэмлэхүй замыг буцаана.

Дараахь агуулгыг тайлбарласан болно.

  • os.getcwd(),__file__
  • Файлын нэр болон одоо ажиллаж байгаа файлын лавлах нэрийг авна уу.
  • Гүйцэтгэж буй файлын үнэмлэхүй замыг олж аваарай.
  • Бусад файлыг одоо ажиллаж байгаа файлын байршил дээр үндэслэн уншдаг.
  • Одоогийн лавлахыг гүйцэтгэж буй файлын директор руу шилжүүлэх.
  • Ижил боловсруулалтыг ажлын цаг дахь одоогийн лавлахаас үл хамааран хийж болно.

Одоогийн лавлахыг (ажлын лавлах) авах, өөрчлөх тухай мэдээллийг дараах нийтлэлээс үзнэ үү.

__File__ нь Jupyter Notebook (.ipynb) -д ашиглах боломжгүй гэдгийг анхаарна уу.
Jupyter Notebook -ийг эхлүүлсэн директороос үл хамааран .ipynb байрладаг директорыг одоогийн лавлах хэлбэрээр гүйцэтгэх болно.
Кодод байгаа os.chdir () ашиглан одоогийн лавлахыг өөрчлөх боломжтой.

os.getcwd () ба __ файл __.

Windows дээр та одоо байгаа директорыг шалгахын тулд pwd -ийн оронд dir командыг ашиглаж болно.

pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook

Дараах түвшний агуулгатай Python скрипт файл (file_path.py) үүсгэнэ (data \ src).

import os

print('getcwd:      ', os.getcwd())
print('__file__:    ', __file__)

Скрипт файлын замыг зааж өгөх python командыг (эсвэл зарим орчинд python3 командыг) ажиллуулна уу.

python3 data/src/file_path.py
# getcwd:       /Users/mbp/Documents/my-project/python-snippets/notebook
# __file__:     data/src/file_path.py

Одоогийн лавлахын үнэмлэхүй замыг os.getcwd () ашиглан олж авч болно. Та мөн __file__ ашиглан python3 тушаалаар заасан замыг авах боломжтой.

Python 3.8 хүртэл __file__ нь python (эсвэл python3) тушаалд заасан замыг агуулна. Дээрх жишээн дээр харьцангуй замыг харьцангуй учраас буцаана, харин үнэмлэхүй замыг үнэмлэхүй бол буцаана.

pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook

python3 /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# getcwd:       /Users/mbp/Documents/my-project/python-snippets/notebook
# __file__:     /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py

Python 3.9 ба дараа нь python (эсвэл python3) тушаалд заасан замаас үл хамааран абсолют замыг __file__ руу буцаана.

Дараах жишээнд бид кодыг Python 3.7 дээрх ижил скрипт файлд (file_path.py) нэмж, дээрх директортой харьцуулан ажиллуулах болно.

Python 3.7 -д үнэмлэхүй замыг ашигладаг. Үр дүнг энэ хэсгийн төгсгөлд харуулав.

Файлын нэр болон одоо ажиллаж байгаа файлын лавлах нэрийг авна уу.

Файлын нэр болон ажиллаж байгаа файлын лавлах нэрийг авахын тулд стандарт номын сангийн os.path модульд дараах функцийг ашиглана уу.

  • os.path.basename()
  • os.path.dirname()
print('basename:    ', os.path.basename(__file__))
print('dirname:     ', os.path.dirname(__file__))

Гүйцэтгэлийн үр дүн.

# basename:     file_path.py
# dirname:      data/src

Гүйцэтгэж буй файлын үнэмлэхүй замыг олж аваарай.

Хэрэв харьцангуй замыг __file__ ашиглан олж авсан бол үүнийг os.path.abspath () ашиглан үнэмлэхүй зам болгон хөрвүүлж болно. Директоруудыг үнэмлэхүй зам болгон авах боломжтой.

print('abspath:     ', os.path.abspath(__file__))
print('abs dirname: ', os.path.dirname(os.path.abspath(__file__)))

Гүйцэтгэлийн үр дүн.

# abspath:      /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# abs dirname:  /Users/mbp/Documents/my-project/python-snippets/notebook/data/src

Хэрэв үнэмлэхүй замыг os.path.abspath () -д зааж өгсөн бол түүнийг байгаагаар нь буцаана. Тиймээс, хэрэв __file__ нь үнэмлэхүй зам бол дараах зүйл нь алдаа гаргахгүй болно.

  • os.path.abspath(__file__)

Бусад файлыг одоо ажиллаж байгаа файлын байршил дээр үндэслэн уншдаг.

Хэрэв та гүйцэтгэж буй файлын байршил (зам) дээр үндэслэн бусад файлуудыг уншихыг хүсвэл os.path.join () ашиглан дараах хоёр файлд нэгдээрэй.

  • Гүйцэтгэж буй файлын лавлах
  • Ажиллаж буй файлаас унших файлын харьцангуй зам.

Хэрэв та ажиллаж байгаа файлтайгаа ижил лавлахад байгаа файлыг уншихыг хүсвэл файлын нэрийг хооронд нь холбоно уу.

print('[set target path 1]')
target_path_1 = os.path.join(os.path.dirname(__file__), 'target_1.txt')

print('target_path_1: ', target_path_1)

print('read target file:')
with open(target_path_1) as f:
    print(f.read())

Гүйцэтгэлийн үр дүн.

# [set target path 1]
# target_path_1:  data/src/target_1.txt
# read target file:
# !! This is "target_1.txt" !!

Дээд түвшинг “. \” Тэмдгээр илэрхийлнэ. Та үүнийг байгаагаар нь үлдээж болох боловч os.path.normpath () ашиглан замыг хэвийн болгож, нэмэлт “. \” Болон бусад тэмдэгтүүдийг устгаж болно.

print('[set target path 2]')
target_path_2 = os.path.join(os.path.dirname(__file__), '../dst/target_2.txt')

print('target_path_2: ', target_path_2)
print('normalize    : ', os.path.normpath(target_path_2))

print('read target file:')
with open(target_path_2) as f:
    print(f.read())

Гүйцэтгэлийн үр дүн.

# [set target path 2]
# target_path_2:  data/src/../dst/target_2.txt
# normalize    :  data/dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!

Одоогийн лавлахыг гүйцэтгэж буй файлын директор руу шилжүүлэх.

Os.chdir () ашиглан одоогийн директорыг скриптэд гүйцэтгэж буй файлын директор руу шилжүүлэх.

Үүнийг os.getcwd () -ээр зөөж байгааг харж болно.

print('[change directory]')
os.chdir(os.path.dirname(os.path.abspath(__file__)))
print('getcwd:      ', os.getcwd())

Гүйцэтгэлийн үр дүн.

# [change directory]
# getcwd:       /Users/mbp/Documents/my-project/python-snippets/notebook/data/src

Одоогийн лавлахыг зөөж дууссаны дараа файлыг уншиж байхдаа түүнийг ажиллаж байгаа файлын лавлахтай холбох шаардлагагүй болно. Та зүгээр л ажиллаж байгаа файлын лавлахтай холбоотой замыг зааж өгч болно.

print('[set target path 1 (after chdir)]')
target_path_1 = 'target_1.txt'

print('target_path_1: ', target_path_1)

print('read target file:')
with open(target_path_1) as f:
    print(f.read())

print()
print('[set target path 2 (after chdir)]')
target_path_2 = '../dst/target_2.txt'

print('target_path_2: ', target_path_2)

print('read target file:')
with open(target_path_2) as f:
    print(f.read())

Гүйцэтгэлийн үр дүн.

# [set target path 1 (after chdir)]
# target_path_1:  target_1.txt
# read target file:
# !! This is "target_1.txt" !!
# 
# [set target path 2 (after chdir)]
# target_path_2:  ../dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!

Ижил боловсруулалтыг ажлын цаг дахь одоогийн лавлахаас үл хамааран хийж болно.

Бидний харуулсанчлан скрипт файлын байршилд үндэслэн файлуудыг ачаалах үед одоогийн директороос хамааралгүй дараах аргуудын аль нэгийг ашиглан ачаалах боломжтой.

  • Os.path.join () ашиглан ажиллаж буй файлаас уншиж буй файлын харьцангуй замыг болон ажиллаж байгаа файлын лавлах санг нэгтгэнэ.
  • Одоогийн лавлахыг гүйцэтгэж буй файлын директор руу шилжүүлэх.

Одоогийн лавлахыг зөөх нь илүү хялбар байдаг, гэхдээ мэдээжийн хэрэг, хэрэв та үүний дараа өөр файл унших эсвэл бичихийг хүсч байвал одоогийн лавлахыг зөөсөн болохыг анхаарч үзэх хэрэгтэй.

Өмнөх жишээнүүдийн үр дүнг доор нэгтгэн харуулав.

pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook

python3 data/src/file_path.py
# getcwd:       /Users/mbp/Documents/my-project/python-snippets/notebook
# __file__:     data/src/file_path.py
# basename:     file_path.py
# dirname:      data/src
# abspath:      /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# abs dirname:  /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
# 
# [set target path 1]
# target_path_1:  data/src/target_1.txt
# read target file:
# !! This is "target_1.txt" !!
# 
# [set target path 2]
# target_path_2:  data/src/../dst/target_2.txt
# normalize    :  data/dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!
# 
# [change directory]
# getcwd:       /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
# 
# [set target path 1 (after chdir)]
# target_path_1:  target_1.txt
# read target file:
# !! This is "target_1.txt" !!
# 
# [set target path 2 (after chdir)]
# target_path_2:  ../dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!

Үнэмлэхүй замыг тодорхойлох үр дүн дараах байдалтай байна.

pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook

python3 /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# getcwd:       /Users/mbp/Documents/my-project/python-snippets/notebook
# __file__:     /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# basename:     file_path.py
# dirname:      /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
# abspath:      /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# abs dirname:  /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
# 
# [set target path 1]
# target_path_1:  /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/target_1.txt
# read target file:
# !! This is "target_1.txt" !!
# 
# [set target path 2]
# target_path_2:  /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/../dst/target_2.txt
# normalize    :  /Users/mbp/Documents/my-project/python-snippets/notebook/data/dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!
# 
# [change directory]
# getcwd:       /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
# 
# [set target path 1 (after chdir)]
# target_path_1:  target_1.txt
# read target file:
# !! This is "target_1.txt" !!
# 
# [set target path 2 (after chdir)]
# target_path_2:  ../dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!

Терминал дахь одоогийн лавлахыг зөөж, ижил скрипт файлыг ажиллуулсны үр дүнг доор харуулав. Ижил файлыг өөр газраас гүйцэтгэсэн ч гэсэн унших боломжтойг та харж байна.

cd data/src

pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook/data/src

python3 file_path.py
# getcwd:       /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
# __file__:     file_path.py
# basename:     file_path.py
# dirname:      
# abspath:      /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# abs dirname:  /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
# 
# [set target path 1]
# target_path_1:  target_1.txt
# read target file:
# !! This is "target_1.txt" !!
# 
# [set target path 2]
# target_path_2:  ../dst/target_2.txt
# normalize    :  ../dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!
# 
# [change directory]
# getcwd:       /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
# 
# [set target path 1 (after chdir)]
# target_path_1:  target_1.txt
# read target file:
# !! This is "target_1.txt" !!
# 
# [set target path 2 (after chdir)]
# target_path_2:  ../dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!

Copied title and URL