الملفات (Files)

يغطي هذا القسم كيفية القراءة من الملفات في بايثون وكيفية الكتابة إليها.

تحتاج إلى ثلاث خطوات لقراءة نص من ملف:

  • افتح (open) الملف،
  • اقرأ (read) شيئًا منه،
  • وأخيراً أغلقه (close).

أنشئ ملف poem.txt في المحرر واكتب أي قصيدة فيه. احفظ الملف.

في المثال التالي، نستخدم الترميز utf-8، والذي يغطي غالبية الأحرف الأوروبية و العربية.

هناك ترميزات (encodeing) أخرى تغطي مجموعات حروف مختلفة. إذا كنت ترغب في معرفة المزيد عن الترميزات(encoding)، يمكنك قراءة هذه المقالة سهلة القراءة مقال الترميز(encoding)

هيا ننشئ الكود التالي:

poem_file = open('poem.txt', encoding='utf-8')
content = poem_file.read()
print(content)
poem_file.close()

قم بتشغيله في المجلد الذي يحتوي على poem.txt. بمعنى آخر، يجب أن يكون مجلد العمل الحالي يحتوي على الملف الذي به القصيدة.

يطبع البرنامج القصيدة!

ما الذي يحدث هنا؟ تُرجع الدالة ()open القيمة التي تمثل الملف المفتوح (open file). هذه القيمة لها طرقها الخاصة (methods). نحن نستخدم الطريقة ()read التي تقرأ المحتويات الكاملة للملف مرة واحدة وتُرجعها كنص (string). سنتناول ()close، الدالة التي تغلق الملف المفتوح، لاحقًا.

التكرار على محتويات الملفات (Iteration over contents of files)

يمكنك استخدام الملفات المفتوحة مع عبارة for. إنه مشابه لما هو الحال مع النصوص أو النطاقات. يوفر for i in range أرقامًا متسلسلة. يوفر for c in 'abcd' أحرفًا نصية مفردة. يوفر :for line in poem_file أسطرًا فردية تُقرأ من الملف إلى المتغير line.

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

print('I heard this poem:')
print()
poem_file = open('poem.txt', encoding='utf-8')
for line in poem_file:
    print('    ' + line)
poem_file.close()
print()
print('How do you like it?')

عند تجربته، ستجد أن المسافات ليست كما ينبغي أن تكون. هل ترغب في محاولة شرح سبب ذلك؟

الحل

إغلاق الملفات (Closing files)

من المهم جدًا إغلاق الملف بعد توقف البرنامج عن استخدامه. تقوم الطريقة ()close بذلك نيابة عنا. لدى أنظمة التشغيل حدود على الملفات المفتوحة. إذا لم تغلقها، يمكنك تجاوز هذا الحد. إلى جانب ذلك، في نظام التشغيل Windows، لا يمكنك إعادة فتح ملف مفتوح بالفعل.

يمكنك مقارنة الملفات بالثلاجة: إذا كنت ترغب في وضع شيء ما في الثلاجة، تحتاج إلى فتحه ثم إغلاقه. تعمل الثلاجة بدون إغلاق أيضًا، ولكن بعد ذلك يفسد شيء ما.

من السهل نسيان إغلاق ملف. على سبيل المثال، يمكن لاستثناء أو عبارة return داخل قد تتخطى معالجة الملف ()close. ثم يبقى الملف مفتوحًا.

يمكننا استخدام عبارة try/finally للتأكد من إغلاق الملف.

يتم تنفيذ كتلة finally (العبارات الموجودة بعد finally) دائمًا. يتم تنفيذه بغض النظر عما إذا كانت كتلة try تنتهي بنجاح، أو باستثناء، أو إذا قفزت منها باستخدام return أو break.

def initial_character():
    """Return the first character in the poem."""
    # تُرجع الحرف الأول في القصيدة.

    poem_file = open('poem.txt', encoding='utf-8')
    try:
        content = poem_file.read()
        return content[0]
    finally:
        poem_file.close()

print(initial_character())

يمكنك استخدام كتلة finally في كل مرة تحتاج فيها لإغلاق أو إنهاء شيء ما - ليس مجرد ملف، يمكن أن يكون أيضًا اتصال قاعدة بيانات.

عبارة with (The with statement)

نظرًا لأن كتلة try/finally مطولة جدًا، هناك طريقة أفضل في بايثون. إنها عبارة with، التي رأيناها أثناء الاختبار السلبي باستخدام pytest (مع ()pytest.raises):

def initial_character():
    """Return the first character in the poem."""
    # تُرجع الحرف الأول في القصيدة.

    with open('poem.txt', encoding='utf-8') as poem_file:
        content = poem_file.read()
        return content[0]

print(initial_character())

استخدمنا هذه العبارة للاختبار من قبل. إنها تغلف كتلة باستثناء متوقع. تتحقق مما إذا كان الاستثناء الصحيح قد حدث بعد انتهاء الكتلة. في حالتنا، يتم إغلاق الملف عند انتهاء الكتلة بغض النظر عما حدث. يتم إغلاق الملف في جميع الحالات إذا انتهت كتلة with بنجاح، أو باستثناء، أو إذا كنا نقفز منها.

عبارة with هي الخيار الأفضل للعمل مع الملفات في غالبية الحالات.

الكتابة إلى الملفات (Writing to files)

تنبيه!

من السهل حذف أو الكتابة فوق أي ملف في بايثون. جرب الأمثلة التالية في مجلد ليس لديك فيه أي شيء مهم!

يمكنك الكتابة إلى ملف في بايثون. تحتاج إلى فتح الملف للكتابة باستخدام وسيط مُسمى mode='w' (w تعني كتابة - write). يمكنك كتابة نصوص فردية باستخدام الطريقة ()write.

إذا كان الملف موجودًا بالفعل، فإن فتحه باستخدام mode='w' يكتب فوق محتواه الأصلي. لن يكون هناك سوى النص الذي يكتبه برنامجك فيه.

with open('second-poem.txt', mode='w', encoding='utf-8') as poem_file:
    poem_file.write('Our old chiming clock\n')
    poem_file.write("Is beating four o'clock\n")

لماذا يوجد `\n`؟

لا تضع الطريقة ()write نهاية سطر بعد النص. إذا كنت بحاجة إلى كتابة عدة أسطر في ملفات، فأنت بحاجة إلى إنهاء كل منها بحرف سطر جديد '\n'. لقد وصفناه في درس النصوص (Strings).

أو، يمكنك استخدام الدالة ()print. افتراضيًا،كما تكتب الدالة الى ال(terminal). يمكنها أيضًا الكتابة إلى ملف مفتوح إذا استخدمت الوسيط المُسمى file.

تبقى خيارات ()print الأخرى دون تغيير. تتضمن هذه الخيارات نهاية السطر، والتحويل إلى نصوص، وطباعة عدة وسائط في وقت واحد.

with open('second-poem.txt', mode='w', encoding='utf-8') as poem_file:
    print('Our old chiming clock', file=poem_file)
    print('Is beating', 2+2, "o'clock", file=poem_file)

كتابة وقراءة بيانات JSON (Writing and reading JSON data)

يمكن تخزين JSON في ملفات txt. او json. أيضًا. يتم ذلك بطريقة مماثلة، نحتاج فقط إلى استيراد مكتبة json.

إذا أردنا تخزين بياناتنا من قاموس في الملف، فيمكننا استخدام الكود التالي:

data = {
    "name": "Ali",
    "city": "Omdurman",
    "languages": ["Arabic", "English", "Python"],
    "age": 26
}

import json

with open('json_data.json', mode='w', encoding='utf-8') as json_file:
    json.dump(data, json_file)
import json

with open('json_data.json') as json_file:
    data = json.load(json_file)

print(data)

في الدرس السابق json عرضنا أيضًا تحميل JSON من نص (string) والكتابة إلى نص، و استخدمنا الطريقتين loads و dumps. يمثل الحرف s في النهاية string. يمكنك تذكر الفرق بين load و loads بهذه الطريقة.

انواع بيانات شائعة أخرى (Other common data formats)

لقراءة أو كتابة csv يمكنك استخدام مكتبة csv المضمنة.

بالنسبة لانواع البيانات الأخرى مثل ملفات Excel، تحتاج إلى تثبيت مكتبات خارجية.

للعمل مع البيانات الجدولية(tabular data)، الأسهل هو استخدام مكتبة pandas - والتي تحتاج أيضًا إلى تثبيت إضافي.