ברוכים הבאים ליחידה "קבצים וטיפול בשגיאות" בקורס "תכנות וניתוח נתונים בשפת פייתון". ביחידה זו נלמד כיצד פייתון מאפשרת לנו אינטראקציה עם קבצים במערכת ההפעלה – קריאה מתוכם וכתיבה אליהם. בנוסף, נתעמק במנגנוני הטיפול בשגיאות וחריגות (Exceptions), שהם קריטיים לכתיבת קוד יציב, אמין ובטוח, במיוחד כשעובדים עם נתונים חיצוניים שעלולים להיות לא צפויים.
טיפול בקבצים בפייתון: יסודות
אינטראקציה עם קבצים היא אבן יסוד ברוב יישומי ניתוח הנתונים. פייתון מספקת כלים פשוטים ויעילים לפתיחה, קריאה, כתיבה וסגירה של קבצים.
פתיחה וסגירת קבצים
הפעולה הראשונה בעבודה עם קובץ היא פתיחתו באמצעות הפונקציה open(). פונקציה זו מחזירה אובייקט קובץ, דרכו נוכל לבצע פעולות קריאה או כתיבה. לאחר סיום העבודה, חשוב מאוד לסגור את הקובץ באמצעות המתודה close() כדי לשחרר משאבים ולמנוע בעיות.
מצבי פתיחת קבצים (File Modes)
בעת פתיחת קובץ, אנו מציינים את מצב הפתיחה, המגדיר את סוג הפעולות המותרות על הקובץ.
'r' (read)
מצב קריאה בלבד. הקובץ חייב להתקיים. אם הקובץ לא קיים, תתעורר שגיאת FileNotFoundError.
'w' (write)
מצב כתיבה. אם הקובץ קיים, תוכנו יימחק. אם הקובץ לא קיים, הוא ייווצר. זהירות: מוחק תוכן קיים!
'a' (append)
מצב הוספה. אם הקובץ קיים, הכתיבה תתבצע בסופו. אם הקובץ לא קיים, הוא ייווצר.
'x' (exclusive creation)
מצב יצירה בלעדית. יוצר קובץ חדש לכתיבה. אם הקובץ כבר קיים, תתעורר שגיאת FileExistsError.
הצהרת with לטיפול בטוח בקבצים
הדרך המומלצת והבטוחה ביותר לעבודה עם קבצים בפייתון היא באמצעות הצהרת with. הצהרה זו מבטיחה שהקובץ ייסגר אוטומטית, גם אם מתרחשת שגיאה במהלך העבודה איתו.
קריאה וכתיבה לקבצים
לאחר פתיחת קובץ, נוכל לבצע עליו פעולות קריאה או כתיבה בהתאם למצב הפתיחה.
קריאה מקבצים
read(): קוראת את כל תוכן הקובץ כמחרוזת אחת. ניתן לציין מספר בתים/תווים לקריאה.readline(): קוראת שורה אחת מהקובץ.readlines(): קוראת את כל השורות בקובץ ומחזירה אותן כרשימה, כאשר כל איבר ברשימה הוא שורה.
כתיבה לקבצים
write(string): כותבת מחרוזת לקובץ. יש לכלול תווי מעבר שורה (\n) במידת הצורך.writelines(list_of_strings): כותבת רשימת מחרוזות לקובץ. לא מוסיפה תווי מעבר שורה אוטומטית.
טיפול בשגיאות וחריגות (Exceptions)
שגיאות וחריגות הן אירועים בלתי צפויים המתרחשים בזמן ריצת התוכנית ועלולים להפסיק את פעולתה. טיפול נכון בשגיאות מאפשר לתוכנית להמשיך לפעול בצורה חלקה או לטפל במצב בצורה מבוקרת.
בלוק try-except
בלוק try-except הוא המנגנון המרכזי בפייתון לטיפול בחריגות. קוד שעלול לגרום לשגיאה ממוקם בבלוק try. אם מתרחשת שגיאה, בקרת התוכנית עוברת לבלוק except המתאים, שם ניתן לטפל בשגיאה.
try), ולטפל בשגיאות אלו באופן מבוקר אם הן מתרחשות (בבלוק except).סוגי שגיאות נפוצים
פייתון מגדירה היררכיה של סוגי חריגות. חשוב להכיר את הסוגים הנפוצים כדי לטפל בהם באופן ספציפי:
FileNotFoundError: מתרחשת כאשר מנסים לפתוח קובץ שאינו קיים.IOError: שגיאה כללית הקשורה לפעולות קלט/פלט (כולל קבצים).FileNotFoundErrorהיא תת-סוג שלה.ValueError: מתרחשת כאשר פונקציה מקבלת ארגומנט בעל סוג נכון אך ערך לא מתאים (למשל, המרה של מחרוזת שאינה מספר ל-int).TypeError: מתרחשת כאשר פעולה או פונקציה מופעלת על אובייקט מסוג לא מתאים (למשל, ניסיון לחבר מספר למחרוזת).ZeroDivisionError: מתרחשת בניסיון לחלק מספר באפס.
except FileNotFoundError:) ולא להשתמש ב-except Exception: כללי, אלא אם כן יש סיבה טובה לכך. טיפול ספציפי מאפשר לתוכנית להגיב בצורה שונה ומתאימה לכל סוג שגיאה, משפר את יכולת הניפוי (debugging) ומגביר את אמינות הקוד.בלוקים else ו-finally
else: בלוק קוד שמתבצע רק אם לא התרחשה אף חריגה בבלוקtry.finally: בלוק קוד שמתבצע תמיד, בין אם התרחשה חריגה ובין אם לאו. משמש לעיתים קרובות לפעולות ניקוי משאבים (למרות ש-withעדיף לקבצים).
שילוב טיפול בקבצים וטיפול בשגיאות
השילוב של שני הנושאים הללו הוא קריטי. לדוגמה, בעת ניסיון לפתוח קובץ, עלינו להיות מוכנים לכך שהקובץ לא קיים, או שאין לנו הרשאות גישה אליו. שימוש ב-with יחד עם try-except מספק את הפתרון החזק ביותר.
דוגמה: פתיחת קובץ לקריאה וטיפול בשגיאות:
try:
with open("my_data.txt", "r") as file:
content = file.read()
print("תוכן הקובץ:", content)
except FileNotFoundError:
print("שגיאה: הקובץ 'my_data.txt' לא נמצא.")
except IOError as e:
print(f"שגיאת קלט/פלט אחרת: {e}")
except Exception as e:
print(f"שגיאה בלתי צפויה: {e}")
finally:
print("ניסיון קריאה מהקובץ הסתיים.")
שאלות לדיון
- מדוע השימוש בהצהרת
with open(...)עדיף על פני פתיחת קובץ ידנית וסגירתו באמצעותfile.close()? - כיצד פייתון מבחינה בין סוגי שגיאות שונים (למשל,
FileNotFoundErrorלעומתValueError), ומדוע הבחנה זו חשובה לכתיבת קוד חזק? - תאר תרחיש שבו תשתמש בכל ארבעת הבלוקים:
try,except,elseו-finally, והסבר את תפקידו של כל בלוק בתרחיש זה.
נקודות לתשובת מודל
withstatement: מבטיח סגירה אוטומטית של הקובץ, גם במקרה של חריגה, ובכך מונע דליפות משאבים ובעיות נפוצות.- טיפול ספציפי בשגיאות: מאפשר לתוכנית להגיב בצורה ממוקדת לכל סוג שגיאה, לשפר את חווית המשתמש, לספק הודעות שגיאה ברורות ולבצע פעולות שחזור מתאימות.
- שימוש ב-
try-except-else-finally:try: קוד שעלול לגרום לשגיאה (למשל, פעולת רשת).except: טיפול בשגיאות ספציפיות (למשל,ConnectionError).else: קוד שמתבצע רק אם ה-tryהצליח (למשל, עיבוד הנתונים שהתקבלו).finally: קוד ניקוי שמתבצע תמיד (למשל, סגירת חיבור לבסיס נתונים).