قوائم القراءة والكتابة لملف في بايثون

المُقدّمة

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

في هذه المقالة ، سنلقي نظرة على كيفية كتابة قائمة إلى ملف ، وكيفية إعادة قراءة تلك القائمة في الذاكرة.

إلى كتابة البيانات في ملف، و ل قراءة البيانات من ملف، تقدم لغة البرمجة Python الأساليب القياسية write() و read() للتعامل مع سطر واحد وكذلك writelines() و readlines() للتعامل مع خطوط متعددة. علاوة على ذلك ، فإن كلا من pickle و json تتيح الوحدات النمطية طرقًا ذكية للتعامل مع مجموعات البيانات المتسلسلة أيضًا.

باستخدام اقرأ() و اكتب() طرق

للتعامل مع الحروف (السلاسل) الأساسية read() و write() طرق تعمل بشكل ممتاز. حفظ مثل هذه القائمة سطرًا بسطر في الملف listfile.txt يمكن القيام به على النحو التالي:


places = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']

with open('listfile.txt', 'w') as filehandle:
    for listitem in places:
        filehandle.write(f'{listitem}n')

listitem يتم تمديده بواسطة فاصل أسطر "n"، أولاً ، ثم يتم تخزينها في ملف الإخراج. يمكننا الآن إلقاء نظرة على كيفية قراءة القائمة بأكملها من الملف listfile.txt العودة إلى الذاكرة:


places = []


with open('listfile.txt', 'r') as filehandle:
    for line in filehandle:
        
        curr_place = line[:-1]
        
        places.append(curr_place)

ضع في اعتبارك أنك ستحتاج إلى إزالة فاصل الأسطر من نهاية السلسلة. في هذه الحالة ، من المفيد لنا أن تسمح Python بعمليات القائمة على السلاسل أيضًا. تتم هذه الإزالة ببساطة كعملية قائمة على السلسلة نفسها ، والتي تحتفظ بكل شيء ما عدا العنصر الأخير. هذا العنصر يحتوي على الحرف "n" يمثل فاصل الأسطر في أنظمة UNIX / Linux.

باستخدام كتابات () و readlines () طرق

كما ذكرنا في بداية هذه المقالة ، فإن Python تحتوي أيضًا على طريقتين - writelines() و readlines() - كتابة وقراءة أسطر متعددة في خطوة واحدة ، على التوالي. دعنا نكتب القائمة بأكملها إلى ملف على القرص:


places_list = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']

with open('listfile.txt', 'w') as filehandle:
    filehandle.writelines(f"{place for place in places_list}n")

لقراءة القائمة بأكملها من ملف موجود على القرص ، نحتاج إلى:


places = []


with open('listfile.txt', 'r') as filehandle:
    filecontents = filehandle.readlines()
    for line in filecontents:
        
        curr_place = line[:-1]
        
        places.append(curr_place)

الكود أعلاه يتبع نهجًا أكثر تقليدية مستعارًا من لغات البرمجة الأخرى. دعنا نكتبها في المزيد بيثونيك الطريقة:


places = []


with open('listfile.txt', 'r') as filehandle:
    places = [current_place.rstrip() for current_place in filehandle.readlines()]

أولاً ، تتم قراءة محتوى الملف عبر readlines(). ثانياً ، في أ for حلقة من كل سطر تتم إزالة حرف فاصل السطر باستخدام rstrip() طريقة. ثالثًا ، تتم إضافة السلسلة إلى قائمة الأماكن كعنصر قائمة جديد.

بالمقارنة مع القائمة قبل أن تكون الشفرة أكثر إحكاما ، ولكن قد يكون من الصعب قراءتها لمبرمجي بايثون المبتدئين.

استخدام وحدة Joblib

تم شرح الطرق الأولية حتى الآن لتخزين القائمة بطريقة لا يزال بإمكان البشر قراءتها - حرفيًا قائمة متسلسلة في ملف. يعد هذا أمرًا رائعًا لإنشاء تقارير بسيطة أو إخراج ملفات تصدير للمستخدمين لاستخدامها مرة أخرى ، مثل ملفات CSV. ومع ذلك - إذا كان هدفك هو مجرد إجراء تسلسل لقائمة في ملف ، يمكن تحميله لاحقًا ، فلا داعي لتخزينه بتنسيق يمكن للبشر قراءته.

joblib توفر الوحدة النمطية أسهل طريقة لتفريغ كائن Python (يمكن أن يكون أي كائن بالفعل):

import joblib

places = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']

joblib.dump(places, 'places.sav')

places = joblib.load('places.sav')
print(places) 

joblib أبسط وأنظف طريقة لتسلسل الكائنات بتنسيق فعال ، وتحميلها لاحقًا. يمكنك استخدام أي تنسيق تعسفي ، مثل .sav, .data، إلخ. لا يهم حقًا - كلاهما joblib وبدائل مثل pickle سيقرأ الملفات على ما يرام.

باستخدام ورطة وحدة

كبديل ل joblib، يمكننا ان نستخدم pickle! انها dump() الأسلوب يخزن القائمة بكفاءة كتدفق بيانات ثنائي. أولا ، ملف الإخراج listfile.data مفتوح للكتابة الثنائية ("wb"). ثانيًا ، يتم تخزين القائمة في الملف المفتوح باستخدام امتداد dump() الأسلوب:

import pickle

places = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']

with open('listfile.data', 'wb') as filehandle:
    
    pickle.dump(places, filehandle)

كخطوة تالية ، نقرأ القائمة من الملف على النحو التالي. أولا ، ملف الإخراج listfile.data فتح ثنائي للقراءة ("rb"). ثانيًا ، يتم تحميل قائمة الأماكن من الملف باستخدام امتداد load() الأسلوب:

import pickle

with open('listfile.data', 'rb') as filehandle:
    
    placesList = pickle.load(filehandle)

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

باستخدام تنسيق JSON

تنسيق البيانات الثنائية pickle استخدامات خاصة ببايثون. لتحسين إمكانية التشغيل البيني بين البرامج المختلفة ، فإن JavaScript Object Notation (JSON) مخططًا سهل الاستخدام وقابلًا للقراءة البشرية ، وبالتالي أصبح شائعًا جدًا لتسلسل الملفات ومشاركتها عبر واجهات برمجة التطبيقات.

تحقق من دليلنا العملي العملي لتعلم Git ، مع أفضل الممارسات ، والمعايير المقبولة في الصناعة ، وورقة الغش المضمنة. توقف عن أوامر Googling Git وفي الواقع تعلم ذلك!

يوضح المثال التالي كيفية كتابة قائمة بأنواع المتغيرات المختلطة إلى ملف الإخراج باستخدام الامتداد جسون وحدة. بعد فتح ملف الإخراج للكتابة ، فإن ملف dump() الطريقة تخزن القائمة الأساسية في الملف باستخدام تدوين JSON:

import json


basic_list = [1, "Cape Town", 4.6]


with open('listfile.txt', 'w') as filehandle:
    json.dump(basic_list, filehandle)

قراءة محتويات الملف الناتج مرة أخرى في الذاكرة بسيطة مثل كتابة البيانات. الطريقة المقابلة ل dump() يدعى load():

import json


with open('listfile.txt', 'r') as filehandle:
    basic_list = json.load(filehandle)

وفي الختام

تتراوح الطرق المختلفة التي أظهرناها أعلاه من البيانات البسيطة / القراءة حتى إغراق / تحميل البيانات عبر تدفقات ثنائية باستخدام pickle و JSON. هذا يبسط تخزين القائمة باستمرار وقراءتها مرة أخرى في الذاكرة.

الطابع الزمني:

اكثر من ستاكابوز