في هذا القسم، نلقي نظرة على عدد قليل من وحدات الأدوات القياسية في لغة بايثون لحل المشكلات الشائعة.
نظام الملفات -- os، os.path، Shoil
تتضمن وحدتا *os* و *os.path* العديد من الدوال للتفاعل مع نظام الملفات. يمكن للوحدة *shutil* نسخ الملفات.
- مستندات وحدات نظام التشغيل
- filenames = os.listdir(dir) -- قائمة بأسماء الملفات في مسار الدليل هذا (لا يشمل . و ..). أسماء الملفات هي الأسماء الواردة في الدليل فقط، وليست مساراتها المطلقة.
- os.path.join(dir, filename) -- ضع اسم ملف من القائمة أعلاه واستخدِم هذا الاسم لوضع dir واسم الملف معًا لإنشاء مسار
- os.path.abspath(path) -- نظرًا إلى مسار، يتم عرض نموذج مطلق، على سبيل المثال /home/nick/foo/bar.html
- os.path.dirname(path), os.path.basename(path) -- ضع dir/foo/bar.html، اعرض dirname "dir/foo" واسم القاعدة "bar.html"
- os.path.exists(path) -- صحيح إذا كان موجودًا
- os.mkdir(dir_path) -- يجعل واحدًا من dir، وينشئ os.makedirs(dir_path) جميع dirs المطلوبة في هذا المسار
- Takeil.copy(source-path, dest-path) -- نسخ ملف (من المفترض أن تكون أدلة مسار الوجهة موجودة)
## Example pulls filenames from a dir, prints their relative and absolute paths def printdir(dir): filenames = os.listdir(dir) for filename in filenames: print(filename) ## foo.txt print(os.path.join(dir, filename)) ## dir/foo.txt (relative to current dir) print(os.path.abspath(os.path.join(dir, filename))) ## /home/nick/dir/foo.txt
استكشاف وحدة ما يعمل بشكل جيد مع الدالتين python help() وdir(). في أداة الترجمة، قم بإجراء "استيراد نظام التشغيل"، ثم استخدم هذه الأوامر وابحث عن ما هو متاح في الوحدة: dir(os)، help(os.listdir)، dir(os.path)، help(os.path.dirname).
تشغيل العمليات الخارجية -- العملية الفرعية
وحدة *العملية الفرعية* هي طريقة بسيطة لتشغيل أمر خارجي والحصول على مخرجاته.
- مستندات وحدة المعالجة الفرعية
- المخرج = subprocess.check_output(cmd, stderr=subprocess.STDOUT) -- يُدير الأمر، وينتظر حتى يخرج منه، ثم يُرجع نص الإخراج. يتم تشغيل الأمر مع مخرجاته القياسية وخطأه القياسي المدمج في نص المخرجات. وإذا فشلت، تعرض الحالة CalledProcessError.
- إذا كنت تريد مزيدًا من التحكّم في تشغيل العملية الفرعية، راجِع subprocess.popen class.
- هناك أيضًا أمر subprocess.call(cmd) بسيط يدير الأمر ويفرغ مخرجاته في مخرجاتك وتعيد رمز الخطأ له. يعمل هذا إذا كنت تريد تشغيل الأمر ولكن لا تحتاج إلى التقاط مخرجاته في هياكل بيانات بايثون.
import subprocess ## Given a dir path, run an external 'ls -l' on it -- ## shows how to call an external program def listdir(dir): cmd = 'ls -l ' + dir print("Command to run:", cmd) ## good to debug cmd before actually running it (status, output) = subprocess.getstatusoutput(cmd) if status: ## Error case, print the command's output to stderr and exit sys.stderr.write(output) sys.exit(status) print(output) ## Otherwise do something with the command's output
الاستثناءات
يمثل الاستثناء خطأ وقت التشغيل الذي يوقف التنفيذ العادي في سطر معين وينقل عنصر التحكم إلى رمز معالجة الخطأ. يتناول هذا القسم فقط الاستخدامات الأساسية للاستثناءات. على سبيل المثال، قد يكون خطأ وقت التشغيل هو أنّ المتغير المستخدم في البرنامج لا يحتوي على قيمة (ValueError .. ربما رأيتها هذه القيمة عدة مرات)، أو خطأ في عملية فتح ملف بسبب عدم وجود الملف (IOError). يمكنك التعرّف على مزيد من المعلومات في البرنامج التعليمي للاستثناءات والاطّلاع على قائمة الاستثناءات بالكامل.
في حال عدم توفّر أي رمز برمجي لمعالجة أخطاء (كما فعلت حتى الآن)، يؤدي استثناء وقت التشغيل إلى إيقاف البرنامج وعرض رسالة خطأ. هذا سلوك افتراضي جيد، وقد رأيته عدة مرات. يمكنك إضافة "محاولة/استثناء" هيكلة للتعليمة البرمجية للتعامل مع الاستثناءات، مثل هذا:
try: ## Either of these two lines could throw an IOError, say ## if the file does not exist or the read() encounters a low level error. f = open(filename, 'rb') data = f.read() f.close() except IOError: ## Control jumps directly to here if any of the above lines throws IOError. sys.stderr.write('problem reading:' + filename) ## In any case, the code then continues with the line after the try/except
يتضمن قسم test: التعليمة البرمجية التي قد تنشئ استثناء. يحتوي قسم "باستثناء:" على الرمز الذي يتم تشغيله في حالة وجود استثناء. وفي حال عدم وجود استثناء، يتمّ تخطي القسم "باستثناء:" (أي أنّ هذا الرمز مخصّص لمعالجة الأخطاء فقط، وليس الحالة "العادية" للرمز). يمكنك الحصول على مؤشر لكائن الاستثناء نفسه باستخدام بناء الجملة "باستثناء IOError مثل e: .." (يشير e إلى كائن الاستثناء).
HTTP -- urllib وurlparse
توفر الوحدة *urllib.request* جلب عنوان url -- مما يجعل عنوان URL يبدو مثل ملف يمكنك القراءة منه. يمكن لوحدة *urlparse* تفكيك عناوين URL وتجميعها.
- مستندات وحدة urllib.request
- ufile = urllib.request.urlopen(url) -- يعرض ملفًا مثل الكائن لعنوان URL هذا
- text = ufile.read() -- يمكنه القراءة منه، مثل ملف (readlines() وما إلى ذلك يعمل أيضًا)
- info = ufile.info() -- المعلومات الوصفية لهذا الطلب. info.gettype() هو نوع mime، على سبيل المثال "نص/html"
- baseurl = ufile.geturl() -- تحصل على "base" عنوان url للطلب، والذي قد يختلف عن العنوان الأصلي بسبب عمليات إعادة التوجيه
- urllib.request.urlretrieve(url, filename) -- تنزيل بيانات عنوان url إلى مسار الملف المحدد
- urllib.parse.urljoin(baseurl, url) -- نظرًا إلى عنوان url قد يكون ممتلئًا أو قد لا يكون ممتلئًا، وbaseurl للصفحة التي تأتي منها، تعرض عنوان url كاملاً. استخدِم الطريقة geturl() أعلاه لتوفير عنوان URL الأساسي.
جميع الاستثناءات موجودة في urllib.error.
from urllib.request import urlopen ## Given a url, try to retrieve it. If it's text/html, ## print its base url and its text. def wget(url): ufile = urlopen(url) ## get file-like object for url info = ufile.info() ## meta-info about the url content if info.get_content_type() == 'text/html': print('base url:' + ufile.geturl()) text = ufile.read() ## read all its text print(text)
يعمل الرمز البرمجي أعلاه بشكل جيد، ولكنه لا يتضمّن معالجة خطأ إذا كان عنوان URL لا يعمل لسبب ما. إليك نسخة من الدالة التي تضيف منطق "تجربة/استثناء" لطباعة رسالة خطأ في حال تعذُّر عملية عنوان URL.
إذا بدا أنّ urlopen()
معلّق، فقد لا يسمح نظامك بالوصول المباشر إلى بعض
. يمكنك التأكّد من ذلك من خلال محاولة استرجاع عنوان URL نفسه باستخدام wget
أو
curl
إذا أخفقت هذه البرامج أيضًا، ستحتاج إلى جلب محتوى http من خلال خادم وكيل.
خدمة ما. لا يتناول هذا البرنامج التعليمي تهيئة الوصول إلى الخادم الوكيل.
## Version that uses try/except to print an error message if the ## urlopen() fails. def wget2(url): try: ufile = urlopen(url) if ufile.info().get_content_type() == 'text/html': print(ufile.read()) except IOError: print('problem reading url:', url)
تمارين
للتدرب على مواد نظام الملفات والأوامر الخارجية، يُرجى الاطِّلاع على نسخ التمرين الخاص. للتدرب على مواد urllib، يمكنك الاطّلاع على تمرين لغز السجلّات.