فایل‌های باینری

اصلاح شده

2026-07-25

تفاوت فایل متنی و باینری

نوع محتوا مثال
متنی (text) کاراکترهای قابل‌خواندن، با encoding رمزگذاری می‌شه .txt، .csv
باینری (binary) دنباله خام بایت‌ها، بدون تفسیر متنی .jpg، .png، .mp3، .pdf، .zip
  • در حالت متنی، پایتون بایت‌ها رو با یک encoding (مثلاً UTF-8) به رشته تبدیل می‌کنه
  • در حالت باینری، هیچ تبدیلی انجام نمی‌شه — داده به‌صورت خام (bytes) خونده/نوشته می‌شه

باز کردن فایل باینری — حرف b

حالت کاربرد
'rb' خواندن باینری
'wb' نوشتن باینری (پاک‌کردن محتوای قبلی)
'ab' append باینری
'xb' ساخت فایل باینری جدید (خطا اگه وجود داشته باشه)

خواندن فایل باینری

with open('image.jpg', 'rb') as f:
    data = f.read()
    print(type(data))   # <class 'bytes'>
    print(len(data))    # تعداد بایت‌ها
  • خروجی از نوع bytes هست، نه str
  • ⚠️ متدهای رشته‌ای مثل .rstrip() یا .startswith('متن') روی bytes فرق دارن (باید با b'...' مقایسه بشن)

نوشتن فایل باینری

data = b'\x89PNG\r\n\x1a\n...'
with open('output.bin', 'wb') as f:
    f.write(data)
  • فقط bytes یا bytearray قابل نوشتنه، نه رشته معمولی

کپی کردن یک فایل باینری (مثال کاربردی)

with open('source.jpg', 'rb') as fin:
    with open('copy.jpg', 'wb') as fout:
        fout.write(fin.read())
  • برای فایل‌های بزرگ بهتره تکه‌تکه (chunk) بخونیم تا حافظه پر نشه:
with open('source.jpg', 'rb') as fin, open('copy.jpg', 'wb') as fout:
    while True:
        chunk = fin.read(4096)   # هر بار ۴۰۹۶ بایت
        if not chunk:
            break
        fout.write(chunk)

تبدیل بین str و bytes

متد کار
str.encode() تبدیل رشته به بایت
bytes.decode() تبدیل بایت به رشته
s = "سلام"
b = s.encode('utf-8')     # str → bytes
print(b)

s2 = b.decode('utf-8')    # bytes → str
print(s2)

نکته مهم: باز کردن فایل متنی به‌جای باینری (و برعکس) خطا می‌ده

  • سعی در خواندن فایل باینری (مثل عکس) با حالت 'r' معمولاً باعث خطای decode می‌شه:
UnicodeDecodeError: 'utf-8' codec can't decode byte...
  • قانون کلی: فایل‌های غیرمتنی (عکس، صدا، فایل فشرده، اجرایی) → همیشه با b