حالت آفلاین — محتوا از حافظهٔ کش نمایش داده می‌شود
آموزش کار با فایل در پایتون؛ CSV، JSON و گزارش‌گیری

رفع باگ مسیر نسبی فایل در پایتون با pathlib

خط‌های فایل و مسیرها در پایتون؛ داده خالی و فایل گم‌شده · 0٪

✍️ مسیر نسبی نسبت به یک نقطه شروع معنا دارد. اگر فایل در پوشه data ساخته شده باشد، خواندن note.txt از پوشه بالاتر همان فایل را پیدا نمی‌کند. بهتره مسیر را از یک ریشه مشخص و چند جزء بسازیم، نه اینکه چند رشته وابسته به جداکننده سیستم را به هم بچسبانیم. عملگر / در Path همین کار را خوانا می‌کند.

مثلاً ریشه آزمایشی یک پوشه موقت است و مسیر فایل root / 'data' / 'note.txt' می‌شود. قبل از نوشتن فایل، خود پوشه data را می‌سازیم؛ ایجاد فایل به‌طور خودکار پوشه والد گم‌شده را ایجاد نمی‌کند. نام‌های این نمونه ثابت‌اند و هیچ مسیر کاربر از بیرون دریافت نمی‌شود.

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

در این تمرین پایان خط‌های احتمالی ورودی فقط LF یعنی \n، مثل مثال‌ها، هستند؛ ورودی با \r یا \r\n داده نمی‌شود.

فعالیت شما

تابع nested_read(text) در یک پوشه موقت، زیرپوشه data و فایل data/note.txt را از آرگومان text با UTF-8 بسازد؛ سپس همان فایل را بخواند و متن دقیق را بدهد. مسیر خواندن و نوشتن باید یکسان باشد؛ پوشه کاری را تغییر نده. متن خالی و فارسی معتبرند؛ nested_read('دفتر')='دفتر'. فایل بیرونی لازم نیست. در این تمرین پایان خط‌های احتمالی ورودی فقط LF یعنی \n، مثل مثال‌ها، هستند؛ ورودی با \r یا \r\n داده نمی‌شود.

مطالعهٔ این گام برای همه آزاد است

برای پاسخ‌دادن، بررسی پاسخ، ثبت پیشرفت و استفاده از دستیار باید شرایط شرکت در فعالیت‌ها را داشته باشید.

برای انجام فعالیت وارد شوید

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

کد اولیهٔ فعالیت

import tempfile
from pathlib import Path

def nested_read(text):
    with tempfile.TemporaryDirectory() as folder:
        root = Path(folder)
        (root / 'data').mkdir()
        path = root / 'data' / 'note.txt'
        path.write_text(text, encoding='utf-8')
        return (root / 'note.txt').read_text(encoding='utf-8')