ដើម្បីទទួលបានទីតាំង (ផ្លូវ) នៃឯកសារស្គ្រីបដែលកំពុងដំណើរការនៅក្នុង Python សូមប្រើ __file__ ។ វាមានប្រយោជន៍សម្រាប់ការផ្ទុកឯកសារផ្សេងទៀតដោយផ្អែកលើទីតាំងរបស់ឯកសារដែលកំពុងដំណើរការ។
រហូតដល់ Python 3.8, __ file__ ត្រឡប់ផ្លូវដែលបានបញ្ជាក់នៅពេលប្រតិបត្តិពាក្យបញ្ជា python (ឬពាក្យបញ្ជា python3 នៅក្នុងបរិស្ថានខ្លះ) ។ ប្រសិនបើផ្លូវដែលទាក់ទងត្រូវបានបញ្ជាក់ផ្លូវដែលទាក់ទងត្រូវបានត្រលប់មកវិញ។ ប្រសិនបើផ្លូវជាក់លាក់មួយត្រូវបានបញ្ជាក់ផ្លូវដាច់ខាតត្រូវត្រលប់មកវិញ
នៅក្នុង Python 3.9 និងក្រោយមកផ្លូវដាច់ខាតត្រូវបានត្រឡប់មកវិញដោយមិនគិតពីផ្លូវដែលបានបញ្ជាក់នៅពេលដំណើរការ។
ខ្លឹមសារខាងក្រោមត្រូវបានពន្យល់។
os.getcwd()
,__file__
- យកឈ្មោះឯកសារនិងឈ្មោះថតនៃឯកសារដែលកំពុងដំណើរការ។
- ទទួលបានផ្លូវដាច់ខាតនៃឯកសារដែលកំពុងត្រូវបានប្រតិបត្តិ។
- អានឯកសារផ្សេងទៀតដោយផ្អែកលើទីតាំងនៃឯកសារដែលកំពុងដំណើរការបច្ចុប្បន្ន។
- ផ្លាស់ទីថតបច្ចុប្បន្នទៅថតឯកសារដែលត្រូវបានប្រតិបត្តិ។
- ដំណើរការដូចគ្នាអាចត្រូវបានធ្វើដោយមិនគិតពីថតបច្ចុប្បន្ននៅពេលដំណើរការ។
សូមមើលអត្ថបទខាងក្រោមសម្រាប់ព័ត៌មានអំពីការទទួលនិងការផ្លាស់ប្តូរបញ្ជីឈ្មោះបច្ចុប្បន្ន (បញ្ជីការងារ) ។
- អត្ថបទដែលទាក់ទង:ទទួលនិងផ្លាស់ប្តូរ (ផ្លាស់ទី) ថតបច្ចុប្បន្ននៅក្នុងភីតថុន
សូមកត់សម្គាល់ថាឯកសារ __ មិនអាចប្រើនៅក្នុងសៀវភៅកត់ត្រាជូភីតធឺ (.ipynb) បានទេ។
ថតដែល .ipynb មានទីតាំងនឹងត្រូវបានប្រតិបត្តិជាថតបច្ចុប្បន្នដោយមិនគិតពីថតដែល Jupyter Notebook ត្រូវបានចាប់ផ្តើម។
វាអាចប្រើ os.chdir () នៅក្នុងកូដដើម្បីផ្លាស់ប្តូរថតបច្ចុប្បន្ន។
- os.getcwd () និង __ ឯកសារ __ ។
- យកឈ្មោះឯកសារនិងឈ្មោះថតនៃឯកសារដែលកំពុងដំណើរការ។
- ទទួលបានផ្លូវដាច់ខាតនៃឯកសារដែលកំពុងត្រូវបានប្រតិបត្តិ។
- អានឯកសារផ្សេងទៀតដោយផ្អែកលើទីតាំងនៃឯកសារដែលកំពុងដំណើរការបច្ចុប្បន្ន។
- ផ្លាស់ទីថតបច្ចុប្បន្នទៅថតឯកសារដែលត្រូវបានប្រតិបត្តិ។
- ដំណើរការដូចគ្នាអាចត្រូវបានធ្វើដោយមិនគិតពីថតបច្ចុប្បន្ននៅពេលដំណើរការ។
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" !!