Атрыманне месцазнаходжання (шляху) запушчанага файла ў Python: __file__.

Бізнэс

Каб атрымаць месцазнаходжанне (шлях) запушчанага файла сцэнара ў Python, выкарыстоўвайце __file__. Гэта карысна для загрузкі іншых файлаў у залежнасці ад месцазнаходжання запушчанага файла.

Да Python 3.8 __file__ вяртае шлях, вызначаны пры выкананні каманды python (або каманды python3 у некаторых асяроддзях). Калі задаецца адносны шлях, вяртаецца адносны шлях; калі задаецца абсалютны шлях, вяртаецца абсалютны шлях.

У Python 3.9 і пазнейшых версіях вяртаецца абсалютны шлях незалежна ад шляху, указанага падчас выканання.

Растлумачана наступнае змест.

  • os.getcwd(),__file__
  • Атрымайце імя файла і назву каталога бягучага файла.
  • Атрымаць абсалютны шлях да файла, які выконваецца.
  • Счытвае іншыя файлы ў залежнасці ад месцазнаходжання файла, які выконваецца ў дадзены момант.
  • Перамясціць бягучы каталог у каталог выкананага файла.
  • Адна і тая ж апрацоўка можа быць зроблена незалежна ад бягучага каталога падчас выканання.

Глядзіце наступны артыкул для атрымання інфармацыі аб атрыманні і змене бягучага каталога (працоўнага каталога).

Звярніце ўвагу, што __file__ нельга выкарыстоўваць у нататніку Jupyter (.ipynb).
Каталог, у якім знаходзіцца .ipynb, будзе выконвацца як бягучы каталог, незалежна ад каталога, у якім запускаецца Jupyter Notebook.
Для змены бягучага каталога можна выкарыстоўваць код os.chdir ().

os.getcwd () і __file__.

У Windows для праверкі бягучага каталога можна выкарыстоўваць каманду dir замест pwd.

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 і пазней вяртае абсалютны шлях да __file__, незалежна ад шляху, указанага ў камандзе python (або python3).

У наступным прыкладзе мы дадамо код у той жа файл сцэнарыя (file_path.py) у Python 3.7 і запусцім яго адносна вышэйпаказанага каталога.

У 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