كيفية الحصول على مسار الملف المطلق في بايثون
-
09-06-2019 - |
سؤال
نظرا لمسار مثل "mydir/myfile.txt"
, كيف يمكنني العثور على المسار المطلق للملف بالنسبة إلى دليل العمل الحالي في بايثون؟على سبيل المثالعلى نظام التشغيل Windows، قد ينتهي بي الأمر بما يلي:
"C:/example/cwd/mydir/myfile.txt"
المحلول
>>> import os
>>> os.path.abspath("mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'
يعمل أيضًا إذا كان بالفعل مسارًا مطلقًا:
>>> import os
>>> os.path.abspath("C:/example/cwd/mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'
نصائح أخرى
يمكنك استخدام مكتبة Python 3.4 الجديدة pathlib
.(يمكنك أيضًا الحصول عليه لـ Python 2.6 أو 2.7 باستخدام pip install pathlib
.) المؤلفون كتب:"الهدف من هذه المكتبة هو توفير تسلسل هرمي بسيط للفئات للتعامل مع مسارات نظام الملفات والعمليات الشائعة التي يقوم بها المستخدمون عليها."
للحصول على المسار المطلق في نظام التشغيل Windows:
>>> from pathlib import Path
>>> p = Path("pythonw.exe").resolve()
>>> p
WindowsPath('C:/Python27/pythonw.exe')
>>> str(p)
'C:\\Python27\\pythonw.exe'
أو على يونيكس:
>>> from pathlib import Path
>>> p = Path("python3.4").resolve()
>>> p
PosixPath('/opt/python3/bin/python3.4')
>>> str(p)
'/opt/python3/bin/python3.4'
المستندات هنا: https://docs.python.org/3/library/pathlib.html
>>> import os
>>> os.path.abspath('mydir/myfile.txt')
'C:\\example\\cwd\\mydir\\myfile.txt'
>>>
والأفضل من ذلك، تثبيت الوحدة (الموجودة على PyPI
)، فإنه يلتف جميع os.path
الوظائف والوظائف الأخرى ذات الصلة إلى طرق على كائن يمكن استخدامها أينما يتم استخدام السلاسل:
>>> from path import path
>>> path('mydir/myfile.txt').abspath()
'C:\\example\\cwd\\mydir\\myfile.txt'
>>>
اليوم يمكنك أيضًا استخدام unipath
الحزمة التي كانت مبنية على path.py
: http://sluggo.scrapping.cc/python/unipath/
>>> from unipath import Path
>>> absolute_path = Path('mydir/myfile.txt').absolute()
Path('C:\\example\\cwd\\mydir\\myfile.txt')
>>> str(absolute_path)
C:\\example\\cwd\\mydir\\myfile.txt
>>>
أوصي باستخدام هذه الحزمة كما تقدمها واجهة نظيفة للأدوات المساعدة os.path المشتركة.
تحديث لبيثون 3.4+ pathlib
هذا في الواقع يجيب على السؤال:
from pathlib import Path
relative = Path("mydir/myfile.txt")
absolute = relative.absolute() # absolute is a Path object
إذا كنت تحتاج فقط إلى سلسلة مؤقتة، فضع في اعتبارك أنه يمكنك استخدامها Path
الكائنات مع جميع الوظائف ذات الصلة في os.path
, ، بما في ذلك بالطبع abspath
:
from os.path import abspath
absolute = abspath(relative) # absolute is a str object
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))
لاحظ أن expanduser
يعد ضروريًا (في نظام Unix) في حالة احتواء التعبير المحدد لاسم الملف (أو الدليل) وموقعه على مسافة بادئة ~/
(تشير التلدة إلى الدليل الرئيسي للمستخدم)، و expandvars
يعتني بأي متغيرات بيئة أخرى (مثل $HOME
).
أفضّل استخدام glob
إليك كيفية سرد كافة أنواع الملفات في المجلد الحالي الخاص بك:
import glob
for x in glob.glob():
print(x)
فيما يلي كيفية إدراج جميع ملفات .txt (على سبيل المثال) في المجلد الحالي:
import glob
for x in glob.glob('*.txt'):
print(x)
إليك كيفية سرد جميع أنواع الملفات في الدليل المختار:
import glob
for x in glob.glob('C:/example/hi/hello/'):
print(x)
نأمل أن يكون هذا ساعدك
وحدة os
يوفر وسيلة للعثور على مسار القيمة المطلقة.
لكن تبدأ معظم المسارات في Linux بـ ~
(تيلدا)، والتي لا تعطي نتيجة مرضية.
حتى تتمكن من استخدامها srblib
من أجل هذا.
>>> import os
>>> os.path.abspath('~/hello/world')
'/home/srb/Desktop/~/hello/world'
>>> from srblib import abs_path
>>> abs_path('~/hello/world')
'/home/srb/hello/world'
تثبيته باستخدام python3 -m pip install srblib
إذا كنت تستخدم جهاز Mac
import os
upload_folder = os.path.abspath("static/img/users")
سيعطيك هذا المسار الكامل:
print(upload_folder)
سيظهر المسار التالي:
>>>/Users/myUsername/PycharmProjects/OBS/static/img/user
في حالة استخدام شخص ما لـ python و Linux ويبحث عن المسار الكامل للملف:
>>> path=os.popen("readlink -f file").read()
>>> print path
abs/path/to/file
هذا دائماً يحصل على اسم الملف الصحيح للبرنامج النصي الحالي، حتى عندما يتم استدعاؤه من داخل برنامج نصي آخر.إنه مفيد بشكل خاص عند الاستخدام subprocess
.
import sys,os
filename = sys.argv[0]
ومن هناك، يمكنك الحصول على المسار الكامل للبرنامج النصي باستخدام:
>>> os.path.abspath(filename)
'/foo/bar/script.py'
كما أنه يسهل التنقل بين المجلدات بمجرد الإلحاق /..
عدة مرات كما تريد الصعود في التسلسل الهرمي للأدلة.
للحصول على سي دي:
>>> os.path.abspath(filename+"/..")
'/foo/bar'
بالنسبة للمسار الأصلي:
>>> os.path.abspath(filename+"/../..")
'/foo'
من خلال الجمع بين "/.."
مع أسماء الملفات الأخرى، يمكنك الوصول إلى أي ملف في النظام.
filePath = os.path.abspath(directoryName)
filePathWithSlash = filePath + "\\"
filenameWithPath = os.path.join(filePathWithSlash, filename)