Table of Contents
آشنایی با مسیر فایلها در پایتون
در این بخش روی «مسیر فایلها» (File Paths) تمرکز میکنیم؛ یعنی اینکه پایتون چطور میفهمد کدام فایل را باز کند و آن فایل کجای سیستم قرار دارد.
مسیر مطلق و مسیر نسبی
هر فایل در سیستمعامل، یک «آدرس» دارد که به آن مسیر (path) میگوییم.
مسیر مطلق (Absolute Path)
مسیر مطلق، آدرسی است که از ریشهٔ سیستمعامل شروع میشود و بدون وابستگی به محل فعلی شما، همان فایل را نشان میدهد.
- در ویندوز شبیه این است:
C:\Users\Ali\Documents\data.txt
- در macOS / لینوکس شبیه این است:
/home/ali/documents/data.txt
یا
/Users/ali/Documents/data.txt
در پایتون میتوانید مستقیم از مسیر مطلق استفاده کنید:
file = open("C:/Users/Ali/Documents/data.txt", "r", encoding="utf-8")
text = file.read()
file.close()یا در لینوکس / macOS:
file = open("/home/ali/documents/data.txt", "r", encoding="utf-8")مسیر نسبی (Relative Path)
مسیر نسبی نسبت به «پوشهٔ کاری فعلی» (current working directory) تفسیر میشود؛ یعنی نسبت به جایی که پایتون الان در آن قرار دارد.
فرض کنید پوشهٔ کاری فعلی شما این باشد:
C:/Users/Ali/Projects/my_app
و در داخل آن پوشه، فایلی به نام notes.txt باشد. آنوقت کافیست بنویسید:
file = open("notes.txt", "r", encoding="utf-8")اگر فایلی در زیرپوشه باشد:
ساختار:
my_app/data/numbers.txt
مسیر نسبی:
file = open("data/numbers.txt", "r", encoding="utf-8")
اگر باید به پوشهٔ بالاتر بروید، از .. استفاده میشود:
.یعنی پوشهٔ فعلی..یعنی پوشهٔ والد (بالایی)
مثال: فرض کنید اسکریپت شما در:
C:/Users/Ali/Projects/my_app/scripts/app.py
و فایل داده در:
C:/Users/Ali/Projects/my_app/data/info.txt
در اینصورت، از دید فایل app.py، برای رسیدن به info.txt:
file = open("../data/info.txt", "r", encoding="utf-8")مشکل اسلشها: ویندوز در برابر لینوکس / macOS
در ویندوز معمولاً مسیرها با \ (backslash) نوشته میشوند:
C:\Users\Ali\Documents\data.txt
ولی در پایتون، \ داخل رشتهها برای «کاراکترهای ویژه» هم استفاده میشود (مثل \n برای خط جدید). اگر مستقیم اینطور بنویسید:
path = "C:\Users\Ali\Documents\data.txt"
ممکن است پایتون بعضی تکهها را اشتباه تفسیر کند (مثلاً \U شروع یک کد یونیکد است).
راهحلها:
۱. استفاده از `/` بهجای `\`
پایتون روی ویندوز هم / را بهخوبی میفهمد:
path = "C:/Users/Ali/Documents/data.txt"
file = open(path, "r", encoding="utf-8")۲. استفاده از رشتهٔ خام (raw string)
رشتهٔ خام با r شروع میشود و در آن \ تفسیر خاصی نمیشود:
path = r"C:\Users\Ali\Documents\data.txt"
file = open(path, "r", encoding="utf-8")۳. دو بار نوشتن `\`
path = "C:\\Users\\Ali\\Documents\\data.txt"
اما در عمل، سادهترین روشها معمولاً استفاده از / یا r"..." هستند.
پوشهٔ کاری فعلی (Current Working Directory)
وقتی با مسیرهای نسبی کار میکنید، خیلی مهم است بدانید «پایتون الان در کدام پوشه است؟».
برای کار با مسیرها و پوشهٔ کاری، میتوانید از ماژول os استفاده کنید.
دیدن پوشهٔ کاری فعلی
import os
current = os.getcwd()
print(current)خروجی مثلاً میتواند چیزی مثل این باشد:
C:\Users\Ali\Projects\my_app
هر مسیری که نسبی بنویسید، نسبت به همین پوشه تفسیر میشود.
تغییر پوشهٔ کاری فعلی
میتوانید با chdir پوشهٔ کاری را عوض کنید:
import os
os.chdir("C:/Users/Ali/Documents")
print(os.getcwd()) # حالا این پوشه، پوشهٔ کاری فعلی استبعد از این کار، اگر بنویسید:
file = open("notes.txt", "r", encoding="utf-8")
پایتون دنبال notes.txt داخل پوشهٔ C:/Users/Ali/Documents میگردد.
ماژول `os.path` برای کار با مسیرها
ماژول os.path توابعی برای ساختن و دستکاری مسیرها ارائه میدهد. مزیتش این است که روی ویندوز، لینوکس و macOS، خودش فرمت مناسب مسیر را رعایت میکند.
ساختن مسیر با `join`
بهجای اینکه خودتان / یا \ بگذارید، از os.path.join استفاده کنید:
import os
base = "C:/Users/Ali/Documents"
filename = "data.txt"
path = os.path.join(base, filename)
print(path)روی ویندوز ممکن است چیزی مثل این چاپ شود:
C:\Users\Ali\Documents\data.txt
اگر زیرپوشه هم دارید:
path = os.path.join("data", "2024", "sales.csv")
print(path) # مثلا: data/2024/sales.csvگرفتن پوشهٔ یک مسیر (`dirname`) و نام فایل (`basename`)
اگر یک مسیر کامل دارید و میخواهید «فقط پوشه» یا «فقط نام فایل» را بگیرید:
import os
path = "C:/Users/Ali/Documents/data/sales.csv"
folder = os.path.dirname(path)
name = os.path.basename(path)
print("پوشه:", folder) # C:/Users/Ali/Documents/data
print("نام فایل:", name) # sales.csvمسیر کامل از روی مسیر نسبی (`abspath`)
اگر میخواهید ببینید یک مسیر نسبی، دقیقاً به چه مسیر مطلقی تبدیل میشود:
import os
relative = "data/sales.csv"
absolute = os.path.abspath(relative)
print("مسیر نسبی:", relative)
print("مسیر مطلق:", absolute)چک کردن وجود مسیر (`exists`، `isfile`، `isdir`)
وقتی میخواهید با یک مسیر کار کنید، بد نیست اول بررسی کنید آیا وجود دارد یا نه:
import os
path = "data/sales.csv"
print(os.path.exists(path)) # آیا این مسیر وجود دارد؟
print(os.path.isfile(path)) # آیا این مسیر یک فایل است؟
print(os.path.isdir(path)) # آیا این مسیر یک پوشه است؟این کار کمک میکند قبل از باز کردن فایل، از واقعی بودن مسیر مطمئن شوید و خطاهای غیرمنتظره کمتر شوند.
استفاده از `pathlib` (روش مدرنتر)
کتابخانهٔ pathlib یک روش شیءگرا و خواناتر برای کار با مسیرها ارائه میکند. ایدهٔ اصلی این است که بهجای رشته، یک «شیء مسیر» داشته باشید.
ساختن یک مسیر با `Path`
from pathlib import Path
# مسیر نسبی
p = Path("data") / "sales.csv"
print(p) # data/sales.csv
# مسیر مطلق خانۀ کاربر
home = Path.home()
print(home)
در اینجا از عملگر / برای چسباندن بخشهای مسیر استفاده شده است که خواناتر از os.path.join است.
تبدیل به رشته
بعضی تابعها (مثل open) با رشته کار میکنند، پس میتوانید مسیر را به رشته تبدیل کنید:
from pathlib import Path
p = Path("data") / "sales.csv"
print(str(p))
اما open جدیدترها مستقیماً با Path هم کار میکند:
from pathlib import Path
p = Path("data") / "sales.csv"
with p.open("r", encoding="utf-8") as f:
text = f.read()چک کردن وجود مسیر در `pathlib`
مشابه os.path:
from pathlib import Path
p = Path("data") / "sales.csv"
print(p.exists())
print(p.is_file())
print(p.is_dir())مسیر نسبی نسبت به محل فایل پایتون
گاهی میخواهید فایلهای متنی را «نسبت به جایی که خود اسکریپت قرار دارد» آدرسدهی کنید، نه نسبت به پوشهٔ کاری فعلی (که ممکن است هنگام اجرای برنامه، فرق کند).
در بسیاری از موارد میتوانید این الگو را استفاده کنید:
from pathlib import Path
# مسیر فایل فعلی (اسکریپت)
current_file = Path(__file__)
# پوشهای که این فایل در آن است
base_dir = current_file.parent
# فایل data.txt که کنار همین فایل پایتون است
data_path = base_dir / "data.txt"
with data_path.open("r", encoding="utf-8") as f:
text = f.read()این روش کمک میکند برنامهٔ شما مستقل از اینکه از کدام پوشه اجرا میشود، بتواند فایلهای همراه خودش را پیدا کند.
نکات عملی هنگام کار با مسیرها
- اگر برنامهتان روی سیستمهای مختلف (ویندوز، لینوکس، macOS) اجرا میشود، بهتر است از
os.pathیاpathlibاستفاده کنید تا مشکل\و/را نداشته باشید. - برای تمرین، ابتدا با مسیرهای نسبی ساده در همان پوشهٔ پروژه کار کنید: مثلاً
data/input.txt. - وقتی خطای «No such file or directory» میگیرید، معمولاً یعنی:
- پوشهٔ کاری فعلی چیز دیگری است، یا
- مسیر را اشتباه نوشتهاید (حروف کوچک/بزرگ، نام پوشه، پسوند فایل).
- در ویندوز، برای جلوگیری از مشکل با
\، از یکی از این سه روش استفاده کنید: /r"..."- یا
pathlib/os.path.join