سؤال

نظرا لمسار مثل "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

https://pypi.org/project/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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top