مدیریت فایلهای موقت (Temporary Files) یکی از نیازهای اساسی در برنامهنویسی است. چه بخواهید دادههای حجیم را پردازش کنید که در حافظه جا نمیشوند، و چه نیاز به ذخیره موقت خروجی یک دستور داشته باشید، ماژول استاندارد tempfile در پایتون ابزار قدرتمند و ایمنی برای این کار است.
سطح مقدماتی (Beginner Level)
در این سطح با مفاهیم پایه ایجاد فایلها و پوشههای موقت آشنا میشویم. هدف اصلی استفاده از tempfile این است که نگران تداخل نام فایلها یا پاک کردن دستی آنها پس از اتمام کار نباشیم.
۱. ساخت فایل موقت ساده (TemporaryFile)
کلاس TemporaryFile سادهترین روش برای ساخت یک فایل موقت است. این فایل نامی در سیستمفایل ندارد (یا نام آن پنهان است) و به محض بسته شدن، به صورت خودکار حذف میشود.
مثال ۱: نوشتن و خواندن ساده
در این مثال یک فایل موقت میسازیم، متنی در آن مینویسیم و سپس آن را میخوانیم. دقت کنید که فایل باید در حالت باینری (w+b) یا متنی (w+t) باز شود.
مثال ۲: استفاده از دادههای باینری
گاهی اوقات نیاز دارید دادههای باینری (مانند یک تصویر دانلودی) را موقتا ذخیره کنید.
۲. فایل موقت نامدار (NamedTemporaryFile)
برخلاف TemporaryFile، کلاس NamedTemporaryFile فایلی میسازد که دارای نام واقعی در سیستمفایل است. این قابلیت زمانی حیاتی است که میخواهید آدرس فایل را به یک برنامه یا کتابخانه دیگر بدهید تا از آن استفاده کند.
مثال ۱: دسترسی به نام فایل
مثال ۲: تابعی برای پردازش فایل نامدار (Snippet)
این کد نشان میدهد چگونه یک تابع میتواند مسیر فایل موقت را دریافت کند (این کد به تنهایی اجرا نمیشود).
# Static Code: Function requiring a file path
def process_external_data(file_path):
"""
فرض کنید این تابع مربوط به یک کتابخانه خارجی است
که فقط مسیر فایل را قبول میکند.
"""
with open(file_path, 'r') as f:
data = f.read()
return len(data)
۳. دایرکتوری موقت (TemporaryDirectory)
گاهی به جای یک فایل، به یک پوشه کامل نیاز دارید تا چندین فایل را در آن ایجاد کنید. TemporaryDirectory یک پوشه میسازد و پس از اتمام کار، پوشه و تمام محتویات آن را پاک میکند.
مثال ۱: ساخت پوشه و فایلهای درونی
سطح پیشرفته (Professional Level)
در سطح حرفهای، ماژول tempfile نکات ظریفی در مورد امنیت، مدیریت حافظه (RAM) و تفاوت رفتار در سیستمعاملهای مختلف (مانند Windows vs Linux) دارد.
۱. بهینهسازی حافظه با SpooledTemporaryFile
این کلاس رفتاری دوگانه دارد. تا زمانی که حجم دادهها از یک حد مشخص (max_size) کمتر باشد، دادهها را در RAM نگه میدارد (سرعت بالا). اگر حجم داده بیشتر شد، به صورت خودکار آن را به دیسک منتقل میکند (جلوگیری از پر شدن رم).
مثال ۱: بررسی مکانیزم Rollover
در این مثال میبینیم چگونه فایل ابتدا در حافظه است و سپس به دیسک میرود.
مثال ۲: الگوی طراحی برای پردازشهای سنگین
استفاده از این کلاس برای آپلود فایلهای حجیم در وبسرورها بسیار رایج است.
# Static Code: Web Server Upload Handler Logic
def handle_large_upload(request_stream):
# تا ۱۰ مگابایت در رم، بیشتر از آن روی دیسک
with tempfile.SpooledTemporaryFile(max_size=10 * 1024 * 1024) as temp:
for chunk in request_stream:
temp.write(chunk)
temp.seek(0)
process_data(temp)
۲. امنیت و mkstemp (سطح پایین)
توابع سطح بالا مثل NamedTemporaryFile راحت هستند، اما mkstemp امنترین روش برای ساخت فایل موقت است. این تابع یک توصیفگر فایل (file descriptor) سطح پایین سیستمعامل و یک مسیر مطلق برمیگرداند.
نکته مهم: در mkstemp، فایل به صورت خودکار پاک نمیشود و مسئولیت بستن و پاک کردن آن با برنامهنویس است.
مثال ۱: استفاده صحیح از mkstemp
این الگو از شرایط مسابقه (Race Condition) در نامگذاری فایل جلوگیری میکند.
۳. چالشهای کراس پلتفرم (Windows vs Unix)
در سیستمعامل ویندوز، نمیتوانید فایلی که باز است را مجدداً باز کنید (File Locking). این یعنی اگر با NamedTemporaryFile فایلی بسازید و هنوز close() نشده باشد، نمیتوانید با یک open() دیگر آن را بخوانید.
راه حل:
در ویندوز معمولاً باید delete=False قرار دهید، فایل را ببندید، آن را باز/پردازش کنید و در نهایت دستی با os.unlink پاک کنید.
مثال ۱: شبیهسازی مشکل و راه حل (منطق)
# Static Code: Windows Safe Pattern
import tempfile
import os
def windows_safe_temp():
# مرحله ۱: ساخت فایل اما جلوگیری از حذف خودکار
temp = tempfile.NamedTemporaryFile(delete=False, mode='w')
try:
temp.write("Data")
temp_name = temp.name
temp.close() # بستن فایل بسیار حیاتی است
# مرحله ۲: باز کردن مجدد (اکنون در ویندوز هم کار میکند)
with open(temp_name, 'r') as f:
print(f.read())
finally:
# مرحله ۳: حذف دستی
if os.path.exists(temp_name):
os.remove(temp_name)
مثال ۲: تشخیص دایرکتوریهای پیشفرض سیستم
پایتون برای ذخیره فایلهای موقت مکانهای مختلفی را جستجو میکند. دانستن این مکانها برای دیباگ کردن مهم است.
