ذخیره و خوندن فایل (Files)
متغیرها وقتی برنامه تموم میشه از بین میرن؛ فایلها میمونن. یه فایل رو با with باز میکنی، توش خط مینویسی، بدون پاک کردنش بهش اضافه میکنی و خطبهخط دوباره میخونیش.
OPEN و WITH و WRITE
یه فایل رو باز کن، توش بنویس، و بذار with ببندتش
with open("notes.txt", "w") as f: فایل notes.txt رو برای نوشتن باز میکنه و اسم فایل باز رو میذاره f. داخل بلوک تورفته، f.write("milk\n") یه متن توش مینویسه. وقتی بلوک تموم میشه، with خودش فایل رو میبنده، حتی اگه وسطش خطایی پیش اومده باشه. دو تا نکته دربارهی write: خط جدید اضافه نمیکنه، پس \n (کاراکتر خط جدید) رو خودت آخرش میذاری، و فقط رشته قبول میکنه، پس یه عدد رو باید با str(12) بدی.
فایل توی همون پوشهای پیدا میشه که برنامهت ازش اجرا میشه، مگر اینکه یه آدرس کامل بدی، مثل /home/reza/notes.txt.
with open("notes.txt", "w") as f:
f.write("milk\n")
f.write("eggs\n")
with open("notes.txt") as f:
print(f.read())milk
eggs
f.read() کل فایل رو بهصورت یه رشته میده، "milk\neggs\n". اون خط خالی آخر خروجی واقعیه: فایل با \n تموم میشه، و print هم یکی از خودش اضافه میکنه. اگه حالتی ندی، open برای خوندن باز میکنه.
خودت رو امتحان کن
f.write("tea") خودش بعد از tea یه خط جدید اضافه میکنه، درست مثل print.
جواب رو ببین
نادرست
غلطه. write دقیقاً همون متنی رو که بهش میدی توی فایل میذاره، نه بیشتر. اگه میخوای چیز بعدی از یه خط جدید شروع بشه، بنویس f.write("tea\n").
"w" پاک میکنه، "a" اضافه میکنه
"w" نوشتن
اگه فایل نباشه میسازدش. اگه از قبل باشه، اول هر چی توشه رو پاک میکنه، بعد مینویسه.
وقتی میخوای یه فایل رو از نو شروع کنی ازش استفاده کن.
"a" اضافه کردن (append)
اگه فایل نباشه میسازدش. اگه باشه، هر چی توشه رو نگه میداره و به آخرش اضافه میکنه.
برای گزارشها، دفترچهها و لیستهایی که بزرگ میشن ازش استفاده کن. حالت سوم، "r"، فقط میخونه و پیشفرضه.
خودت رو امتحان کن
notes.txt سه خط داره. مینا اون رو با open("notes.txt", "w") باز میکنه و یه خط مینویسه. حالا فایل چند خط داره؟
- 1
- 3
- 4
- 0، چون w نمیتونه توی فایلی که از قبل هست بنویسه
جواب رو ببین
1
درسته. "w" همون لحظهی باز شدن فایل سه خط قدیمی رو پاک کرد، پس فقط خط جدید مونده.
قدمبهقدم ببین

open("w"): main.py، milk و eggs رو مینویسه یه فلش از برنامه، main.py، میره توی notes.txt، با برچسب open("w"). حالت نوشتن فایل رو خالی شروع میکنه و هر چی بهش بدی رو مینویسه، پس حالا سند دو خط داره، milk و eggs، و نشانش عدد 2 رو نشون میده.

open("a"): tea به آخر اضافه میشه این بار برچسب فلش open("a")ـه و به زیر خط آخر اشاره میکنه. حالت اضافه کردن milk و eggs رو سر جاشون نگه میداره و tea رو به آخر اضافه میکنه، پس نشان میره روی 3.

open("r"): خطها از strip() رد میشن و برمیگردن با open("r")، از هر کدوم از سه خط notes.txt یه فلش میره توی دروازهی strip()، که \n آخر هر خط رو میاندازه. چیزی که بیرون میاد لیست lines رو پر میکنه: ['milk', 'eggs', 'tea']. خوندن فایل رو عوض نمیکنه؛ نشان هنوز 3ـه.

دوباره open("w"): فقط bread مونده برنامه یه بار دیگه notes.txt رو با "w" باز میکنه، که با نارنجیِ هشدار کشیده شده، و bread رو مینویسه. اول سه خط قبلی پاک میشن، پس فایل فقط bread رو داره، نشان میافته روی 1 و یه علامت هشدار روی سند میشینه. لیستی که مرحلهی قبل خونده شد هنوز نسخهی خودش رو داره، ولی خود فایل milk و eggs و tea رو از دست داده.
خودت رو امتحان کن
# notes.txt holds: milk, eggs
with open("notes.txt") as f:
for line in f:
print(line.strip().upper())MILK EGGSMILK EGGSMILKMILK EGGS
جواب رو ببین
MILK
EGGSدرسته. حلقه هر بار یه خط میده، strip() اون \n رو برمیداره و upper() حروفش رو بزرگ میکنه.
with open("notes.txt", "w") as f:
f.write("milk\neggs\n")
with open("notes.txt", "a") as f:
f.write("tea\n")
lines = []
with open("notes.txt") as f:
for line in f:
lines.append(line.strip())
print(lines)['milk', 'eggs', 'tea']کل انیمیشن توی یه برنامه: دو خط با "w" بنویس، سومی رو با "a" اضافه کن، بعد همه رو توی یه لیست برگردون. بدون strip() لیست میشد ['milk\n', 'eggs\n', 'tea\n'].
خودت رو امتحان کن
هر تیکه رو به کارش وصل کن
جواب رو ببین
- "r" → فایل رو میخونه؛ پیشفرض همینه
- "w" → فایل رو میسازه، یا پاکش میکنه و از نو شروع میکنه
- "a" → به آخر اضافه میکنه و قبلیها رو نگه میداره
- with → وقتی بلوک تموم شد خودش فایل رو میبنده
مرور درس
- متغیرها وقتی برنامه تموم میشه از بین میرن؛ فایل روی دیسک داده رو بین دو بار اجرا نگه میداره.
- with open(name, mode) as f: فایل رو باز میکنه و آخر بلوک خودش میبندتش.
- "r" میخونه (پیشفرض)، "w" پاک میکنه و مینویسه، "a" به آخر اضافه میکنه؛ "w" اشتباهی یعنی دادهی از دست رفته.
- write خط جدید اضافه نمیکنه و فقط رشته میگیره؛ \n رو خودت آخرش بذار.
- for line in f خطهایی میده که با \n تموم میشن، پس از line.strip() استفاده کن؛ برای متن فارسی encoding="utf-8" رو اضافه کن.