קריאה וכתיבה של רשימות לקובץ ב-Python

מבוא

מתכנתי Python משתמשים באופן אינטנסיבי במערכים, רשימות ומילונים כמבני נתונים מסודרים. אחסון מבני נתונים אלה מצריך קובץ או מסד נתונים כדי לעבוד כראוי.

במאמר זה, נסקור כיצד לכתוב רשימה לקובץ, וכיצד לקרוא את הרשימה חזרה לזיכרון.

ל לכתוב נתונים בקובץ, וכדי לקרוא נתונים מקובץ, שפת התכנות 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.

משתמש ב כתבים () ו שורות קריאה () שיטות

כפי שהוזכר בתחילת מאמר זה, 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() שיטה. שלישית, המחרוזת מתווספת לרשימת המקומות כפריט רשימה חדש.

בהשוואה לרישום שלפני הקוד הוא הרבה יותר קומפקטי, אך עשוי להיות קשה יותר לקריאה עבור מתכנתי Python מתחילים.

שימוש במודול 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 uses הוא ספציפי לפייתון. כדי לשפר את יכולת הפעולה ההדדית בין תוכניות שונות, סימון אובייקט JavaScript (JSON) מספקת סכימה קלה לשימוש וניתנת לקריאה על ידי אדם, וכך הפכה לפופולרית מאוד לסידור קבצים ושיתוף שלהם דרך ממשקי API.

עיין במדריך המעשי והמעשי שלנו ללימוד Git, עם שיטות עבודה מומלצות, סטנדרטים מקובלים בתעשייה ודף רמאות כלול. תפסיק לגוגל פקודות 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)

סיכום

שיטות שונות שהצגנו לעיל נעות בין כתיבה/קריאה פשוטה של ​​נתונים ועד השלכה/טעינת נתונים באמצעות זרמים בינאריים באמצעות חמוצים ו-JSON. זה מפשט את אחסון הרשימה באופן מתמשך וקריאתה בחזרה לזיכרון.

בול זמן:

עוד מ Stackabuse