الفصل : 10
الجزء : 1
العنوان : الملفات والاستثناءات (FILES AND EXCEPTIONS)
الآن بعد أن أتقنت المهارات الأساسية التي تحتاجها لكتابة برامج منظمة وسهلة الاستخدام، حان الوقت للتفكير في جعل برامجك أكثر ملاءمة وقابلية للاستخدام. في هذا الفصل، ستتعلم كيفية العمل مع الملفات حتى تتمكن برامجك من تحليل الكثير من البيانات بسرعة.
ستتعلم كيفية التعامل مع الأخطاء حتى لا تنهار برامجك عند مواجهة مواقف غير متوقعة. ستتعلم عن الاستثناءات (exceptions)، وهي كائنات خاصة ينشئها Python لإدارة الأخطاء التي تنشأ أثناء تشغيل البرنامج. ستتعلم أيضًا عن وحدة json، التي تسمح لك بحفظ بيانات المستخدم حتى لا تضيع عند توقف برنامجك عن التشغيل.
سيسهل تعلم العمل مع الملفات وحفظ البيانات استخدام برامجك. سيتمكن المستخدمون من اختيار البيانات التي يدخلونها ومتى يدخلوها. سيتمكن الأشخاص من تشغيل برنامجك، والعمل عليه لبعض الوقت، ثم إغلاق البرنامج واستئناف العمل من حيث توقفوا. سيساعدك تعلم التعامل مع الاستثناءات على التعامل مع المواقف التي لا توجد فيها ملفات والتعامل مع مشكلات أخرى قد تتسبب في انهيار برامجك. سيجعل هذا برامجك أكثر متانة عند مواجهة بيانات غير صحيحة، سواء كانت تأتي من أخطاء بريئة أو من محاولات خبيثة لتعطيل برامجك. بالمهارات التي ستتعلمها في هذا الفصل، ستجعل برامجك أكثر تطبيقًا، قابلية للاستخدام، واستقرارًا.
قراءة من ملف (Reading from a File)
تتوفر كمية هائلة من البيانات في ملفات النصوص. يمكن أن تحتوي ملفات النصوص على بيانات الطقس، بيانات حركة المرور، بيانات اجتماعية اقتصادية، أعمال أدبية، وأكثر من ذلك. القراءة من ملف مفيدة بشكل خاص في تطبيقات تحليل البيانات، ولكنها تنطبق أيضًا على أي موقف تريد فيه تحليل أو تعديل المعلومات المخزنة في ملف. على سبيل المثال، يمكنك كتابة برنامج يقرأ محتويات ملف نصي ويعيد كتابة الملف بتنسيق يسمح للمتصفح بعرضه.
عندما تريد العمل مع المعلومات في ملف نصي، فإن الخطوة الأولى هي قراءة الملف إلى الذاكرة. يمكنك بعد ذلك العمل على كل محتويات الملف دفعة واحدة أو العمل من خلال المحتويات سطرًا بسطر.
قراءة محتويات ملف (Reading the Contents of a File)
لنبدأ، نحن بحاجة إلى ملف يحتوي على بعض الأسطر من النص. دعنا نبدأ بملف يحتوي على pi إلى 30 منزلة عشرية، مع 10 منازل عشرية لكل سطر:
لتجربة الأمثلة التالية بنفسك، يمكنك إدخال هذه الأسطر في محرر وحفظ الملف باسم pi_digits.txt . احفظ الملف في نفس الدليل حيث ستخزن برامج هذا الفصل.
إليك برنامج يفتح هذا الملف، يقرأه، ويطبع محتويات الملف على الشاشة:
للعمل مع محتويات ملف، نحتاج إلى إخبار Python بمسار الملف. المسار هو الموقع الدقيق لملف أو مجلد على النظام. يوفر Python وحدة تسمى pathlib التي تسهل العمل مع الملفات والمجلدات، بغض النظر عن نظام التشغيل الذي تعمل عليه أنت أو مستخدمو برنامجك. تسمى الوحدة التي توفر وظائف محددة مثل هذه عادة مكتبة، ومن هنا جاء اسم pathlib.
نبدأ باستيراد فئة Path من pathlib. هناك الكثير مما يمكنك القيام به مع كائن Path الذي يشير إلى ملف. على سبيل المثال، يمكنك التحقق من وجود الملف قبل العمل معه، قراءة محتويات الملف، أو كتابة بيانات جديدة إلى الملف. هنا، نبني كائن Path يمثل الملف pi_digits.txt، والذي نعينه إلى المتغير path ❶. نظرًا لأن هذا الملف محفوظ في نفس الدليل الذي نخزن فيه ملف .py الذي نكتبه، فإن اسم الملف هو كل ما يحتاجه Path للوصول إلى الملف.
ملحوظة:
يبحث VS Code عن الملفات في المجلد الذي تم فتحه مؤخرًا. إذا كنت تستخدم VS Code، ابدأ بفتح المجلد الذي تخزن فيه برامج هذا الفصل. على سبيل المثال، إذا كنت تحفظ ملفات برنامجك في مجلد يسمى chapter_10، اضغط على CTRL-O (⌘-O على macOS)، وافتح ذلك المجلد.
بمجرد أن نحصل على كائن Path يمثل pi_digits.txt، نستخدم الطريقة read_text() لقراءة كل محتويات الملف ❷. تُعاد محتويات الملف كسلسلة واحدة، والتي نعينها إلى المتغير contents. عندما نطبع قيمة contents، نرى كل محتويات الملف النصي:
الفرق الوحيد بين هذا الإخراج والملف الأصلي هو السطر الفارغ الإضافي في نهاية الإخراج. يظهر السطر الفارغ لأن read_text() تُرجع سلسلة فارغة عند وصولها إلى نهاية الملف؛ تظهر هذه السلسلة الفارغة كسطر فارغ.
يمكننا إزالة السطر الفارغ الإضافي باستخدام rstrip() على سلسلة contents:
تذكر من الفصل الثاني أن طريقة rstrip() في Python تزيل، أو تزيل، أي أحرف بيضاء من الجانب الأيمن من سلسلة. الآن يطابق الإخراج محتويات الملف الأصلي تمامًا:
يمكننا تجريد الحرف الجديد في نهاية السطر عند قراءة محتويات الملف، عن طريق تطبيق طريقة rstrip() مباشرة بعد استدعاء read_text():
تخبر هذه السطر Python باستدعاء طريقة read_text() على الملف الذي نعمل عليه. ثم تطبق طريقة rstrip() على السلسلة التي تُرجعها read_text(). تُعين السلسلة النظيفة بعد ذلك إلى المتغير contents. يُطلق على هذا النهج ربط الأساليب، وسترى استخدامه كثيرًا في البرمجة.
المسارات النسبية والمطلقة للملفات (Relative and Absolute File Paths)
عندما تمرر اسم ملف بسيط مثل pi_digits.txt إلى Path، يبحث Python في الدليل حيث يتم تخزين الملف الذي يتم تنفيذه حاليًا (أي ملف .py الخاص بك).
أحيانًا، اعتمادًا على كيفية تنظيم عملك، قد لا يكون الملف الذي تريد فتحه في نفس الدليل مثل ملف البرنامج الخاص بك. على سبيل المثال، قد تخزن ملفات برنامجك في مجلد يسمى python_work؛ داخل python_work، قد يكون لديك مجلد آخر يسمى text_files لتمييز ملفات برنامجك عن الملفات النصية التي يتم التلاعب بها. على الرغم من أن text_files في python_work، فإن مجرد تمرير Path اسم ملف في text_files لن يعمل، لأن Python سيبحث فقط في python_work ويتوقف هناك؛ لن يذهب ويبحث في text_files. لفتح ملفات من دليل غير الدليل الذي يتم تخزين ملف برنامجك فيه، تحتاج إلى توفير المسار الصحيح.
هناك طريقتان رئيسيتان لتحديد المسارات في البرمجة. يخبر المسار النسبي Python بالبحث عن موقع معين نسبةً إلى الدليل حيث يتم تخزين ملف البرنامج الذي يتم تشغيله حاليًا. نظرًا لأن text_files داخل python_work، نحتاج إلى بناء مسار يبدأ بالدليل text_files، وينتهي باسم الملف. إليك كيفية بناء هذا المسار:
يمكنك أيضًا إخبار Python بمكان الملف تمامًا على جهاز الكمبيوتر الخاص بك، بغض النظر عن مكان تخزين البرنامج الذي يتم تنفيذه. يُطلق على هذا اسم المسار المطلق. يمكنك استخدام المسار المطلق إذا لم يعمل المسار النسبي. على سبيل المثال، إذا كنت قد وضعت text_files في مجلد آخر غير python_work، فلن يعمل مجرد تمرير Path المسار 'text_files/filename.txt' لأن Python سيبحث عن هذا الموقع داخل python_work. ستحتاج إلى كتابة مسار مطلق لتوضيح المكان الذي تريد من Python البحث فيه.
عادةً ما تكون المسارات المطلقة أطول من المسارات النسبية، لأنها تبدأ من مجلد الجذر لنظامك:
باستخدام المسارات المطلقة، يمكنك قراءة الملفات من أي موقع على نظامك. حاليًا من الأسهل تخزين الملفات في نفس الدليل مثل ملفات برنامجك، أو في مجلد مثل text_files داخل الدليل الذي يخزن ملفات برنامجك.
ملحوظة:
تستخدم أنظمة Windows الشرطة المائلة العكسية (\) بدلاً من الشرطة المائلة الأمامية (/) عند عرض مسارات الملفات، ولكن يجب عليك استخدام الشرطة المائلة الأمامية في كودك، حتى على Windows. ستستخدم مكتبة pathlib التمثيل الصحيح للمسار تلقائيًا عند التفاعل مع نظامك، أو نظام أي مستخدم.
الوصول إلى أسطر ملف (Accessing a File’s Lines)
عند العمل مع ملف، ستحتاج غالبًا إلى فحص كل سطر من الملف. قد تكون تبحث عن معلومات معينة في الملف، أو قد ترغب في تعديل النص في الملف بطريقة ما. على سبيل المثال، قد ترغب في قراءة ملف يحتوي على بيانات الطقس والعمل مع أي سطر يتضمن كلمة sunny في وصف طقس ذلك اليوم. في تقرير إخباري، قد تبحث عن أي سطر يحمل الوسم <headline> وتعاد كتابة ذلك السطر بتنسيق معين.
يمكنك استخدام طريقة splitlines() لتحويل سلسلة طويلة إلى مجموعة من الأسطر، ثم استخدام حلقة for لفحص كل سطر من ملف، واحدًا في كل مرة:
نبدأ بقراءة كل محتويات الملف، كما فعلنا سابقًا ❶. إذا كنت تخطط للعمل مع الأسطر الفردية في ملف، فلا تحتاج إلى تجريد أي مسافات بيضاء عند قراءة الملف. تُرجع طريقة splitlines() قائمة بجميع الأسطر في الملف، ونعين هذه القائمة إلى المتغير lines ❷. ثم نمر عبر هذه الأسطر ونطبع كل واحدة:
نظرًا لأننا لم نعدل أيًا من الأسطر، يطابق الإخراج النص الأصلي للملف تمامًا.
العمل مع محتويات ملف
بعد قراءة محتويات ملف في الذاكرة، يمكنك القيام بأي شيء تريده بهذه البيانات، لذا دعنا نستكشف باختصار أرقام pi. أولاً، سنحاول بناء سلسلة واحدة تحتوي على كل الأرقام في الملف بدون مسافات بيضاء:
نبدأ بقراءة الملف وتخزين كل سطر من الأرقام في قائمة، كما فعلنا في المثال السابق. ثم نُنشئ متغيرًا، pi_string، لاحتواء أرقام pi. نكتب حلقة تضيف كل سطر من الأرقام إلى pi_string ❶. نطبع هذه السلسلة، ونظهر أيضًا طول السلسلة:
يحتوي المتغير pi_string على المسافات البيضاء التي كانت على الجانب الأيسر من الأرقام في كل سطر، ولكن يمكننا التخلص من ذلك باستخدام lstrip() على كل سطر:
الآن لدينا سلسلة تحتوي على pi إلى 30 منزلة عشرية. السلسلة طولها 32 حرفًا لأنها تتضمن أيضًا الرقم 3 الأول والفاصلة العشرية:
ملحوظة:
عند قراءة Python من ملف نصي، فإنه يفسر كل النص في الملف كسلسلة. إذا قرأت رقمًا وأردت العمل مع تلك القيمة في سياق رقمي، ستحتاج إلى تحويلها إلى عدد صحيح باستخدام الدالة int() أو إلى عدد عشري باستخدام الدالة float().
الملفات الكبيرة: مليون رقم
حتى الآن، ركزنا على تحليل ملف نصي يحتوي فقط على ثلاثة أسطر، ولكن الكود في هذه الأمثلة سيعمل بشكل جيد أيضًا على ملفات أكبر بكثير. إذا بدأنا بملف نصي يحتوي على pi إلى 1,000,000 منزلة عشرية، بدلاً من 30 فقط، يمكننا إنشاء سلسلة واحدة تحتوي على كل هذه الأرقام. لا نحتاج إلى تغيير برنامجنا على الإطلاق، باستثناء تمرير ملف مختلف له. سنطبع أيضًا فقط أول 50 منزلة عشرية، حتى لا نضطر إلى مشاهدة مليون رقم تمر عبر الطرفية:
ليس لدى Python حد جوهري لكمية البيانات التي يمكنك العمل معها؛ يمكنك العمل مع كمية البيانات التي يمكن لذاكرة نظامك التعامل معها.
ملحوظة:
لتشغيل هذا البرنامج (والعديد من الأمثلة التي تليها)، ستحتاج إلى تنزيل الموارد المتاحة على https://ehmatthes.github.io/pcc_3e.
هل تاريخ ميلادك موجود في pi؟
لطالما كنت فضوليًا لمعرفة ما إذا كان تاريخ ميلادي يظهر في أي مكان في أرقام pi. دعنا نستخدم البرنامج الذي كتبناه للتو لمعرفة ما إذا كان تاريخ ميلاد شخص ما يظهر في أول مليون رقم من pi. يمكننا القيام بذلك عن طريق تعبير كل تاريخ ميلاد كسلسلة من الأرقام ورؤية ما إذا كانت تلك السلسلة تظهر في أي مكان في pi_string:
لنشغل البرنامج ونرى :
يظهر تاريخ ميلادي بالفعل في أرقام pi! بمجرد أن تقرأ من ملف، يمكنك تحليل محتوياته بأي طريقة يمكنك تخيلها.
جرب بنفسك
تمرين 10-1. تعلم Python :
افتح ملفًا فارغًا في محرر النصوص واكتب بضعة أسطر تلخص فيها ما تعلمته عن Python حتى الآن. ابدأ كل سطر بعبارة "In Python you can...". احفظ الملف باسم learning_python.txt في نفس الدليل الذي يحتوي على التمارين من هذا الفصل. اكتب برنامجًا يقرأ الملف ويطبع ما كتبته مرتين: اطبع المحتويات مرة عن طريق قراءة الملف بالكامل، ومرة عن طريق تخزين الأسطر في قائمة ثم المرور على كل سطر.
تمرين 10-2. تعلم C :
يمكنك استخدام الطريقة replace() لاستبدال أي كلمة في سلسلة نصية بكلمة مختلفة. إليك مثال سريع يوضح كيفية استبدال كلمة 'dog' بكلمة 'cat' في جملة:
اقرأ كل سطر من الملف الذي قمت بإنشائه للتو، learning_python.txt، واستبدل كلمة Python باسم لغة أخرى، مثل C. اطبع كل سطر معدل على الشاشة.
تمرين 10-3. كود أبسط :
يستخدم برنامج file_reader.py في هذا القسم متغيرًا مؤقتًا، lines، ليوضح كيفية عمل splitlines(). يمكنك تخطي المتغير المؤقت والمرور مباشرة على القائمة التي تُرجعها splitlines():
أزل المتغير المؤقت من كل البرامج في هذا القسم، لجعلها أكثر اختصارًا.
النهاية
نكون هنا انتهينا من الجزء 1 من الفصل 10 من منهج تعلم Python من كتاب python crash course بالعربية
واذا واجهتك اي مشكلة في الفهم او ما شابه , يمكنك على الفور الذهاب الى المجتمع الخاص بنا في Telegram للمناقشة والتواصل معنا من هنا
او اذا واجهتك مشكلة في الموقع او تريد اجابة سريعة يمكنك الذهاب الى اخر صفحة في الموقع ستجد صفحة اتصل بنا موجودة يمكنك ارسالة لنا مشكلتك , وسيتم الرد عليها بسرعة جدا ان شاء الله
ويمكنك الأنضمام الى المجتمع Hidden Lock بالكامل مع جميع قنواته للأستفادة في اخر الأخبار في عالم التقنية وايضا الكتب بالمجان والكورسات والمقالات من خلال الرابط التالي لمجموعة القنوات من هنا
يمكنك ايضا متابعتنا في منصات X او Twitter سابقا , لمشاهدة الاخبار والمقالات السريعة والمهمة من
وفقط كان معكم sparrow مقدم هذه الشهادة من فريق Hidden Lock