رفع خطاهای پایتون

خطای FileNotFoundError در پایتون؛ No such file or directory و رفع آن

خطای FileNotFoundError در پایتون؛ No such file or directory و رفع آن

🗓 آخرین به‌روزرسانی:

پیام FileNotFoundError: [Errno 2] No such file or directory وقتی ظاهر می‌شود که پایتون فایلی را که خواسته‌اید باز کند پیدا نکند. نکته مهم اینجاست که اغلب فایل واقعاً وجود دارد؛ فقط پایتون در پوشه دیگری دنبالش می‌گردد. درک «پوشه کاری» (Working Directory) کلید حل این خطاست.

معنی خطای FileNotFoundError در پایتون

وقتی با open("data.txt") فقط نام فایل را می‌دهید، پایتون آن را نسبت به پوشه کاری فعلی جست‌وجو می‌کند؛ یعنی پوشه‌ای که برنامه از آنجا اجرا شده، نه لزوماً پوشه‌ای که فایل .py در آن است. اگر فایل در آن مسیر نباشد یا نامش کمی متفاوت باشد، FileNotFoundError رخ می‌دهد. این خطا فقط در حالت خواندن رخ می‌دهد؛ حالت "w" فایل را می‌سازد، مگر اینکه پوشه مقصد وجود نداشته باشد.

علت‌های رایج این خطا

  • اجرای برنامه از پوشه‌ای غیر از پوشه فایل اسکریپت (رایج در VS Code و ترمینال).
  • غلط تایپی در نام یا پسوند فایل (مثل data.txt.txt که ویندوز پسوندش را پنهان کرده است).
  • استفاده از بک‌اسلش در مسیر ویندوز بدون رشته خام، مثل "C:\new\data.txt".
  • نوشتن فایل در پوشه‌ای که هنوز ساخته نشده است.

کد غلط و کد درست (با خروجی واقعی)

همه نمونه‌کدهای زیر با پایتون 3.13.5 اجرا شده‌اند و خروجی‌ها همان چیزی است که پایتون واقعاً نمایش می‌دهد.

مثال 1: باز کردن فایل ناموجود

❌ کد غلط:

with open("data.txt", encoding="utf-8") as f:
    print(f.read())

خروجی:

Traceback (most recent call last):
  File "/home/user/project/main.py", line 1, in <module>
    with open("data.txt", encoding="utf-8") as f:
         ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'data.txt'

✅ کد درست:

from pathlib import Path

path = Path("data.txt")
if path.exists():
    print(path.read_text(encoding="utf-8"))
else:
    print("File not found:", path.resolve())

خروجی:

File not found: /home/user/project/data.txt

مثال 2: مسیر نسبت به محل اسکریپت

❌ کد غلط:

with open("reports/2026/out.txt", "w", encoding="utf-8") as f:
    f.write("ok")

خروجی:

Traceback (most recent call last):
  File "/home/user/project/main.py", line 1, in <module>
    with open("reports/2026/out.txt", "w", encoding="utf-8") as f:
         ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'reports/2026/out.txt'

✅ کد درست:

from pathlib import Path

out = Path("reports/2026/out.txt")
out.parent.mkdir(parents=True, exist_ok=True)
out.write_text("ok", encoding="utf-8")
print("Saved")

خروجی:

Saved

همیشه مسیر را نسبت به خود اسکریپت بسازید

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

from pathlib import Path

BASE = Path(__file__).resolve().parent
data_file = BASE / "data.txt"
print(data_file.read_text(encoding="utf-8"))

راه‌حل قدم‌به‌قدم

  1. مسیر کامل را با print(Path("data.txt").resolve()) ببینید تا بفهمید پایتون دقیقاً کجا را می‌گردد.
  2. پوشه کاری فعلی را با import os; print(os.getcwd()) بررسی کنید.
  3. نام و پسوند واقعی فایل را در File Explorer (با نمایش پسوندها) کنترل کنید.
  4. مسیر را با Path(__file__).parent نسبت به اسکریپت بسازید.
  5. قبل از نوشتن فایل در زیرپوشه، پوشه را با mkdir(parents=True, exist_ok=True) بسازید.

خواندن پیام FileNotFoundError و عیب‌یابی

FileNotFoundError با پیام No such file or directory یعنی مسیری که به open یا توابع دیگر داده‌اید در آن لحظه وجود ندارد. نکته‌ای که اغلب نادیده گرفته می‌شود این است که مسیر نسبی نسبت به پوشه کاری فعلی (Current Working Directory) سنجیده می‌شود، نه نسبت به محل فایل اسکریپت.

اول با os.getcwd پوشه کاری را چاپ کنید و ببینید فایل واقعاً آنجاست یا نه. اگر اسکریپت را از ویرایشگر یا پوشه دیگری اجرا می‌کنید، پوشه کاری فرق می‌کند. راه مطمئن، ساختن مسیر بر اساس محل خود اسکریپت با pathlib است. کد زیر بررسی وجود فایل و مدیریت خطا را نشان می‌دهد.

بررسی مسیر قبل از باز کردن فایل

from pathlib import Path

path = Path("data") / "missing.txt"
print("Exists:", path.exists())

try:
    path.read_text(encoding="utf-8")
except FileNotFoundError as error:
    print(type(error).__name__, "-", error.strerror)

path.parent.mkdir(exist_ok=True)
path.write_text("hello", encoding="utf-8")
print("Content:", path.read_text(encoding="utf-8"))

خروجی (اجراشده با Python 3.13):

Exists: False
FileNotFoundError - No such file or directory
Content: hello

قدم‌به‌قدم رفع FileNotFoundError

پیام خطا مسیر دقیقی را که پایتون جست‌وجو کرده نشان می‌دهد.

  1. مسیر کامل را چاپ کنید: با Path(name).resolve() ببینید پایتون دقیقاً کجا را جست‌وجو کرده است.
  2. پوشه کاری را بررسی کنید: os.getcwd() را چاپ کنید؛ اگر با پوشه اسکریپت فرق دارد، مسیر نسبی جای اشتباهی را نشان می‌دهد.
  3. محتوای پوشه را فهرست کنید: با list(Path(‘.’).iterdir()) نام واقعی فایل‌ها و پسوندهای مخفی را ببینید.
  4. بک‌اسلش‌ها را چک کنید: در ویندوز \n یا \t داخل مسیر تفسیر می‌شود؛ از رشته خام یا / استفاده کنید.
  5. مسیر را مستقل کنید: مسیر را با Path(__file__).parent / ‘data.txt’ بسازید تا از هر پوشه‌ای اجرا شود.

اگر برنامه را برای کاربران دیگر می‌فرستید، مسیرهای ثابت مثل C:\Users\Ali را حذف کنید.

چک‌لیست پیشگیری

  • مسیرها را با Path(__file__).parent بسازید تا به پوشه اجرای برنامه وابسته نباشند.
  • در ویندوز به جای بک‌اسلش از / یا رشته خام r'…' استفاده کنید تا \n و \t تفسیر نشوند.
  • پسوند واقعی فایل را بررسی کنید؛ ویندوز ممکن است پسوندها را مخفی کند و نام فایل file.txt.txt شود.
  • قبل از نوشتن فایل در پوشه جدید، پوشه را با mkdir(parents=True, exist_ok=True) بسازید.
  • در کدهای حساس، خطا را با try/except بگیرید و پیام قابل فهم به کاربر نشان دهید.

📌 همچنین بخوانید: خطای unexpected EOF while parsing در پایتون، خطای ‘int’ object is not subscriptable در پایتون و خطای ImportError

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

در ویندوز مسیر را چطور بنویسم؟

از رشته خام r"C:\Users\me\data.txt" یا اسلش معمولی "C:/Users/me/data.txt" یا pathlib استفاده کنید تا بک‌اسلش‌ها کاراکتر خاص تفسیر نشوند.

چرا در ترمینال کار می‌کند ولی در VS Code نه؟

چون پوشه کاری در دو حالت فرق دارد. ساختن مسیر با Path(__file__).parent این مشکل را برای همیشه حل می‌کند.

فرق FileNotFoundError با PermissionError چیست؟

FileNotFoundError یعنی فایل یا پوشه پیدا نشد؛ PermissionError یعنی پیدا شد ولی اجازه خواندن یا نوشتن ندارید یا فایل توسط برنامه دیگری باز است.

چرا در VS Code فایل پیدا نمی‌شود ولی در ترمینال پیدا می‌شود؟

چون VS Code اسکریپت را از پوشه ریشه workspace اجرا می‌کند. مسیر را بر اساس __file__ بسازید یا پوشه کاری را تنظیم کنید.

فرق FileNotFoundError و PermissionError چیست؟

اولی یعنی مسیر وجود ندارد؛ دومی یعنی فایل هست ولی اجازه خواندن یا نوشتن ندارید یا مسیر یک پوشه است.

حالت w هم این خطا را می‌دهد؟

حالت w فایل را می‌سازد، اما اگر پوشه والد وجود نداشته باشد همچنان FileNotFoundError می‌گیرید.

آموزش‌های مرتبط

آموزش‌های تازه، کد آماده و رفع خطاهر هفته در کانال Dev Source؛ رایگان.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *