۹

کار با فایل‌ها 📁

یاد می‌گیریم چطور داده‌ها رو ذخیره و بازیابی کنیم!

خواندن و نوشتن فایل‌های متنی

پایتون ابزارهای قدرتمندی برای کار با فایل‌های متنی داره:

نوشتن در فایل متنی
# نوشتن در فایل (ایجاد فایل جدید)
with open('test.txt', 'w', encoding='utf-8') as file:
    file.write("سلام دنیا!\n")
    file.write("این یک فایل تست است.\n")
    file.write("پایتون فوق العاده است!")

# اضافه کردن به انتهای فایل
with open('test.txt', 'a', encoding='utf-8') as file:
    file.write("\nاین خط جدید اضافه شد!")

# نوشتن چندین خط با writelines
lines = ["خط اول\n", "خط دوم\n", "خط سوم\n"]
with open('test.txt', 'w', encoding='utf-8') as file:
    file.writelines(lines)
خواندن از فایل متنی
# خواندن کل فایل
with open('test.txt', 'r', encoding='utf-8') as file:
    content = file.read()
    print("محتوای کامل فایل:")
    print(content)

# خواندن خط به خط
with open('test.txt', 'r', encoding='utf-8') as file:
    print("\nخط به خط:")
    for line in file:
        print(line.strip())  # strip() برای حذف \n

# خواندن همه خطوط به صورت لیست
with open('test.txt', 'r', encoding='utf-8') as file:
    lines = file.readlines()
    print("\nهمه خطوط:")
    for i, line in enumerate(lines, 1):
        print(f"{i}: {line.strip()}")

# خواندن چند کاراکتر
with open('test.txt', 'r', encoding='utf-8') as file:
    first_10_chars = file.read(10)
    print(f"\n۱۰ کاراکتر اول: {first_10_chars}")

مدیریت فایل‌ها با with statement

استفاده از with برای مدیریت خودکار فایل‌ها:

مزایای with statement
# روش قدیمی (بدون with) - نیاز به close دستی
file = open('test.txt', 'r', encoding='utf-8')
try:
    content = file.read()
    print(content)
finally:
    file.close()  # حتما باید بسته شود

# روش جدید (با with) - مدیریت خودکار
with open('test.txt', 'r', encoding='utf-8') as file:
    content = file.read()
    print(content)
# فایل به صورت خودکار بسته می‌شود

# کار با چند فایل به صورت همزمان
with open('input.txt', 'r', encoding='utf-8') as input_file, \
     open('output.txt', 'w', encoding='utf-8') as output_file:
    
    content = input_file.read()
    output_file.write(content.upper())
    print("فایل کپی شد و به حروف بزرگ تبدیل شد!")

💡 نکته: استفاده از with statement توصیه می‌شود چون:

  • فایل به صورت خودکار بسته می‌شود
  • از memory leak جلوگیری می‌کند
  • کد تمیزتر و خواناتر می‌شود
  • خطاها به خوبی مدیریت می‌شوند

حالت‌های مختلف باز کردن فایل

حالت‌های مختلفی برای کار با فایل‌ها وجود داره:

حالت‌های فایل
# 'r' - خواندن (پیش‌فرض)
with open('file.txt', 'r') as file:
    content = file.read()

# 'w' - نوشتن (ایجاد جدید یا overwrite)
with open('file.txt', 'w') as file:
    file.write("محتوای جدید")

# 'a' - append (اضافه کردن به انتها)
with open('file.txt', 'a') as file:
    file.write("\nخط جدید")

# 'x' - ایجاد فایل جدید (اگر وجود داشته باشد خطا می‌دهد)
try:
    with open('new_file.txt', 'x') as file:
        file.write("فایل جدید ایجاد شد")
except FileExistsError:
    print("فایل از قبل وجود دارد!")

# 'b' - حالت باینری
with open('image.jpg', 'rb') as file:
    binary_data = file.read()

# '+' - خواندن و نوشتن
with open('file.txt', 'r+') as file:
    content = file.read()
    file.write("\nاضافه شده با r+")

# ترکیب حالت‌ها
with open('file.txt', 'w+') as file:  # خواندن و نوشتن
    file.write("test")
    file.seek(0)  # بازگشت به ابتدای فایل
    content = file.read()

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

برای کار با فایل‌های غیرمتنی مثل عکس، ویدیو و ...:

فایل‌های باینری
# کپی فایل باینری
def copy_binary_file(source, destination):
    with open(source, 'rb') as src_file:
        with open(destination, 'wb') as dest_file:
            # خواندن و نوشتن به صورت chunk
            chunk_size = 4096  # 4KB
            while True:
                chunk = src_file.read(chunk_size)
                if not chunk:
                    break
                dest_file.write(chunk)
    print("فایل کپی شد!")

# کار با فایل‌های JSON
import json

# نوشتن داده به فایل JSON
data = {
    "name": "علی",
    "age": 25,
    "city": "تهران",
    "hobbies": ["خواندن", "نوشتن", "برنامه نویسی"]
}

with open('data.json', 'w', encoding='utf-8') as file:
    json.dump(data, file, ensure_ascii=False, indent=4)

# خواندن از فایل JSON
with open('data.json', 'r', encoding='utf-8') as file:
    loaded_data = json.load(file)
    print("داده JSON:", loaded_data)

# کار با pickle برای ذخیره اشیاء پایتون
import pickle

data = [1, 2, 3, "hello", {"key": "value"}]

with open('data.pkl', 'wb') as file:
    pickle.dump(data, file)

with open('data.pkl', 'rb') as file:
    loaded_data = pickle.load(file)
    print("داده pickle:", loaded_data)

مدیریت فایل‌ها و دایرکتوری‌ها

ماژول os و pathlib برای مدیریت فایل سیستم:

مدیریت فایل سیستم
import os
from pathlib import Path

# بررسی وجود فایل
if os.path.exists('test.txt'):
    print("فایل وجود دارد")
else:
    print("فایل وجود ندارد")

# دریافت اطلاعات فایل
if os.path.exists('test.txt'):
    print("اندازه فایل:", os.path.getsize('test.txt'), "bytes")
    print("آخرین تغییر:", os.path.getmtime('test.txt'))

# لیست فایل‌های یک دایرکتوری
files = os.listdir('.')
print("فایل‌های دایرکتوری فعلی:")
for file in files:
    print(f"- {file}")

# ایجاد و حذف دایرکتوری
os.makedirs('new_folder', exist_ok=True)
# os.rmdir('new_folder')  # حذف دایرکتوری خالی

# استفاده از pathlib (مدرن‌تر)
path = Path('test.txt')
print("نام فایل:", path.name)
print("پدر فایل:", path.parent)
print("پسوند فایل:", path.suffix)

if path.exists():
    print("محتویات فایل:")
    print(path.read_text(encoding='utf-8'))

# جستجوی فایل‌ها
for py_file in Path('.').glob('*.py'):
    print(f"فایل پایتون: {py_file}")

# جستجوی بازگشتی
for file in Path('.').rglob('*.txt'):
    print(f"فایل متنی: {file}")

مدیریت خطا در کار با فایل‌ها

مدیریت صحیح خطاها در کار با فایل‌ها بسیار مهمه:

مدیریت خطا
try:
    with open('nonexistent.txt', 'r', encoding='utf-8') as file:
        content = file.read()
except FileNotFoundError:
    print("فایل پیدا نشد!")
except PermissionError:
    print("دسترسی به فایل مجاز نیست!")
except UnicodeDecodeError:
    print("خطا در decoding فایل!")
except Exception as e:
    print(f"خطای ناشناخته: {e}")
else:
    print("فایل با موفقیت خوانده شد!")
finally:
    print("این بخش همیشه اجرا می‌شود.")

# تابع امن برای خواندن فایل
def safe_read_file(filename):
    try:
        with open(filename, 'r', encoding='utf-8') as file:
            return file.read()
    except FileNotFoundError:
        return "فایل پیدا نشد"
    except Exception as e:
        return f"خطا در خواندن فایل: {e}"

# استفاده از تابع
content = safe_read_file('test.txt')
print(content)

تمرین! 🧠

برنامه‌ای بنویسید که:

  1. از کاربر بگیرد و در فایلی ذخیره کند
  2. محتوای فایل رو بخونه و نمایش بده
  3. تعداد کلمات و خطوط فایل رو بشماره
  4. یک کپی از فایل ایجاد کنه
  5. خطاها رو به درستی مدیریت کنه

جواب تمرین

import os
from pathlib import Path

def file_manager():
    """مدیریت فایل با قابلیت‌های مختلف"""
    
    filename = input("نام فایل را وارد کنید: ")
    
    try:
        # دریافت محتوا از کاربر
        print("محتوا را وارد کنید (برای پایان enter خالی بزنید):")
        lines = []
        while True:
            line = input()
            if line == "":
                break
            lines.append(line)
        
        # نوشتن در فایل
        with open(filename, 'w', encoding='utf-8') as file:
            file.write('\n'.join(lines))
        
        print(f"محتوا در فایل '{filename}' ذخیره شد.")
        
        # خواندن و نمایش محتوا
        with open(filename, 'r', encoding='utf-8') as file:
            content = file.read()
            print("\nمحتوای فایل:")
            print(content)
        
        # شمارش کلمات و خطوط
        with open(filename, 'r', encoding='utf-8') as file:
            lines = file.readlines()
            word_count = sum(len(line.split()) for line in lines)
            
            print(f"\nآمار فایل:")
            print(f"تعداد خطوط: {len(lines)}")
            print(f"تعداد کلمات: {word_count}")
        
        # ایجاد کپی
        copy_name = f"copy_{filename}"
        with open(filename, 'r', encoding='utf-8') as src:
            with open(copy_name, 'w', encoding='utf-8') as dest:
                dest.write(src.read())
        
        print(f"کپی فایل با نام '{copy_name}' ایجاد شد.")
        
        # نمایش اطلاعات فایل
        path = Path(filename)
        if path.exists():
            print(f"\nاطلاعات فایل:")
            print(f"اندازه: {path.stat().st_size} bytes")
            print(f"آخرین تغییر: {path.stat().st_mtime}")
            
    except Exception as e:
        print(f"خطا: {e}")

if __name__ == "__main__":
    file_manager()