Li Python cîh (rê) pelê xebitandî digirin: __file__.

Dikan

Ji bo ku hûn cîh (rê) pelê nivîsek xebitandî li Python bistînin, __file__ bikar bînin. Ev ji bo barkirina pelên din ên li gorî cîhê pelê xebitandî kêrhatî ye.

Heya Python 3.8, __file__ gava ku fermana python (an fermana python3 li hin hawîrdoran) bicîh tîne rêça ku hatî vegerandin vedigere. Ger rêyek nisbî bê diyar kirin, riya nisbî tê vegerandin; ger rêyek bêkêmasî were diyar kirin, riya teqez tê vegerandin.

Di Python 3.9 û paşê de, riya bêkêmasî vedigere bêyî riya ku di dema xebitandinê de hatî destnîşan kirin.

Naverokên jêrîn têne rave kirin.

  • os.getcwd(),__file__
  • Navê pelê û navê peldanka pelê ku nuha dixebite bistînin.
  • Rêya bêkêmasî ya pelê ku tê darve kirin bistînin.
  • Pelên din li ser bingeha cîhê pelê ku nuha çêdike dixwîne.
  • Peldanka heyî veguhezînin pelrêça pelê ku tê darve kirin.
  • Heman pêvajo dikare bêyî xebitandina peldanka heyî di dema xebatê de were kirin.

Ji bo agahdariya li ser girtin û guheztina peldanka heyî (pelrêça xebatê) li gotara jêrîn binêrin.

Têbînî ku __file__ di Jupyter Notebook (.ipynb) de nayê bikar anîn.
Peldanka ku .ipynb tê de ye dê wekî peldanka heyî were bicîh kirin, bêyî ku pelrêça ku Jupyter Notebook lê dest pê kiriye.
Vê gengaz e ku di kodê de os.chdir () bikar bînin da ku pelrêça heyî biguhezînin.

os.getcwd () û __file__.

Di Windows -ê de, hûn dikarin li şûna pwd fermana dir bikar bînin da ku pelrêça heyî kontrol bikin.

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

Di naveroka jêrîn de pelê nivîsek Python (file_path.py) bi naveroka jêrîn (data \ src) biafirînin.

import os

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

Fermana python (an fermana python3 di hin hawîrdoran de) bicîh bikin ku rê li pelê nivîsandinê vedike.

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

Rêya bêkêmasî ya peldanka heyî dikare bi os.getcwd () were wergirtin. Her weha hûn dikarin __file__ bikar bînin da ku riya ku bi fermana python3 hatî destnîşan kirin bistînin.

Heya Python 3.8, __file__ dê rêça ku di fermana python (an python3) de hatî destnîşan kirin bigire. Di mînaka jorîn de, riya nisbî tê vegerandin ji ber ku ew têkildar e, lê ger ku bêkêmasî be riya teqez tê vegerandin.

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 û paşê vedigere riya bêkêmasî li __file__, bêyî ku rê di fermana python (an python3) de hatî destnîşan kirin.

Di mînaka jêrîn de, em ê kodê li heman pelê skrîptê (file_path.py) li Python 3.7 zêde bikin û ew li gorî peldanka jorîn bixebitînin.

Di Python 3.7 de, riya bêkêmasî tête bikar anîn. Encam di dawiya vê beşê de têne xuyang kirin.

Navê pelê û navê peldanka pelê ku nuha dixebite bistînin.

Ji bo ku hûn navê pelê û navê pelrêça pelê xebitandinê bistînin, di modulasyona os.path a pirtûkxaneya standard de fonksiyona jêrîn bikar bînin.

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

Encama darvekirinê.

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

Rêya bêkêmasî ya pelê ku tê darve kirin bistînin.

Ger bi __file__ re rêçek têkildar were girtin, ew dikare bi os.path.abspath () re bibe rêyek bêkêmasî. Derhêner jî dikarin wekî rêyên bêkêmasî werin wergirtin.

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

Encama darvekirinê.

# 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

Ger di os.path.abspath () de rêyek bêkêmasî were destnîşan kirin, ew ê wekî xwe vegere. Ji ber vê yekê, ger __file__ rêyek bêkêmasî ye, ya jêrîn dê bibe sedema xeletiyê.

  • os.path.abspath(__file__)

Pelên din li ser bingeha cîhê pelê ku nuha çêdike dixwîne.

Heke hûn dixwazin pelên din ên li ser bingeha cîh (rê) pelê ku têne darve kirin bixwînin, bi karanîna os.path.join () beşdarî du pelên jêrîn bibin.

  • Pelrêça pelê ku tê darve kirin
  • Rêça têkildar a pelê ku ji pelê xebitandinê were xwendin.

Heke hûn dixwazin pelê di heman pelrêça pelê ku hûn dimeşînin de bixwînin, tenê navê pelê bi hev ve girê bidin.

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

Encama darvekirinê.

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

Asta jorîn bi “. \” Tê nîşandan. Hûn dikarin wê wekî xwe bihêlin, lê hûn dikarin os.path.normpath () bikar bînin da ku rê normalîze bikin û “. \” Yên din û karakterên din jê bibin.

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

Encama darvekirinê.

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

Peldanka heyî veguhezînin pelrêça pelê ku tê darve kirin.

Os.chdir () bikar bînin da ku peldanka heyî veguhezînin pelrêça pelê ku di nivîsarê de hatî darve kirin.

Hûn dikarin bibînin ku ew ji hêla os.getcwd () ve tê veguheztin.

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

Encama darvekirinê.

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

Dema ku pelrêça heyî hate veguheztin, dema xwendina pelê hewce nake ku meriv wê bi pelrêça pelika xebitandî re bike yek. Hûn dikarin tenê rêça têkildarî pelrêça pelê xebitandî destnîşan bikin.

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

Encama darvekirinê.

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

Heman pêvajo dikare bêyî xebitandina peldanka heyî di dema xebatê de were kirin.

Wekî ku me destnîşan kir, gengaz e ku meriv pelên li gorî cîhê pelê nivîsandinê, serbixwe ji peldanka heyî di dema xebatê de, yek ji wan awayên jêrîn, barkirin.

  • Peldanka pelê xebitandî û riya pêwendîdar a pelê ku ji pelê xebitandinê bi karanîna os.path.join () tê xwendin bixwînin.
  • Peldanka heyî veguhezînin pelrêça pelê ku tê darve kirin.

Veguheztina pelrêça heyî hêsantir e, lê bê guman, ger hûn bixwazin piştî wê bêtir pelan bixwînin an binivîsin, hûn hewce ne ku bihesibînin ku pelrêça heyî hatî veguheztin.

Encamên nimûneyên berê li jêr têne kurt kirin.

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

Encama diyarkirina riya mutleq wiha ye.

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

Encama veguheztina peldanka heyî di termînalê de û bicihanîna heman pelê senaryoyê li jêr tê xuyang kirin. Hûn dikarin bibînin ku heman pelê heya ku ji cîhek cûda were darve kirin jî dikare were xwendin.

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