פייתון/פייתון גרסה 3/קריאה וכתיבה של מסמכים

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי

הקדמה[עריכה]

בפרק זה נקרא על קריאה וכתיבה של מסמכים הידועה בשם input (בקיצור: I) ו-output (בקיצור:O) ניתן לקרוא באמצעות פייתון קבצים שונים של טקסט וקידודים קיימים. נזדקק לפעולה זו בשביל:

  1. לבצע פעולות על קובץ נתונים מסוים בקלות ונוחות.
  2. חסכון בזכרון.
  3. מניעה מכל אדם לערוך קבצי קידוד.
  4. להריץ רק קידודים קיימים.
  5. מסמכים שומרים על התוכן שלהם לכן אם אירעה תקלה בעת הקלדת הקידוד, כל המסמכים שמורים במערכת.
  6. יצירת קבצים שונים כמו תמונות, מסמכים ועוד.
  7. זמינות של קבצים לצפייה על ידי תוכנה אחרת.

תנאים בסיסים[עריכה]

כאשר נרצה לקרוא קובץ באמצעות פייתון :

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

בכדי להקל על ההסבר מומלץ להכין שני קבצים:

  1. צרו קובץ אצווה חדש ושמרו אותו בתיקיה עם שם באנגלית.
  2. צרו קובץ כתבן תחת השם "otto" המכיל את הכיתוב:
Otto I, traditionally known as Otto the Great, was German king .
He was the oldest son of Henry I the Fowler and Matilda.

פתיחה וסגירה של קובץ[עריכה]

  1. פונקצית open ו-close.
  2. with open

שתי הפונקציות קוראות לפייתון לקבל נתונים ממסמך.

פונקצית open with open
חייבים לקרוא לסגירת הפונקציה באמצעות פונקצית close

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

אין צורך לקרוא לסגור את הקובץ
שורה של פקודות שורה מוזחת של פקודות
open('<variables>.<filename>','<mode>')

variables.close()
with open('<filename>','<mode>') as <variables>:
    ...
  • variables - משתנה בו נכנה את פעולת הקריאה.
  • filename - שם הקובץ.
    • העדפה - אם הקובץ והמסמך נמצאים באותה תיקיה, ניתן לרשום ב-filename את שם הקובץ (כולל סיומת של סוג הקובץ). אנו נתעדף לכנות שם בשם הקובץ לבדו כך שכל משתמש יכול להוריד את הקבצים לתיקיה במחשב ולהריץ אותם.
    • אם הקבצים בשתי תיקיות שונות נוכל לרשום את נתיב הקובץ.
  • mode

Mode[עריכה]

mode r+ r w w+ a a+
קריאה + + + +
כתיבה + + + + +
קריאה אחרי חיפוש + + +
יצירת קובץ במידה ואינו קיים + + + +
דריסת קובץ קיים + +
מיקום תו בהתחלה + + + +
מיקום תו בסוף + +
R+ קריאה וכתיבה, בעיקר עדכון. כתיבה מהתו הראשון.
R קריאה בלבד מתחילת הקובץ.
W דריסה או יצירה חדשה של קובץ עבור כתיבה מהתו הראשון של הקובץ.
w+ דריסה או יצירה חדשה של קובץ עבור כתיבה וקריאה מהתו הראשון של הקובץ.
A כתיבה מהתו האחרון
A+ כתיבה וקריאה מהתו האחרון
מצב בינארי
rb+ קריאה וכתיבה, בעיקר עדכון. כתיבה מהתו הראשון.
rb קריאה בלבד מתחילת הקובץ.
wb דריסה או יצירה חדשה של קובץ עבור כתיבה מהתו הראשון של הקובץ.
wb+ דריסה או יצירה חדשה של קובץ עבור כתיבה וקריאה מהתו הראשון של הקובץ.
ab "תו הקריאה והכתיבה" (iterator) נמצא מיד אחרי התו האחרון (ללא רווח)
ab+ "תו הקריאה והכתיבה" (iterator) נמצא מיד אחרי התו האחרון (ללא רווח)

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

מה סוג הקובץ? ומה נתיבו?[עריכה]

נתיבו של קובץ נמצא בשורת הניתוב של המסמכים. ניתן למצוא את ניתב הקובץ וסוג גם על ידי:

  1. לחיצה על מקש שמאלי של הקובץ
  2. מאפיינים
  3. בלשונית כללי קיימת שורה של סוג הקובץ ומיקום (בו מופיע הנתיב המלא)

דוגמה[עריכה]

בכדי להדגים כיצד קוראים לפייתון לקרוא או לכתוב מסמכים נעזר בפונקצית read() ובפונקצית closed().

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

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

#function: open
f = open('otto.txt','r')

print(f.read(4))
print(f.read(123))

f.close()

print(f.closed)

#function: with open
with open('otto.txt','r') as t:
    print(t.read(200))

print(t.closed)

הפלט:

Otto
 I, traditionally known as Otto the Great, was German king .

True
Otto I, traditionally known as Otto the Great, was German king .

True

[עריכה]

נעזר בפונקציות חדשות:

  1. readlines() - פונקציה הקוראת את כל שורות המסמך.
  2. write() - הפונקציה הכותבת אל הטקסט.

נמחק את הפקודות מקובץ האצווה שלנו בפייתון ונפתח במצב r+:

with open('otto.txt','r+') as f:
    f.write('After putting down a brief civil war among the rebellious duchies\n')
    print(f.readlines())

נבצע הרצה אחת בלבד :

['Otto I, traditionally known as Otto the Great, was German king .\n']

נפתח את קובץ הכתבן "otto" מחדש ונשם לב לשורה האחרונה שנוספה למסמך.

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

ו-[עריכה]

אם היינו במצב הינו מקבלים הודעת שגיאה  :

Traceback (most recent call last):
  File "C:/Users/user/Desktop/python/reading and writing files.py", line 2, in <module>
    f.write('He was the oldest son of Henry I the Fowler and Matilda.')
io.UnsupportedOperation: not writable

אם הינו במצב w היינו מקבלים גם שגיאה.

Traceback (most recent call last):
  File "C:/Users/user/Desktop/python/reading and writing files.py", line 3, in <module>
    print(f.readlines())
io.UnsupportedOperation: not readable

פייתון אינה יכולה להפעיל את פונקצית read כי לא ניתן לקרוא מהמסך במצב זה. אם נפתח את המסמך נשם לב כי פייתון כן בצעה את הפעולה הראשונה של גריסה ועל כן נותרנו עם שורה אחת "He was the oldest son of Henry I the Fowler and Matilda."

יצירה ודריסה של קובץ[עריכה]

ננסה לפתוח קובץ שאינו קיים:

with open('text.txt','r') as f:
     print(f.readlines())
>>>  File "C:\Users\user\Desktop\python\reading and writing files.py", line 1, in <module>
    with open('text.txt','r') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'text.txt'

קבלנו הודעת שגיאה כי הקובץ אינו קיים.

בחלק מהמצבים פייתון תיצור קובץ חדש תחת שם זה, למשל:

with open('text.txt','w+') as f:
     print(f.readlines())
   
>>>[]

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

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

with open('otto.txt','w+') as f:
     f.write('hello')

נפתח את קובץ "otto" ונראה כי נותר בו רק הכיתוב "hello".

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

מצב בינארי[עריכה]

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

דוגמה, ניצור מסמך עם הכיתוב:

He was the oldest son of Henry I the Fowler and Matilda.first.



0123456789abcdeft

נדפיס בקובץ האצווה את הכיתוב:

with open('otto.txt','rb+') as f:
     print(f.readlines())

>>>[b'He was the oldest son of Henry I the Fowler and Matilda.first.\r\n', b'\r\n', b'\r\n', b'\r\n', b'0123456789abcdeft ']

כפי שניתן לראות פייתון תרגמה את הרווחים במסמך והמירה אותם לכיתוב-\n.

  • הוא סימון עבור ASCII ובשל זה אין לנו עניין בו.
  • b מסמן את המצב הבינארי.

בשלב זה אין לנו עניין במצב זה ולכן לא נעמיק בכל תו ותו בו.

ראה גם[עריכה]

מקורות חיצונים[עריכה]