سطح مقدماتی (Beginner Level)
ماژول tarfile در پایتون به شما امکان میدهد تا فایلهای آرشیو با فرمت tar را بخوانید و بنویسید. این فرمت در سیستمعاملهای لینوکس و یونیکس بسیار رایج است و قابلیت ترکیب با الگوریتمهای فشردهسازی مانند gzip و bz2 را دارد.
۱. ساخت یک آرشیو ساده (Archiving)
برای ساخت یک فایل tar، از کلاس tarfile.open() با حالت (mode) نوشتن 'w' استفاده میکنیم. متد add() فایلها را به آرشیو اضافه میکند.
مثال ۱: ساخت یک فایل tar بدون فشردهسازی
در این مثال یک فایل متنی میسازیم و سپس آن را درون یک آرشیو sample.tar قرار میدهیم.
مثال ۲: ساخت آرشیو فشرده (Gzip)
برای کاهش حجم فایلها، میتوانیم از حالت 'w:gz' استفاده کنیم.
import tarfile
# Static snippet: Creating a .tar.gz file
# mode='w:gz' uses gzip compression
with tarfile.open("backup.tar.gz", "w:gz") as tar:
tar.add("data_folder", arcname="data")
۲. استخراج فایلها (Extracting)
برای باز کردن و استخراج محتویات، از حالت خواندن 'r' (یا 'r:gz') و متد extractall() استفاده میشود.
مثال ۱: استخراج کامل آرشیو
کد زیر تمام محتویات فایل tar را در پوشه جاری استخراج میکند.
مثال ۲: استخراج یک فایل خاص
اگر فقط به یک فایل نیاز دارید، از extract() استفاده کنید.
import tarfile
# Static snippet: Extracting a single file
with tarfile.open("backup.tar.gz", "r:gz") as tar:
# Extract only 'config.json'
tar.extract("config.json", path="./restored_configs")
سطح پیشرفته (Professional Level)
در سطح حرفهای، با مدیریت متادیتای فایلها (TarInfo)، استریم کردن، فیلترهای امنیتی و تغییر ویژگیهای فایل قبل از آرشیو کردن سروکار داریم.
۱. کار با کلاس TarInfo و تغییر متادیتا
شیء TarInfo اطلاعات فایل (مثل نام، سایز، دسترسیها و زمان تغییر) را نگهداری میکند. شما میتوانید قبل از افزودن فایل به آرشیو، این اطلاعات را تغییر دهید (مثلاً حذف نام کاربری برای حفظ حریم خصوصی).
مثال ۱: تغییر نام و دسترسی فایل در آرشیو (Filter)
در این مثال از یک تابع filter استفاده میکنیم تا متادیتای فایل را قبل از نوشته شدن در آرشیو تغییر دهیم.
۲. خواندن آرشیو بدون استخراج (Inspection)
گاهی لازم است بدون باز کردن آرشیو، محتویات آن را بررسی کنید یا به صورت Stream بخوانید. این کار برای فایلهای حجیم بسیار حیاتی است.
مثال ۱: پیمایش اعضا (Members)
استفاده از getmembers() لیستی از اشیاء TarInfo برمیگرداند.
import tarfile
# Static: Inspecting archive contents
def inspect_tar(filename):
with tarfile.open(filename, "r") as tar:
for member in tar.getmembers():
print(f"Name: {member.name}, Size: {member.size} bytes")
if member.isdir():
print(" -> This is a directory")
مثال ۲: خواندن محتوا به صورت Stream
میتوانید یک فایل را مستقیماً از داخل آرشیو به عنوان یک شیء فایل (File Object) باز کنید.
۳. امنیت و مدیریت خطرات (TarBombs)
یکی از خطرات استخراج فایلهای ناشناس، "TarBomb" یا حملات پیمایش مسیر (Directory Traversal) است (مثلاً فایلی که مسیرش ../../etc/passwd باشد).
در نسخههای جدید پایتون (3.12+)، پارامتر filter='data' برای جلوگیری از این حملات اضافه شده است.
مثال ۱: استخراج امن (Safe Extraction)
import tarfile
# Static: Safe extraction pattern for modern Python
def safe_extract(filename):
with tarfile.open(filename, "r") as tar:
# filter='data' blocks extraction to absolute paths or parent directories
try:
tar.extractall(path="./safe_dir", filter='data')
print("Safe extraction successful.")
except Exception as e:
print(f"Security blocked unsafe file: {e}")
۴. افزودن فایل به آرشیو فشرده (محدودیتها)
نکته مهم فنی: شما نمیتوانید به یک فایل tar که فشرده شده است (مثلاً .tar.gz) فایلی اضافه کنید (Append). حالت 'a' (الحاق) فقط برای فایلهای tar خام (بدون فشردهسازی) کار میکند.
مثال ۱: الحاق به فایل Tar خام
