تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

آموزش تابع open() در پایتون، نحوه باز کردن، خواندن و نوشتن فایل‌ها


۹ مهر ۱۴۰۴

در این راهنما، به دنیای عملیات فایل در پایتون قدم می‌گذاریم. از خواندن و نوشتن در فایل‌ها گرفته تا کپی، حذف و مدیریت دایرکتوری‌ها، همه‌چیز را به زبانی ساده و در عین حال حرفه‌ای بررسی می‌کنیم. عملیات فایل یکی از مهارت‌های کلیدی در برنامه‌نویسی است و پایتون با ابزارهای قدرتمندش این کار را هم ساده و هم انعطاف‌پذیر کرده.

ابتدا یاد می‌گیریم فایل‌ها را در حالت‌های مختلف مثل خواندن، نوشتن یا اضافه کردن باز کنیم. سپس، به جزئیات خواندن و نوشتن در فایل‌های متنی و باینری می‌پردازیم. به خطاهای رایج مثل FileNotFoundError یا UnicodeDecodeError هم اشاره می‌کنیم و راه‌های مدیریتشون رو توضیح می‌دیم. همچنین، می‌بینیم چرا دستور with بهترین دوست ما برای کار با فایل‌هاست.

علاوه بر این‌ها، به سراغ موضوعات پیشرفته‌تر مثل کپی و جابجایی فایل‌ها و کار با پوشه‌ها می‌ریم. از کتابخانه‌های سنتی os و shutil استفاده می‌کنیم و pathlib رو به‌عنوان یه روش مدرن و شیءگرا معرفی می‌کنیم که کد رو تمیزتر و خواناتر می‌کنه.

در پایان، با دانش کامل عملیات فایل در پایتون، آماده‌اید که این مهارت‌ها رو در پروژه‌های واقعی به کار ببرید. چه مبتدی باشید و چه حرفه‌ای، این راهنما به شما کمک می‌کنه تا با اعتماد به نفس با فایل‌ها کار کنید.

همین الان، بدون هیچ‌گونه پیچیدگی، هاست Python خود را در کمتر از ۳۰ ثانیه راه‌اندازی کنید.
✅ استقرار سریع و آسان ✅ پشتیبانی از فریم‌ورک‌های مختلف ✅ عملکرد پایدار
خرید هاست Python

آنچه در ادامه خواهید خواند:

  • نکات کلیدی برای شروع
  • چرا به عملیات فایل در پایتون نیاز داریم؟
  • سوالات متداول
  • جمع بندی

نکات کلیدی برای شروع

  • دستور with open() بهترین روشه: این دستور فایل رو بعد از کار خودکار می‌بنده، حتی اگه خطایی رخ بده. این یعنی امنیت بیشتر و کد تمیزتر.
  • حالت مناسب رو انتخاب کنید: حالتی مثل ‘r’ برای خواندن یا ‘w’ برای نوشتن، رفتار فایل رو تعیین می‌کنه.
  • pathlib رو امتحان کنید: این ماژول مدرن مسیرهای فایل رو به‌صورت شیء مدیریت می‌کنه و از os.path قدیمی ساده‌تره.
  • از خطای کدگذاری جلوگیری کنید: با مشخص کردن کدگذاری (مثل utf-8) در open()، از خطای UnicodeDecodeError در امان می‌مونید.
  • فایل‌های گم‌شده رو مدیریت کنید: قبل از باز کردن فایل، وجودش رو چک کنید یا از try…except برای گرفتن خطای FileNotFoundError استفاده کنید.
  • فایل‌های بزرگ رو هوشمندانه بخونید: برای صرفه‌جویی در حافظه، فایل‌های بزرگ رو خط به خط با حلقه for پردازش کنید.

چرا به عملیات فایل در پایتون نیاز داریم؟

تصور کنید در یه پروژه یادگیری ماشین با دیتاست‌های حجیم کار می‌کنید. اینجا فایل‌ها نقش اصلی رو بازی می‌کنن. چون پایتون یکی از محبوب‌ترین زبان‌ها برای علوم داده و تحلیل دیتاست، تسلط بر عملیات فایل یه مهارت ضروریه. چه بخواید داده‌ها رو از فایل بخونید، نتایج رو ذخیره کنید یا فایل‌ها رو مدیریت کنید، پایتون ابزارهای ساده و قدرتمندی داره.

بیایید با هم این ابزارها رو کشف کنیم.

تابع open() در پایتون

1. باز کردن فایل با تابع open()

اولین قدم برای کار با فایل، باز کردنشه. تابع open() این کار رو براتون انجام می‌ده. این تابع دو آرگومان اصلی می‌گیره: نام فایل (با مسیر) و حالت باز کردن.

جدول زیر حالت‌های اصلی باز کردن فایل رو نشون می‌ده:

حالتتوضیحاگر فایل وجود داشته باشهاگر فایل وجود نداشته باشه
‘r’خواندن (پیش‌فرض)فایل رو برای خواندن باز می‌کنه. نشانگر در ابتدای فایله.خطای FileNotFoundError می‌ده.
‘w’نوشتنمحتوای فایل رو پاک می‌کنه و برای نوشتن باز می‌کنه.یه فایل جدید می‌سازه.
‘a’اضافه کردنبرای نوشتن باز می‌کنه. داده جدید به انتهای فایل اضافه می‌شه.یه فایل جدید می‌سازه.
‘x’ایجاد انحصاریخطای FileExistsError می‌ده.یه فایل جدید برای نوشتن می‌سازه.

حالت‌های اضافی (قابل ترکیب با حالت‌های اصلی):

اضافیتوضیح
‘+’خواندن و نوشتن همزمان. مثلاً ‘r+’ برای خواندن و نوشتن بدون پاک کردن محتوا.
‘b’حالت باینری برای فایل‌های غیرمتنی (مثل تصاویر). داده‌ها به‌صورت بایت پردازش می‌شن. مثلاً ‘rb’ یا ‘wb’.
‘t’حالت متنی (پیش‌فرض). داده‌ها به‌صورت رشته پردازش می‌شن. مثلاً ‘rt’ همون ‘r’ هست.

حالت‌های ترکیبی با +:

حالتتوضیحاگر فایل وجود داشته باشهاگر فایل وجود نداشته باشه
‘r+’خواندن و نوشتنبرای هر دو باز می‌کنه. نشانگر در ابتدا. محتوا پاک نمی‌شه.خطای FileNotFoundError می‌ده.
‘w+’نوشتن و خواندنمحتوا رو پاک می‌کنه و برای هر دو باز می‌کنه.فایل جدید می‌سازه.
‘a+’اضافه کردن و خواندنبرای اضافه کردن و خواندن باز می‌کنه. نشانگر برای نوشتن در انتها. برای خواندن، seek(0) کنید.فایل جدید می‌سازه.

فرض کنید فایلی به نام data.txt در همون دایرکتوری کدتون دارید. بیایید بازش کنیم:

# Open file in the same directory
text_file = open('data.txt', 'r')

# Open file with full path
text_file2 = open('/home/user/data.txt', 'r')

print('Method 1')
print(text_file)

print('Method 2')
print(text_file2)

خروجی:

Method 1
<_io.TextIOWrapper name='data.txt' mode='r' encoding='UTF-8'>

Method 2
<_io.TextIOWrapper name='/home/user/data.txt' mode='r' encoding='UTF-8'>

این کد نشون می‌ده فایل با موفقیت باز شده و آماده عملیات بعدیه.

2. خواندن و نوشتن در فایل‌ها

پایتون روش‌های مختلفی برای خواندن و نوشتن فایل‌ها داره که هرکدوم کاربرد خاص خودشون رو دارن. برای خواندن، فایل باید در حالت خواندن (‘r’) یا خواندن/نوشتن (‘r+’) باز بشه. برای نوشتن، حالت نوشتن (‘w’) یا اضافه کردن (‘a’) لازمه.

توابع مهم:

  • read(): کل فایل رو می‌خونه و به‌صورت یه رشته برمی‌گردونه.
  • readline(): یه خط رو می‌خونه و به‌صورت رشته برمی‌گردونه. هر بار که صدا بشه، خط بعدی رو می‌گیره.
  • readlines(): یه لیست از خطوط فایل برمی‌گردونه.
  • write(): یه رشته رو به فایل می‌نویسه.
  • writelines(): یه لیست از رشته‌ها رو به فایل می‌نویسه.

مثال خواندن: فرض کنید فایلی به نام notes.txt داریم. بیایید خطوطش رو بخونیم:

# Open the file
text_file = open('/Users/user/notes.txt', 'r')

# Get list of lines
line_list = text_file.readlines()

# Print each line
for line in line_list:
    print(line.strip())  # Remove extra newlines

# Close the file
text_file.close()

خروجی: محتوای فایل خط به خط چاپ می‌شه.

مثال نوشتن: حالا بیایید یه فایل جدید بسازیم و چند خط بنویسیم:

# Open the file in write mode
text_file = open('/Users/user/output.txt', 'w')

# Initialize an empty list
word_list = []

# Get 4 lines of input
for i in range(4):
    print("Enter some text:")
    line = input()
    word_list.append(line + '\n')

# Write the list to the file
text_file.writelines(word_list)

# Close the file
text_file.close()

خروجی: برنامه از کاربر ۴ خط ورودی می‌گیره و به فایل output.txt می‌نویسه.

3. کپی کردن فایل با ماژول shutil

برای کپی فایل، ماژول shutil ابزارهای ساده‌ای داره. دو متد اصلی برای کپی:

  • copy2(): فایل رو با متادیتا (مثل زمان ایجاد) کپی می‌کنه.
  • copyfile(): فقط محتوای فایل رو کپی می‌کنه.

مثال:

import shutil

# Copy with metadata
shutil.copy2('/Users/user/notes.txt', '/Users/user/notes_copy.txt')

# Copy without metadata
shutil.copyfile('/Users/user/notes.txt', '/Users/user/notes_copy_simple.txt')

print("File copied successfully")

4. حذف فایل با ماژول os

برای حذف فایل، از متد os.remove() استفاده کنید. برای حذف یه پوشه و محتویاتش، shutil.rmtree() مناسبه.

مثال:

import os
import shutil

# Delete a single file
os.remove('/Users/user/notes_copy.txt')

# Delete a directory and its contents
shutil.rmtree('/Users/user/test_folder')

print("Deletion completed")

5. بستن فایل با close()

بعد از هر عملیات فایل، باید فایل رو ببندید تا تغییرات ذخیره بشن و منابع آزاد بشن. این کار با متد close() انجام می‌شه:

# Open the file
text_file = open('/Users/user/notes.txt', 'r')

# Perform operations
content = text_file.read()

# Close the file
text_file.close()

اما یه روش بهتر وجود داره…

6. استفاده از with open() برای باز و بسته کردن فایل

دستور with open() بهترین روش برای کار با فایل‌هاست چون فایل رو خودکار می‌بنده، حتی اگه خطایی رخ بده. این یعنی دیگه نگران فراموش کردن close() نیستید.

مثال:

# Read file using with
with open('notes.txt', 'r') as f:
    content = f.read()
    print(content)

اگه خطایی رخ بده، فایل همچنان بسته می‌شه:

try:
    with open('log.txt', 'w') as f:
        print("Writing to log file...")
        f.write("Log entry started.\n")
        # Simulate an error
        result = 10 / 0
        f.write("This won't be written.\n")
except ZeroDivisionError:
    print("Error occurred, but file was closed automatically!")

اینجا، حتی با وجود خطای تقسیم بر صفر، فایل به‌درستی بسته می‌شه. with با همه حالت‌ها (مثل ‘rb’ برای فایل‌های باینری) کار می‌کنه. برای فایل‌های غیرمتنی مثل تصاویر، حتماً از حالت باینری (‘b’) استفاده کنید تا داده خراب نشه.

7. مدیریت خطای FileNotFoundError

این خطا وقتی رخ می‌ده که فایل در مسیر مشخص‌شده پیدا نشه. برای جلوگیری، مسیر رو دقیق وارد کنید یا وجود فایل رو چک کنید.

مثال خطا:

File "/Users/user/script.py", line 2, in <module>
    text_file = open('/Users/user/missing.txt', 'r')
FileNotFoundError: [Errno 2] No such file or directory: '/Users/user/missing.txt'

رفع خطا:

import os

# Check if file exists
if os.path.exists('/Users/user/notes.txt'):
    with open('/Users/user/notes.txt', 'r') as f:
        print(f.read())
else:
    print("File not found!")

8. کدگذاری فایل و مدیریت فایل‌های غیر-UTF-8

وقتی با فایل‌های متنی از منابع مختلف کار می‌کنید، ممکنه با خطای UnicodeDecodeError روبرو بشید. این خطا وقتی رخ می‌ده که کدگذاری فایل (مثل utf-8 یا cp1252) با چیزی که پایتون انتظار داره، مطابقت نداشته باشه.

انواع کدگذاری:

  • ASCII: برای انگلیسی ساده، قدیمی و محدود.
  • UTF-8: استاندارد جهانی برای همه زبان‌ها.
  • کدگذاری‌های قدیمی (مثل cp1252): تو سیستم‌های قدیمی‌تر مثل ویندوز دیده می‌شن.

برای مدیریت:

  1. کدگذاری درست فایل رو پیدا کنید (اگه نمی‌دونید، از کتابخانه chardet کمک بگیرید).
  2. کدگذاری رو در open() مشخص کنید:
try:
    with open('legacy_file.txt', 'r', encoding='utf-8') as f:
        content = f.read()
        print(content)
except (UnicodeDecodeError, FileNotFoundError) as e:
    print(f"Error occurred: {e}")

اگه فایل بایت‌های نامعتبر داشته باشه، از پارامتر errors استفاده کنید:

# Replace invalid bytes with �
with open('data_with_errors.txt', 'r', encoding='utf-8', errors='replace') as f:
    content = f.read()
    print(content)

9. استفاده از pathlib برای مدیریت مسیرها

ماژول pathlib روش مدرن و شیءگرایی برای کار با مسیرهای فایل سیستم ارائه می‌ده. برخلاف os.path که با رشته‌ها کار می‌کنه، pathlib مسیرها رو به‌صورت اشیاء مدیریت می‌کنه. این باعث می‌شه کد خواناتر و قابل‌اعتمادتر باشه، به‌خصوص تو سیستم‌های مختلف مثل ویندوز و لینوکس.

مزایا:

  • استفاده از عملگر / برای ساخت مسیرها (به‌جای os.path.join).
  • دسترسی مستقیم به بخش‌های مسیر (مثل نام فایل یا پسوند).

مثال:

from pathlib import Path

# Build a path
config_path = Path.home() / 'Documents' / 'settings.ini'

# Print path details
print(f"Full Path: {config_path}")
print(f"Parent Directory: {config_path.parent}")
print(f"File Name: {config_path.name}")
print(f"File Extension: {config_path.suffix}")

عملیات با pathlib:

# Check if file exists
if config_path.exists():
    print("File exists!")

# Read file content
content = config_path.read_text(encoding='utf-8')
print(content)

# Write to file
config_path.write_text("new setting = true", encoding='utf-8')

# Find all .txt files in a directory
for file in Path('/Users/user').glob('*.txt'):
    print(file)

سوالات متداول

در ادامه به سوالاتی که امکان دارد در این زمینه برای شما بدون پاسخ بماند، جواب‌های کوتاه اما مفیدی داده‌ایم که با استفاده از آن می‌توانید به سوال خود پاسخ صحیحی را بدهید.

چطور وجود فایل رو در پایتون چک کنم؟

چند روش وجود داره:

با os.path:

import os

if os.path.exists('my_file.txt'):
    print("File exists!")
else:
    print("File does not exist.")

با pathlib (توصیه‌شده):

from pathlib import Path

file_path = Path('my_file.txt')
if file_path.is_file():
    print("File exists!")
else:
    print("File does not exist.")

با try-except:

try:
    with open('my_file.txt', 'r') as f:
        content = f.read()
        print("File exists and read.")
except FileNotFoundError:
    print("File does not exist.")

تفاوت حالت‌های ‘w’ و ‘a’ چیست؟

  • ‘w’ (نوشتن): اگه فایل وجود داشته باشه، محتواش پاک می‌شه و از نو نوشته می‌شه. اگه نباشه، فایل جدید ساخته می‌شه.
  • ‘a’ (اضافه کردن): داده رو به انتهای فایل اضافه می‌کنه و محتوای موجود حفظ می‌شه.

مثال:

# Write mode
with open('data.txt', 'w') as f:
    f.write("First line.\n")
with open('data.txt', 'w') as f:
    f.write("This overwrites.\n")
# Only contains "This overwrites."

# Append mode
with open('log.txt', 'a') as f:
    f.write("Log 1.\n")
with open('log.txt', 'a') as f:
    f.write("Log 2.\n")
# Contains both "Log 1." and "Log 2."

چرا with open() بهتر از open() ساده است؟

with open() فایل رو خودکار می‌بنده، حتی اگه خطایی رخ بده. این باعث می‌شه از نشت منابع (مثل باز موندن فایل) جلوگیری بشه و کد ایمن‌تر باشه.

چگونه از بازنویسی فایل جلوگیری کنم؟

از حالت ‘x’ یا چک کردن وجود فایل استفاده کنید:

try:
    with open('new_file.txt', 'x') as f:
        f.write("New content.")
except FileExistsError:
    print("File exists, not overwritten.")

یا:

import os

if not os.path.exists('data.txt'):
    with open('data.txt', 'w') as f:
        f.write("Initial data.")
else:
    print("File exists, skipping write.")

چطور فایل رو با کدگذاری خاص باز کنم؟

از پارامتر encoding در open() استفاده کنید:

# Write with UTF-8
with open('data_utf8.txt', 'w', encoding='utf-8') as f:
    f.write("سلام دنیا")

# Read with UTF-8
with open('data_utf8.txt', 'r', encoding='utf-8') as f:
    content = f.read()
    print(content)

می‌تونم فایل رو برای خواندن و نوشتن همزمان باز کنم؟

بله، با حالت‌های ‘r+’، ‘w+’ یا ‘a+’:

with open('example.txt', 'w+') as f:
    f.write("Line 1\n")
    f.write("Line 2\n")
    f.seek(0)  # Move to start
    content = f.read()
    print("Content:", content)

بهترین روش برای خواندن فایل‌های بزرگ چیه؟

برای فایل‌های بزرگ، خط به خط بخونید تا حافظه کمتری مصرف بشه:

python

# Read line by line
with open('large_file.txt', 'r') as f:
    for line in f:
        print(line, end='')

یا برای فایل‌های باینری، به‌صورت تکه‌ای:

python

# Read in chunks
with open('large_binary.bin', 'rb') as f:
    chunk_size = 4096  # 4KB
    while True:
        chunk = f.read(chunk_size)
        if not chunk:
            break
        # Process chunk

جمع‌ بندی

حالا با عملیات فایل در پایتون کاملاً آشنا شدید. از باز کردن و خواندن/نوشتن فایل‌ها گرفته تا مدیریت خطاها و کار با مسیرها، همه‌چیز رو یاد گرفتید. همیشه از with open() برای ایمنی بیشتر استفاده کنید و برای مدیریت مسیرها، pathlib رو به کار ببرید تا کدتون مدرن و تمیز باشه.

این دانش رو در پروژه‌هاتون به کار ببرید، چه بخواید داده‌های بزرگ رو پردازش کنید یا فایل‌های ساده رو مدیریت کنید. با تمرین، این مهارت‌ها بخشی از جعبه‌ابزار برنامه‌نویسی‌تون می‌شن. موفق باشید!

به اشتراک بگذارید

برچسب‌ها: