ការទទួលបានទីតាំង (ផ្លូវ) នៃឯកសារដែលកំពុងដំណើរការនៅ Python៖ __ ឯកសារ __ ។

អាជីវកម្ម

ដើម្បីទទួលបានទីតាំង (ផ្លូវ) នៃឯកសារស្គ្រីបដែលកំពុងដំណើរការនៅក្នុង Python សូមប្រើ __file__ ។ វាមានប្រយោជន៍សម្រាប់ការផ្ទុកឯកសារផ្សេងទៀតដោយផ្អែកលើទីតាំងរបស់ឯកសារដែលកំពុងដំណើរការ។

រហូតដល់ Python 3.8, __ file__ ត្រឡប់ផ្លូវដែលបានបញ្ជាក់នៅពេលប្រតិបត្តិពាក្យបញ្ជា python (ឬពាក្យបញ្ជា python3 នៅក្នុងបរិស្ថានខ្លះ) ។ ប្រសិនបើផ្លូវដែលទាក់ទងត្រូវបានបញ្ជាក់ផ្លូវដែលទាក់ទងត្រូវបានត្រលប់មកវិញ។ ប្រសិនបើផ្លូវជាក់លាក់មួយត្រូវបានបញ្ជាក់ផ្លូវដាច់ខាតត្រូវត្រលប់មកវិញ

នៅក្នុង Python 3.9 និងក្រោយមកផ្លូវដាច់ខាតត្រូវបានត្រឡប់មកវិញដោយមិនគិតពីផ្លូវដែលបានបញ្ជាក់នៅពេលដំណើរការ។

ខ្លឹមសារខាងក្រោមត្រូវបានពន្យល់។

  • os.getcwd(),__file__
  • យកឈ្មោះឯកសារនិងឈ្មោះថតនៃឯកសារដែលកំពុងដំណើរការ។
  • ទទួលបានផ្លូវដាច់ខាតនៃឯកសារដែលកំពុងត្រូវបានប្រតិបត្តិ។
  • អានឯកសារផ្សេងទៀតដោយផ្អែកលើទីតាំងនៃឯកសារដែលកំពុងដំណើរការបច្ចុប្បន្ន។
  • ផ្លាស់ទីថតបច្ចុប្បន្នទៅថតឯកសារដែលត្រូវបានប្រតិបត្តិ។
  • ដំណើរការដូចគ្នាអាចត្រូវបានធ្វើដោយមិនគិតពីថតបច្ចុប្បន្ននៅពេលដំណើរការ។

សូមមើលអត្ថបទខាងក្រោមសម្រាប់ព័ត៌មានអំពីការទទួលនិងការផ្លាស់ប្តូរបញ្ជីឈ្មោះបច្ចុប្បន្ន (បញ្ជីការងារ) ។

សូមកត់សម្គាល់ថាឯកសារ __ មិនអាចប្រើនៅក្នុងសៀវភៅកត់ត្រាជូភីតធឺ (.ipynb) បានទេ។
ថតដែល .ipynb មានទីតាំងនឹងត្រូវបានប្រតិបត្តិជាថតបច្ចុប្បន្នដោយមិនគិតពីថតដែល Jupyter Notebook ត្រូវបានចាប់ផ្តើម។
វាអាចប្រើ os.chdir () នៅក្នុងកូដដើម្បីផ្លាស់ប្តូរថតបច្ចុប្បន្ន។

os.getcwd () និង __ ឯកសារ __ ។

នៅក្នុងវីនដូអ្នកអាចប្រើពាក្យបញ្ជា dir ជំនួសឱ្យ pwd ដើម្បីពិនិត្យមើលថតបច្ចុប្បន្ន។

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

បង្កើតឯកសារស្គ្រីប Python (file_path.py) ដែលមានមាតិកាដូចខាងក្រោមនៅកម្រិតទាប (ទិន្នន័យ \ 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 ឯកសារ __ នឹងមានផ្លូវដែលបានបញ្ជាក់នៅក្នុងពាក្យបញ្ជា 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

ទទួលបានផ្លូវដាច់ខាតនៃឯកសារដែលកំពុងត្រូវបានប្រតិបត្តិ។

ប្រសិនបើផ្លូវដែលទាក់ទងត្រូវបានទទួលជាមួយ __ ឯកសារ __ វាអាចត្រូវបានបម្លែងទៅជាផ្លូវដាច់ខាតជាមួយ 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 () វានឹងត្រលប់មកវិញដូចដើម។ ដូច្នេះប្រសិនបើ __ ឯកសារ __ ជាផ្លូវដាច់ខាតខាងក្រោមនេះនឹងមិនបង្កឱ្យមានកំហុសទេ។

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