Python -да жұмыс істейтін файлдың орнын (жолын) алу: __файл__.

Іскерлік

Python -да жұмыс істейтін сценарий файлының орнын (жолын) алу үшін __file__ пайдаланыңыз. Бұл іске қосылған файлдың орналасқан жеріне байланысты басқа файлдарды жүктеу үшін пайдалы.

Python 3.8 дейін __file__ python командасын орындау кезінде көрсетілген жолды қайтарады (немесе кейбір орталарда python3 пәрмені). Егер салыстырмалы жол көрсетілсе, салыстырмалы жол қайтарылады; егер абсолюттік жол көрсетілсе, абсолюттік жол қайтарылады.

Python 3.9 және одан кейінгі нұсқаларында абсолюттік жол жұмыс уақытында көрсетілген жолға қарамастан қайтарылады.

Келесі мазмұн түсіндіріледі.

  • os.getcwd(),__file__
  • Файлдың атауын және қазіргі уақытта орындалатын файлдың каталог атауын алыңыз.
  • Орындалатын файлдың абсолютті жолын алыңыз.
  • Басқа файлдарды қазіргі уақытта орындалатын файлдың орналасуына қарай оқиды.
  • Ағымдағы каталогты орындалатын файлдың каталогына жылжытыңыз.
  • Дәл осындай өңдеуді жұмыс уақытындағы ағымдағы каталогқа қарамастан жасауға болады.

Ағымдағы каталогты (жұмыс каталогын) алу және өзгерту туралы ақпаратты келесі мақаладан қараңыз.

Назар аударыңыз, __file__ Jupyter жазу кітапшасында (.ipynb) қолданылмайды.
.Ipynb орналасқан каталог Jupyter Notebook іске қосылған каталогқа қарамастан ағымдағы каталог ретінде орындалады.
Ағымдағы каталогты өзгерту үшін кодта 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 () көмегімен алуға болады. Python3 пәрменімен көрсетілген жолды алу үшін __file__ қолдануға болады.

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