الحصول على موقع (مسار) ملف قيد التشغيل في بايثون: __ملف__.

اعمال

للحصول على موقع (مسار) ملف نصي قيد التشغيل في Python ، استخدم __file__. هذا مفيد لتحميل ملفات أخرى بناءً على موقع الملف قيد التشغيل.

حتى Python 3.8 ، يعرض __file__ المسار المحدد عند تنفيذ أمر python (أو أمر python3 في بعض البيئات). إذا تم تحديد مسار نسبي ، يتم إرجاع المسار النسبي ؛ إذا تم تحديد مسار مطلق ، يتم إرجاع المسار المطلق.

في Python 3.9 والإصدارات الأحدث ، يتم إرجاع المسار المطلق بغض النظر عن المسار المحدد في وقت التشغيل.

يتم شرح المحتويات التالية.

  • os.getcwd()و__file__
  • احصل على اسم الملف واسم الدليل للملف الجاري تنفيذه حاليًا.
  • احصل على المسار المطلق للملف الجاري تنفيذه.
  • يقرأ الملفات الأخرى بناءً على موقع الملف الجاري تنفيذه حاليًا.
  • انقل الدليل الحالي إلى دليل الملف الجاري تنفيذه.
  • يمكن إجراء نفس المعالجة بغض النظر عن الدليل الحالي في وقت التشغيل.

راجع المقالة التالية للحصول على معلومات حول الحصول على الدليل الحالي وتغييره (دليل العمل).

لاحظ أنه لا يمكن استخدام __الملف__ في Jupyter Notebook (.ipynb).
سيتم تنفيذ الدليل الذي يوجد به .ipynb على أنه الدليل الحالي ، بغض النظر عن الدليل الذي تم تشغيل دفتر Jupyter فيه.
من الممكن استخدام os.chdir () في الكود لتغيير الدليل الحالي.

os.getcwd () و __ملف__.

في Windows ، يمكنك استخدام الأمر dir بدلاً من pwd للتحقق من الدليل الحالي.

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 (). يمكنك أيضًا استخدام __file__ للحصول على المسار المحدد بواسطة أمر python3.

حتى 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 والإصدارات الأحدث بإرجاع المسار المطلق إلى __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

احصل على المسار المطلق للملف الجاري تنفيذه.

إذا تم الحصول على مسار نسبي باستخدام __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 () ، فسيتم إعادته كما هو. لذلك ، إذا كان __الملف__ مسارًا مطلقًا ، فلن يتسبب ما يلي في حدوث خطأ.

  • 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