تطبيقات البايثون في التعامل مع محرر النصوص مايكروسوفت وورد

عمل تطبيق بلغة بايثون والتعامل مع محرر النصور - بايثونات

في إطار شرح مفاهيم بايثون بالعربي نُقدم لكم في هذا المقال شرحاً مبسطاً لأحد المكتبات. يندرج ما تقدمه هذه المكتبة تحت عنوان أتمتة المهام الدورية  Automate The Boring Stuff و تطبيقات البايثون .

المكتبة python-docx وهدفها منح المقدرة على التعامل مع ملفات المحرر النصي المشهور Microsoft Word من حيث الإنشاء، والتعديل، والعمليات الأخرى.

تأتي المكتبة في إطار معالجة النصوص بالبايثون  (Text Processing in Python) .

تثبيت مكتبة python-docx

البايثون

مكتبة python-docx موجودة في مستودع المكتبات الخاص بلغة البايثون PyPI، وتثبيت المكتبة يُعد أمرا بسيطًا وذلك عبر استخدام أداة pip. يُمكن تثبيت المكتبة عبر تنفيذ الأمر التالي في شاشة الأوامر:

[pastacode lang=”python” manual=”%C2%A0pip%20install%20python-docx” message=”” highlight=”” provider=”manual”/]

سوف نقوم بشرح مثال لبناء ملف Microsoft Word بحيث يكون الملف النهائي بالشكل التالي:

بايثون

تطبيقات البايثون في تحرير النصوص

لنبدأ في الجزء العملي مباشرة عبر استيراد المكتبات التي سنحتاجها في العمل بالشكل التالي:

[pastacode lang=”python” manual=”from%20docx%20import%20Document%0Afrom%20docx.shared%20import%20Inches%0Aimport%20collections” message=”” highlight=”” provider=”manual”/]

نُعرف كائن من الفئة Document. هذا الكائن سيمثل ملف الوورد الذي سنبنيه بشكل برمجي باستخدام البايثون:

[pastacode lang=”python” manual=”document%20%3D%20Document()” message=”” highlight=”” provider=”manual”/]

لإضافة عنوان في بداية الملف في الصفحة الأولى نستخدم دالة add_heading ونمرر لها العنوان الذي نريد ومستوى العنوان (من 0 إلى 9) بالشكل التالي:

[pastacode lang=”python” manual=”document.add_heading(‘Document%20Title’%2C%200)” message=”” highlight=”” provider=”manual”/]

لإضافة فقرة تلي العنوان السابق نستخدام الدالة add_paragraph ونمرر لها النص الذي نريده:

[pastacode lang=”python” manual=”p%20%3D%20document.add_paragraph(‘A%20plain%20paragraph%20having%20some%20’)” message=”” highlight=”” provider=”manual”/]

لاحظ أن الدالة تقوم بإرجاع كائن من نوع Paragraph، بعد ذلك نقوم بتنسيق هذه الفقرة باستخدام الكائن الناتج من دالة الإضافة بالشكل التالي:

[pastacode lang=”python” manual=”p.add_run(‘bold’).bold%20%3D%20True%0Ap.add_run(‘%20and%20some%20’)%0Ap.add_run(‘italic.’).italic%20%3D%20True” message=”” highlight=”” provider=”manual”/]

لاضافة النص Heading, level 1 كعنوان بمستوى رقم 1:

[pastacode lang=”python” manual=”document.add_heading(‘Heading%2C%20level%201’%2C%20level%3D1)” message=”” highlight=”” provider=”manual”/]

 

اضافة فقرة

بعد إضافة العنوان بمستوى رقم 1، نُضيف فقرة ذات تنسيق من نوع إقتباس مكثف (Instance Quote) بإستخدام دالة add_paragraph ونمرر نص الفقرة، ونوع النمط:

[pastacode lang=”python” manual=”document.add_paragraph(‘Intense%20quote’%2C%20style%3D’Intense%20Quote’)” message=”” highlight=”” provider=”manual”/]

لإضافة نص ضمن قائمة غير مرتبة، نستخدم نفس الدالة السابقة، ولكن نُغير نوع التنسيق إلى List Bullet بالطريقة التالية:

[pastacode lang=”python” manual=”document.add_paragraph(‘first%20item%20in%20unordered%20list’%2Cstyle%3D’List%20Bullet’)” message=”” highlight=”” provider=”manual”/]

لإضافة نص ضمن قائمة مرتبة من نوع رقم نستخدم نوع النمط List Number :

[pastacode lang=”python” manual=”document.add_paragraph(‘first%20item%20in%20ordered%20list’%2Cstyle%3D’List%20Number’)” message=”” highlight=”” provider=”manual”/]

لإضافة صورة، نستخدم الدالة add_picture ونمرر لها إسم الصورة التي نريد إضافتها على الملف، ونحدد الأبعاد التي نريدها للصورة:

[pastacode lang=”python” manual=”document.add_picture(‘python.jpg’%2C%20width%3DInches(1.25))” message=”” highlight=”” provider=”manual”/]

لإضافة جدول على الملف، نستخدم دالة add_table ونحدد عدد الصفوف والأعمدة الخاصة بالجدول:

[pastacode lang=”python” manual=”table%20%3D%20document.add_table(rows%3D1%2C%20cols%3D3)” message=”” highlight=”” provider=”manual”/]

نحصل على صفوف الجدول بإستخدام خاصية rows والتي هي عبارة عن مصفوفة تحتوي على مصفوفات تُمثل صفوف الجدول، فللحصول مثلًا على الصف الأول نكتب table.rows[0], والصف الثاني table.rows[1], وهكذا.

كل صف يحتوي على خلايا يتم الوصول إليها عبر خاصية cells والتي هي أيضًا عبارة عن مصفوفة تحتوي هذه الخلايا، فللحصول على خلايا الصف الأول نكتب table.rows[0].cells.

[pastacode lang=”python” manual=”hdr_cells%20%3D%20table.rows%5B0%5D.cells” message=”” highlight=”” provider=”manual”/]

لتعديل قيمة الخلية الأولى في الصف الأول لتصبح Qty نكتب السطر التالي:

[pastacode lang=”python” manual=”hdr_cells%5B0%5D.text%20%3D%20’Qty'” message=”” highlight=”” provider=”manual”/]

وبنفس الطريقة للخلية الثانية والثالثة:

[pastacode lang=”python” manual=”hdr_cells%5B1%5D.text%20%3D%20’Id’%0Ahdr_cells%5B2%5D.text%20%3D%20’Desc'” message=”” highlight=”” provider=”manual”/]

في الخطوات السابقة، عدلنا قيم الصف الأول من الجدول لتُعبر عن عناوين الجدول، الان نحتاج إلى إضافة البيانات للجدول.

نُعرف كائن من فئة Named Tuple ونُحدد إسمها بـ Record ونُحدد أسماء خصائصها الداخلية بالطريقة التالية:

[pastacode lang=”python” manual=”Record%20%3D%20collections.namedtuple(%22Record%22%2C%20%22qty%20id%20desc%22)” message=”” highlight=”” provider=”manual”/]

نقوم ببناء مصفوفة تحتوي على عناصر من نوع Record السابق، والتي تحتوي بدورها على البيانات التي نريدها:

[pastacode lang=”python” manual=”recordset%20%3D%20%5BRecord(id%3D1%2Cqty%3D10%2Cdesc%3D%22Pythons%22)%2C%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20Record(id%3D2%2Cqty%3D15%2Cdesc%3D%22Pythons%22)%2C%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20Record(id%3D3%2Cqty%3D30%2Cdesc%3D%22Pythons%22)%5D” message=”” highlight=”” provider=”manual”/]

لاضافة البيانات الموجودة في recordset لابد من المرور عليها واضافتها على الجدول بشكل متتابع. نحتاج لذلك جملة تكرارية for loop مع استخدام دالة الاضافة على الجدول add_row عند كل اضافة:

[pastacode lang=”python” manual=”for%20item%20in%20recordset%3A%0A%C2%A0%20%C2%A0%20row_cells%20%3D%20table.add_row().cells%0A%C2%A0%20%C2%A0%20row_cells%5B0%5D.text%20%3D%20str(item.qty)%0A%C2%A0%20%C2%A0%20row_cells%5B1%5D.text%20%3D%20str(item.id)%0A%C2%A0%20%C2%A0%20row_cells%5B2%5D.text%20%3D%20item.desc” message=”” highlight=”” provider=”manual”/]

لإضافة صفحة فاصلة نستخدم دالة add_page_break كالتالي:

[pastacode lang=”python” manual=”document.add_page_break()” message=”” highlight=”” provider=”manual”/]

إلى هذا الحد، فإن الملف الذي أنشأناه موجود في الذاكرة الخاصة بجلسة العمل. لحفظ الملف كملف Microsoft Word نستخدم دالة save ونمرر لها إسم الملف الذي نريده والمسار الخاص به.

[pastacode lang=”python” manual=”document.save(‘demo.docx’)” message=”” highlight=”” provider=”manual”/]

خلاصة

قدمنا لكم في هذا المقال نبذة عن مكتبة python-docx والتي تُعطي القدرة اللازمة للتعامل مع الملفات النصية المنسقة من نوع Mircrosoft Word.

الشيفرة البرمجية الكاملة لهذا المقال تجدونها هنا، ونود تنبيهكم الى أن المثال المشروح هو نفسه المستخدم في صفحة المكتبة الرئيسية مع بعض التعديلات الخاصة ببايثونات.

مقالات مشابهة

    One Comment

    1. بجد شكرا جدا!! حقيقي استمتعت وانا بكريت اول ملف ورد على الكولاب

      تجربة حلوة اوي ومتخيلتش انها بالسهولة دي

      اها دورت على حاجات مكنتش فاهماها في بايثون لان كانت اول مرة اشوفها، بس التجربة كلها ممتعة فعلا

      شكرا جدا 😁❤

    Comments are closed.