هر برنامهٔ واقعی با دنیای بیرون حرف میزند و بیشتر این حرفزدن «فایل» است: خواندن پیکربندی، نوشتن گزارش، ذخیرهٔ وضعیت.
متن در برابر باینری
فایل متنی را با انکدینگ (معمولاً UTF-8) میخوانیم و مینویسیم؛ فایل باینری (عکس، فشرده، مدل) را بایتبهبایت. قاطیکردن این دو (مثل خواندن عکس در حالت متنی) داده را خراب میکند.
from pathlib import Path
# خواندن امن با زمینهبان: بستهشدن تضمینی حتی وسط خطا
path = Path("data/scores.txt")
lines = path.read_text(encoding="utf-8").splitlines()
scores = [float(line) for line in lines if line.strip()]
pathlib مسیر را شیء میکند: path.name، path.suffix، path.parent، path.exists(). دیگر جمعکردن رشته با / و دردسر ویندوز/لینوکس تمام.
الگوی پردازش خطبهخط
def convert(input_path, output_path):
src, dst = Path(input_path), Path(output_path)
with src.open(encoding="utf-8") as fin, dst.open("w", encoding="utf-8") as fout:
for lineno, line in enumerate(fin, start=1):
line = line.strip()
if not line or line.startswith("#"):
continue # سطر خالی و نظر را رد کن
try:
fout.write(f"{lineno}: {float(line):.1f}\n")
except ValueError:
print(f"سطر {lineno} نامعتبر است و رد شد.")
دو نکتهٔ حرفهای: فایل بزرگ را یکجا read() نکن (حافظه!) و دو فایل را در یک with باز کن تا هر دو تضمینی بسته شوند.
JSON و CSV
import json, csv
# JSON: زبان تبادل ساختارهای تودرتو
config = {"host": "localhost", "port": 8000, "debug": True}
Path("config.json").write_text(json.dumps(config, ensure_ascii=False, indent=2), encoding="utf-8")
loaded = json.loads(Path("config.json").read_text(encoding="utf-8"))
# CSV: زبان جدولهای ساده
with open("scores.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["name", "score"])
writer.writeheader()
writer.writerows([{"name": "سارا", "score": 19}, {"name": "علی", "score": 17}])
تبدیل ساختار حافظهای (شیء، لیست، دیکشنری) به قالبی قابل ذخیره یا ارسال (بایت یا متن) و برگرداندن آن (deserialization). قرارداد قالب باید روشن و امن باشد.
سنجش فهم — فایل و سریالسازی
۰ از ۲ پاسخ داده شده