קריאה וכתיבה של קבצים בפייתון

מחבר:
בתאריך:

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

מדריך קריאה וכתיבה של קבצים עם פייתון

 

הפקודה open()

הפקודה open פותחת קובץ, ומאפשרת קריאה וכתיבה.

לדוגמה קריאה מהקובץ:

f = open(filepath, 'r', encoding='utf-8')
all_lines = f.readlines()
f.close()

הפרמטרים שמקבל open() הם:

  • הנתיב לקובץ filepath
  • מוד - במקרה זה 'r' כי אנחנו רוצים לקרוא מהקובץ
  • קידוד - הכי שימושי הוא utf-8 שמאפשר לעבוד עם קבצים הכתובים בעברית ובשפות נוספות

לפונקציה open שלושה מודים עיקריים:

w – לכתיבה לקובץ (write) מתחילתו.

f = open(filepath,'w')

a – כדי להוסיף לכתוב לקובץ מבלי למחוק את הקיים (append).

f = open(filepath,'a')

r – כדי לקרוא (read).

f = open(filepath,'r')

בסוף המדריך תמצאו טבלה המסכמת את המודים השונים של open.

כשעובדים בשיטה הזו חשוב מאוד לזכור לסגור את הקובץ באמצעות:

f.close()

 

with open()

דרך נוחה יותר לפתוח קובץ היא באמצעות הקדמת ההצהרה with ל-open().

with open(filename,'r') as f:
     all_lines = f.readlines()

השימוש ב-with מאפשר לכתוב בתחביר מקוצר שגורם לפייתון לסגור את הקובץ מחוץ לבלוק באופן אוטומטי.

התחביר הכולל את with הוא המקובל והנוח יותר לכן נשתמש בו ביתר המדריך.

 

כתיבה של קובץ

נפתח את הקובץ כדי לכתוב ואת זה נציין באמצעות המוד w (קיצור של write).

# the 'w' flag is for writing
with open('./text.txt', 'w', encoding='utf-8') as f:
    f.write('שלום מסמכי פייתון')
  • אם הקובץ לא קיים, פייתון ייצור אותו.
  • אנחנו מצפים מהקובץ להיות באותה תיקייה כמו הסקריפט של פייתון.
  • המוד w יגרום לפייתון לכתוב לקובץ מתחילתו.
  • קידוד utf-8 הוא מאוד חשוב כשעובדים עם שפות אקזוטיות דוגמת עברית.

אם כבר פתחנו את הקובץ אפשר לכתוב לתוכו כמה פעמים שרוצים.

with open('./text.txt', 'w', encoding='utf-8') as f:
    f.write('שלום ')
    f.write(' מסמכי')
    f.write(' פייתון')

עכשיו בתיקייה שבה הרצנו את הסקריפט נמצא את הקובץ 'text.txt', ובתוכו מה שכתבנו:

שלום מסמכי פייתון

אבל למה לעבוד קשה? אפשר להשתמש בלולאת for שרצה על כל הרשימה, ומדפיסה כל פריט בשורה נפרדת:

cars = ['BMW','Audi','Ferrari','Tesla','Jaguar']
 
with open('./text.txt', mode='w', encoding='utf-8') as f:
    for car in cars:
        # \n is the new line character
        f.write(car + "\n")

עכשיו כשנפתח את הקובץ text.txt, נמצא בתוכו רק את רשימת המכוניות.

BMW
Audi
Ferrari
Tesla
Jaguar

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

 

הוספה לקובץ

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

כדי להוסיף על הכתוב בקובץ נשתמש במוד a (קיצור של append) של הפונקציה open(). כך נראית הוספה לקובץ הקיים:

more_cars = ['Range Rover','Mercedes','Lexus','McLaren','Jeep']
 
 
with open('./text.txt', mode='w', encoding='utf-8') as f:
    for car in more_cars:
        f.write(car+"\n")

וזו התוצאה:

BMW
Audi
Ferrari
Tesla
Jaguar
Range Rover
Mercedes
Lexus
McLaren
Jeep

כמו שאמרנו, מוד w כותב את הקובץ מתחילתו ומוד a מוסיף על הקיים.

 

קריאה של קובץ

לצורך קריאת הקובץ נשתמש במוד r (קיצור של read):

# Here it reads the entire file
with open('./text.txt', 'r', encoding='utf-8') as f:
    f_contents = f.read()
    print(f_contents)
  • הקובץ text.txt נמצא באותה התיקייה כמו הסקריפט
  • מוד r אחראי לפתיחת הקובץ לקריאה
  • הפונקציה f.read() קוראת את כל תוכנו של הקובץ בבת אחת

כפי שניתן לקרוא את כל תוכנו של הקובץ באמצעות הפונקציה f.read() הפונקציה f.readlines() הופכת את תוכנו של הקובץ למערך כשכל שורה חדשה הופכת לפריט במערך.

with open('./text.txt', 'r', encoding='utf-8') as f:
    print(f.readlines())
['BMW\n', 'Audi\n', 'Ferrari\n', 'Tesla\n', 'Jaguar\n', 'Range Rover\n', 'Mercedes\n', 'Lexus\n', 'McLaren\n', 'Jeep']

הפונקציה readline() קוראת שורה אחת בלבד בכל פעם שקוראים לה. הקוד הבא קורא את ה-3 שורות הראשונות של הקובץ:

with open('./text.txt', 'r', encoding='utf-8') as f:
    print(f.readline())
    print(f.readline())
    print(f.readline())
BMW

Audi

Ferrari

המתודה מאפשרת לנו להחליף את הסמל של שורה חדשה במה שאנחנו רוצים. לדוגמה במחרוזת שרירותית כל שהיא:

with open('./text.txt', 'r', encoding='utf-8') as f:
    f_content = f.readline()
    print(f_content, end='#NEW LINE#')

כדי לקרוא קובץ שלם שורה אחר שורה. מה שמאפשר לנו לקרוא מסמכים ארוכים במיוחד נשתמש בלולאת for.

with open('./text.txt', 'r', encoding='utf-8') as f:
    for line in f:
        print(line, end='#NEW LINE#')
BMW
#NEW LINE#Audi
#NEW LINE#Ferrari
#NEW LINE#Tesla
#NEW LINE#Jaguar
#NEW LINE#Range Rover
#NEW LINE#Mercedes
#NEW LINE#Lexus
#NEW LINE#McLaren
#NEW LINE#Jeep#NEW LINE#

ניתן לקבוע מה יהיה אורך התווים שנקרא בכל פעם. במקרה זה נגביל ל-3 תווים בלבד בכל פעם.

with open('./text.txt', 'r', encoding='utf-8') as f:
    f_content = f.read(3) # first 3 characters
    print(f_content)
 
    f_content = f.read(3) # next 3 characters
    print(f_content)
BMW

Au
  • בפעם הראשונה שהקוד רץ הוא מדפיס את שלושת התווים הראשונים במסמך, BMW.
  • בפעם השנייה שהקוד רץ הוא מדפיס את שלושת התווים הבאים בתור, שורה חדשה ואח"כ Au.

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

with open('./text.txt', 'r', encoding='utf-8') as f:
    
    len_to_read = 3
    
    f_content = f.read(len_to_read)
 
    while len(f_content) > 0:
      print(f_content, end='*')
      f_content = f.read(len_to_read)
BMW*
Au*di
*Fer*rar*i
T*esl*a
J*agu*ar
*Ran*ge *Rov*er
*Mer*ced*es
*Lex*us
*McL*are*n
J*eep*

 

העתקה של קובץ

העתקה של קובץ כרוכה בקריאה של הקובץ המקורי וכתיבה של הקובץ החדש. נעשה את זה באמצעות שתי לולאות:

  • החיצונית - קוראת את הקובץ
  • הפנימית - כותבת את הקובץ החדש שהוא ההעתק של הקובץ המקורי
# make a copy of text.txt file
with open('./text.txt', 'r', encoding='utf-8') as rf:
    with open('./text_copy.txt', 'w', encoding='utf-8') as wf:
        for line in rf:
            wf.write(line)

כפי שניתן להעתיק קובץ טקסט, אפשר להעתיק קובץ תמונה. במקרה זה נוסיף את המוד 'b' כי קבצי תמונות הם קבצים בינאריים (דוגמאות נוספות לקבצים בינאריים הם קבצי קול ופורמטים דחוסים של מידע).

ניתן להעתיק קבצים קטנים בתוך לולאת for פשוטה:

with open('./car.jpg', 'rb') as rf:
    with open('./car_copy.jpg', 'wb') as wf:
        for line in rf:
            wf.write(line)

כדאי לחלק קובץ גדול במיוחד לחתיכות בגודל קטן יותר כדי לא להתיש את זיכרון המטמון של המחשב.

with open('./car.jpg', 'rb') as rf:
    with open('./car_copy2.jpg', 'wb') as wf:
        chunk_size = 2048 # the size to read from the original file
        rf_chunk = rf.read(chunk_size)
        while len(rf_chunk) > 0:
            wf.write(rf_chunk)
            rf_chunk = rf.read(chunk_size)

 

המודים של open

לסיכום, אילו המודים השונים של הפונקציה open() המשמשת לעבודה עם קבצים בפייתון שאותם למדנו במדריך:

מוד מה זה עושה?

'r'

פותח לצורך קריאה. זו ברירת המחדל.

'w'

פתיחה לצורך כתיבה. מוחק את מה שהיה בקובץ לפני כן.

'rb' or 'wb'

פתיחה לקריאה או לכתיבה של קבצים בינריים (לדוגמה, קבצי תמונות)

'a'

פתיחה לצורך הוספה לתוכן הקיים בקובץ.

לכל המדריכים בסדרה ללימוד פייתון

 

אהבתם? לא אהבתם? דרגו!

0 הצבעות, ממוצע 0 מתוך 5 כוכבים

 

 

הוסף תגובה חדשה

 

= 3 + 4