۹
کار با فایلها 📁
یاد میگیریم چطور دادهها رو ذخیره و بازیابی کنیم!
خواندن و نوشتن فایلهای متنی
پایتون ابزارهای قدرتمندی برای کار با فایلهای متنی داره:
نوشتن در فایل متنی
# نوشتن در فایل (ایجاد فایل جدید)
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)
تمرین! 🧠
برنامهای بنویسید که:
- از کاربر بگیرد و در فایلی ذخیره کند
- محتوای فایل رو بخونه و نمایش بده
- تعداد کلمات و خطوط فایل رو بشماره
- یک کپی از فایل ایجاد کنه
- خطاها رو به درستی مدیریت کنه
جواب تمرین
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()