תחי ישראל - אין לנו ארץ אחרת

תחי ישראל -אין לנו ארץ אחרת

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

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

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

 

 

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

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

שימו לב! הסקריפטים במדריכים מיועדים למטרות לימוד בלבד. כשאתם עובדים על הפרויקטים שלכם אתם צריכים להשתמש בספריות וסביבות פיתוח מוכחות, מהירות ובטוחות.

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

השימוש שלך באתר מהווה ראייה להסכמתך עם הכללים והתקנות שנוסחו בהסכם תנאי השימוש.

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

 

 

ענה על השאלה הפשוטה הבאה כתנאי להוספת תגובה:

איך קוראים בעברית לצ`ופצ`יק של הקומקום?

 

תמונת המגיב

מיקי בתאריך: 18.04.2020

אהלן אחלה של מדריך !! אהבתי מאוד !! יש בעיה אחת בתמונה היכן שאתם מסבירים כיצד נראית פעולת הappend נשארה שם האות w רק צריך לשנות ל-a

תמונת המגיב

אביגדור בתאריך: 26.04.2020

יופי של מדריך.

תמונת המגיב

ניצן בתאריך: 14.05.2020

אשמח לדעת איך לקרוא מחרוזת מסוימת (לפי פרמטרים שניתנים מראש) מתוך קובץ בינארי

תמונת המגיב

תמ בתאריך: 13.07.2020

מדריך מצויןןןןן
אשמח לדעת איך כותבים לקובץ אקסל חדש וליצור sheets
ובנוסף רוצה לדעת איך עושים + בראש עמודה באקסל

תמונת המגיב

תמ בתאריך: 22.07.2020

איך אני קוראת וכותבת שורה מאקסל לאקסל ?

תמונת המגיב

מרסלו בתאריך: 22.07.2020

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

תמונת המגיב

שגיא בתאריך: 06.10.2021

איך אני קולט נתיב שהמשתמש מזין?

תמונת המגיב

יוסי בתאריך: 06.03.2022

מה המתודה לעריכת קובץ קיים

תמונת המגיב

איילת בתאריך: 24.01.2023

איך אני מטמיעה אודיו וקישור בפייתון?

תמונת המגיב

שלמה בתאריך: 25.10.2023

אשמח אם תוסיפו איך עובדים עם קובץ csv

תמונת המגיב

יעל בתאריך: 17.03.2024

מדריך טוב הסברים קצת מסורבלים