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