Добијање локације (путање) покренуте датотеке у Питхону: __филе__.

Бусинесс

Да бисте добили локацију (путању) покренуте датотеке скрипте у Питхону, користите __филе__. Ово је корисно за учитавање других датотека на основу локације покренуте датотеке.

До Питхон 3.8, __филе__ враћа путању наведену приликом извршавања наредбе питхон (или наредбу питхон3 у неким окружењима). Ако је наведена релативна путања, враћа се релативна путања; ако је наведена апсолутна путања, враћа се апсолутна путања.

У Питхону 3.9 и новијим, апсолутна путања се враћа без обзира на путању наведену у време извођења.

Објашњени су следећи садржаји.

  • os.getcwd(),__file__
  • Добијте име датотеке и име директоријума датотеке која се тренутно извршава.
  • Добијте апсолутну путању датотеке која се извршава.
  • Чита друге датотеке на основу локације датотеке која се тренутно извршава.
  • Преместите тренутни директоријум у директоријум датотеке која се извршава.
  • Иста обрада се може обавити без обзира на тренутни директоријум у току извођења.

Погледајте следећи чланак за информације о добијању и промени тренутног директоријума (радног именика).

Имајте на уму да се __филе__ не може користити у Јупитер Нотебоок -у (.ипинб).
Директоријум у коме се налази .ипинб извршаваће се као тренутни директоријум, без обзира на директоријум у којем је покренута Јупитер Нотебоок.
Могуће је користити ос.цхдир () у коду за промену тренутног директоријума.

ос.гетцвд () и __филе__.

У оперативном систему Виндовс можете да користите наредбу дир уместо пвд да бисте проверили тренутни директоријум.

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

Направите Питхон датотеку скрипте (филе_патх.пи) са следећим садржајем на нижем нивоу (дата \ срц).

import os

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

Покрените команду питхон (или команду питхон3 у неким окружењима) наводећи путању до датотеке скрипте.

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

Апсолутни пут до тренутног директоријума може се добити помоћу ос.гетцвд (). Такође можете користити __филе__ да бисте добили путању одређену командом питхон3.

До Питхон 3.8, __филе__ ће садржати путању наведену у команди питхон (или питхон3). У горњем примеру, релативна путања се враћа јер је релативна, али се апсолутна путања враћа ако је апсолутна.

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

Питхон 3.9 и новији враћа апсолутну путању до __филе__, без обзира на путању наведену у команди питхон (или питхон3).

У следећем примеру додаћемо код у исту датотеку скрипте (филе_патх.пи) у Питхону 3.7 и покренути је у односу на горњи директоријум.

У Питхону 3.7 користи се апсолутна путања. Резултати су приказани на крају овог одељка.

Добијте име датотеке и име директоријума датотеке која се тренутно извршава.

Да бисте добили име датотеке и име директоријума покренуте датотеке, користите следећу функцију у модулу ос.патх стандардне библиотеке.

  • 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

Добијте апсолутну путању датотеке која се извршава.

Ако се релативна путања добије помоћу __филе__, она се може претворити у апсолутну путању помоћу ос.патх.абспатх (). Директоријуми се такође могу добити као апсолутни путеви.

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__)

Чита друге датотеке на основу локације датотеке која се тренутно извршава.

Ако желите да читате друге датотеке на основу локације (путање) датотеке која се извршава, придружите следеће две датотеке помоћу ос.патх.јоин ().

  • Директоријум датотеке која се извршава
  • Релативна путања до датотеке која се чита из покренуте датотеке.

Ако желите да прочитате датотеку у истом директоријуму као датотека коју покрећете, само повежите име датотеке.

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" !!

Горњи ниво је представљен са „. \“. Можете га оставити како јесте, али можете користити ос.патх.нормпатх () за нормализацију путање и уклањање додатних „. \“ И других знакова.

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" !!

Преместите тренутни директоријум у директоријум датотеке која се извршава.

Помоћу ос.цхдир () преместите тренутни директоријум у директоријум датотеке која се извршава у скрипти.

Можете видети да је премештен ос.гетцвд ().

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" !!

Иста обрада се може обавити без обзира на тренутни директоријум у току извођења.

Као што смо показали, могуће је учитати датотеке на основу локације датотеке скрипте, независно од тренутног директоријума у ​​току извођења, користећи један од следећих метода.

  • Повежите директоријум покренуте датотеке и релативну путању до датотеке која се чита из покренуте датотеке помоћу ос.патх.јоин ().
  • Преместите тренутни директоријум у директоријум датотеке која се извршава.

Лакше је преместити тренутни директоријум, али наравно, ако желите да након тога прочитате или напишете још датотека, морате узети у обзир да је тренутни директоријум премештен.

Резултати претходних примера су сумирани у наставку.

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