دریافت محل (مسیر) یک فایل در حال اجرا در پایتون: __file__.

کسب و کار

برای دریافت مکان (مسیر) یک فایل اسکریپت در حال اجرا در پایتون ، از __file__ استفاده کنید. این برای بارگیری سایر فایل ها بر اساس موقعیت فایل در حال اجرا مفید است.

تا پایتون 3.8 ، __file__ مسیر مشخص شده هنگام اجرای دستور پایتون (یا فرمان python3 در برخی از محیط ها) را برمی گرداند. در صورت مشخص شدن مسیر نسبی ، مسیر نسبی بازگردانده می شود. اگر یک مسیر مطلق مشخص شود ، مسیر مطلق برمی گردد.

در پایتون 3.9 و بالاتر ، مسیر مطلق بدون توجه به مسیری که در زمان اجرا مشخص شده است ، بازگردانده می شود.

مطالب زیر توضیح داده شده است.

  • os.getcwd()،__file__
  • نام فایل و نام فهرست فایل در حال اجرا را دریافت کنید.
  • مسیر مطلق پرونده در حال اجرا را دریافت کنید.
  • بر اساس موقعیت فایل در حال اجرا فایل های دیگر را می خواند.
  • دایرکتوری فعلی را به فهرست پوشه در حال اجرا منتقل کنید.
  • همان پردازش را می توان بدون در نظر گرفتن فهرست فعلی در زمان اجرا انجام داد.

برای اطلاع از دریافت و تغییر فهرست فعلی (فهرست راهنمای کار) به مقاله زیر مراجعه کنید.

توجه داشته باشید که __file__ در Jupyter Notebook (.ipynb) قابل استفاده نیست.
دایرکتوری که .ipynb در آن قرار دارد بدون توجه به فهرست راهنمای Jupyter Notebook به عنوان فهرست فعلی اجرا می شود.
ممکن است برای تغییر فهرست فعلی از () os.chdir () در کد استفاده کنید.

os.getcwd () و __fail__.

در ویندوز ، می توانید از دستور dir به جای pwd برای بررسی فهرست فعلی استفاده کنید.

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

یک فایل اسکریپت پایتون (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 () بدست آورد. همچنین می توانید از __file__ برای دریافت مسیر مشخص شده توسط دستور python3 استفاده کنید.

تا پایتون 3.8 ، __file__ شامل مسیری است که در فرمان پایتون (یا 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

پایتون 3.9 و بعد از آن ، مسیر مطلق را بدون در نظر گرفتن مسیر مشخص شده در دستور python (یا python3) به __file__ باز می گرداند.

در مثال زیر ، کد را به همان فایل اسکریپت (file_path.py) در پایتون 3.7 اضافه می کنیم و آن را نسبت به پوشه فوق اجرا می کنیم.

در پایتون 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