31-08-2017, 21:02
|
מנהל פורומי "תכנות ובניית אתרים" ו"חומרה ורשתות"
|
|
חבר מתאריך: 25.10.01
הודעות: 42,775
|
|
w דורס את הקובץ הקיים כפי שכתוב בתוצאה הראשונה שחיפשתי בגוגל "python open" והגעתי לכאן: https://docs.python.org/2/library/functions.html, שם לחצתי על open().
מכאן, שהקובץ שלך ידרס מיד בתחילת התוכנה. על פניו, לפי מה שכתוב שם, אם אני קורא נכון, w זה רק כתיבה, לא קריאה, ובשביל לקרוא ולכתוב מבלי לדרוס אתה צריך דווקא +r (קודם r ואז פלוס). זה כנראה גם יסביר את השגיאה הזו כשאני מריץ את הקוד שלך:
קוד:
$ ./p.py
Traceback (most recent call last):
File "./p.py", line 4, in <module>
for line in file:
io.UnsupportedOperation: not readable
אז, צריך להתחיל כנראה ב +r כאמור. בנוסף לזה, בהמשך הקוד שלך (אני לא מכיר פיית'ון אבל מעריך שזה דומה לשפות אחרות) - עבור כל שורה בקובץ שפתחת, נקראת שורה, מוצבת למשתנה line, ואז בבלוק שפתחת אתה דורס את המשתנה הקיים עם תוצאת ההחלפה של bad ב good. ואז לולאת ה for ממשיכה לאיטרציה הבאה עד שנגמרות כל השורות בקובץ.
הקובץ לא עובר כל שינוי, על פניו (כאמור אני לא יודע פיית'ון).
פתרון אחר שיכולת לעשות - לפתוח את הקובץ לקריאה בלבד, לפתוח קובץ נוסף (זמני) לכתיבה בלבד, ועבור כל שורה שאתה קורא בתוך ה for, לכתוב שורה אחרי השינוי לקובץ הזמני. בסיום הפעולה, אם הכל הצליח, אתה יכול לסגור את שני הקבצים ואז לבצע rename מהחדש לישן, שזוהי פעולה אטומית (או מצליחה לחלוטין ואז הקובץ המקורי הולך לאיבוד בדיוק באותו רגע שהחדש מחליף אותו, או שהיא נכשלת לחלוטין ואז למקורי לא קורה כלום. חשוב מאוד כשאתה נתקל במקרים כמו שנגמר המקום בדיסק וכיוצ"ב)
כמובן שגם בפתיחה של קבצים, גם בקריאה, וגם בכתיבה, יכולות להיות שגיאות. לכן אתה אמור לעטוף כל חלק בקוד שעשוי להיכשל ב try/except כדי שיטפלו במקרים האלה. ראה https://docs.python.org/2/tutorial/...ling-exceptions
נ.ב. אם אתה בלינוקס, לא צריך פיית'ון בשביל להחליף מילה במילה אחרת בקובץ:
קוד:
sed -i 's;bad;good;g' maor.txt
יעשה את העבודה מצויין.
|