පයිතන් හි ක්රියාත්මක වන ස්ක්රිප්ට් ගොනුවක පිහිටීම (මාර්ගය) ලබා ගැනීමට __file__ භාවිතා කරන්න. ක්රියාත්මක වන ගොනුවේ පිහිටීම මත පදනම්ව වෙනත් ගොනු පැටවීම සඳහා මෙය ප්රයෝජනවත් වේ.
පයිතන් 3.8 දක්වා, __file__ පයිතන් විධානය ක්රියාත්මක කිරීමේදී නිශ්චිත මාර්ගය ලබා දෙයි (හෝ සමහර පරිසර වල පයිතන් 3 විධානය). සාපේක්ෂ මාවතක් නියම කර ඇත්නම්, අදාළ මාර්ගය ආපසු ලැබේ; නිරපේක්ෂ මාවතක් නියම කර ඇත්නම්, නිරපේක්ෂ මාර්ගය ආපසු ලැබේ.
පයිතන් 3.9 හි සහ පසුව, ධාවන වේලාවේදී සඳහන් කළ මාර්ගය නොසලකා නිරපේක්ෂ මාර්ගය ආපසු ලබා දෙනු ඇත.
පහත දැක්වෙන කරුණු පැහැදිලි කර ඇත.
os.getcwd()
,__file__
- දැනට ක්රියාත්මක කරන ගොනුවේ ගොනුවේ නම සහ නාමාවලියෙහි නම ලබා ගන්න.
- ක්රියාත්මක වන ගොනුවේ නිරපේක්ෂ මාර්ගය ලබා ගන්න.
- දැනට ක්රියාත්මක වන ගොනුවේ පිහිටීම මත පදනම්ව අනෙකුත් ලිපිගොනු කියවයි.
- ක්රියාත්මක වන ගොනුවේ නාමාවලිය වෙත වත්මන් නාමාවලිය ගෙන යන්න.
- ධාවන වේලාවේ වත්මන් නාමාවලිය නොසලකා එකම සැකසීම කළ හැකිය.
වත්මන් නාමාවලිය (වැඩ කරන නාමාවලිය) ලබා ගැනීම සහ වෙනස් කිරීම පිළිබඳ තොරතුරු සඳහා පහත ලිපිය බලන්න.
බ්රහස්පති සටහන් පොතේ (.ipynb) __file__ භාවිතා කළ නොහැකි බව සලකන්න.
ජුපිටර් නෝට්බුක් ආරම්භ කර ඇති නාමාවලිය කුමක් වුවත් .ipynb පිහිටා ඇති නාමාවලිය වත්මන් නාමාවලිය ලෙස ක්රියාත්මක වේ.
වත්මන් නාමාවලිය වෙනස් කිරීම සඳහා කේතයේ os.chdir () භාවිතා කළ හැකිය.
- os.getcwd () සහ __file__.
- දැනට ක්රියාත්මක කරන ගොනුවේ ගොනුවේ නම සහ නාමාවලියෙහි නම ලබා ගන්න.
- ක්රියාත්මක වන ගොනුවේ නිරපේක්ෂ මාර්ගය ලබා ගන්න.
- දැනට ක්රියාත්මක වන ගොනුවේ පිහිටීම මත පදනම්ව අනෙකුත් ලිපිගොනු කියවයි.
- ක්රියාත්මක වන ගොනුවේ නාමාවලිය වෙත වත්මන් නාමාවලිය ගෙන යන්න.
- ධාවන වේලාවේ වත්මන් නාමාවලිය නොසලකා එකම සැකසීම කළ හැකිය.
os.getcwd () සහ __file__.
වින්ඩෝස් වලදී, වර්තමාන නාමාවලිය පරීක්ෂා කිරීම සඳහා ඔබට pwd වෙනුවට dir විධානය භාවිතා කළ හැකිය.
pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook
පහත දැක්වෙන අන්තර්ගතයන් පහළ මට්ටමේ (දත්ත \ src) සහිත පයිතන් ස්ක්රිප්ට් ගොනුවක් (file_path.py) සාදන්න.
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
වත්මන් නාමාවලිය වෙත ඇති නිරපේක්ෂ මාර්ගය os.getcwd () සමඟ ලබා ගත හැකිය. Python3 විධානය මඟින් නියම කර ඇති මාර්ගය ලබා ගැනීමට ඔබට __file__ භාවිතා කළ හැකිය.
පයිතන් 3.8 දක්වා, __file__ හි පයිතන් (හෝ පයිතන් 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) විධානයෙහි දක්වා ඇති මාර්ගය කුමක් වුවත් නියත මාර්ගය __file__ වෙත ආපසු ලබා දේ.
පහත උදාහරණයෙන් අපි පයිතන් 3.7 හි ඇති එකම ස්ක්රිප්ට් ගොනුවට (file_path.py) කේතය එකතු කර ඉහත නාමාවලියට සාපේක්ෂව ක්රියාත්මක කරන්නෙමු.
පයිතන් 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" !!