ستون CSV
در این تمرین، از شما میخواهیم برنامهای بنویسید که با استفاده از قابلیتهای پایتون برای کار با فایلها و رشتهها، یک فایل CSV را بخواند، آن را پردازش کند و نتیجهی تغییریافته را در یک فایل CSV جدید ذخیره نماید.
فایل CSV چیست؟
فرمت CSV (Comma Separated Values) یکی از رایجترین و سادهترین فرمتها برای نمایش دادههای جدولی است. هر سطر در فایل CSV یک ردیف از جدول داده را نشان میدهد. مقادیر (خانههای جدول) در هر سطر با یک کاراکتر جداکننده (معمولاً کاما ,) از هم تفکیک میشوند.
مثال:
1, 14, 43, 1
241, 17, 41, 2
492, 12, 32, 3
231, 14, 29, 4
- فاصلهی بعد از کاما برای خوانایی بیشتر است و در پردازش معمولاً نادیده گرفته میشود. مهم وجود کاراکتر جداکننده (کاما) است.
- فایلهای CSV را میتوان با نرمافزارهای spreadsheet مانند Excel نیز باز کرد.
تابع calculate_sums
برنامهی شما باید شامل یک تابع به نام calculate_sums باشد که بهعنوان ورودی، مسیر فایل CSV اصلی را دریافت میکند. سپس، مجموع هر سطر را در انتهای آن سطر اضافه میکند و در فایل جدیدی ذخیره میکند.
این تابع نباید مقداری را return کند؛ بلکه باید نتیجهی پردازش (جدول جدید با ستون مجموع اضافهشده) را در یک فایل جدید با نام result.csv در همان مسیری که برنامه اجرا میشود، ذخیره کند.
برای حل این تمرین، تنها مجاز به استفاده از قابلیتهای استاندارد پایتون برای کار با فایلها و پردازش رشتهها هستید. استفاده از کتابخانههای خارجی مانند pandas یا حتی ماژول تخصصی csv پایتون مجاز نیست. هدف این تمرین، کار مستقیم با فایل و رشته است.
💡 راهنمایی ۱: شیوهی خواندن فایل
برای خواندن فایل بهصورت خطبهخط میتوانید تابع تولیدکنندهی زیر را به کدتان بیفزایید.
def parse_csv(path: str):
with open(path) as csv:
for row in csv.readlines():
yield row.strip().split(',')
تابع
parse_csvباید در کنار تابعcalculate_sumsقرار گیرد، نه درون آن.
سپس میتوانید از این تابع درون تابع calculate_sums استفاده کنید. هر خروجی این تولیدکننده، یک لیست از رشتههای اعداد درون فایل CSV است؛ پس فراموش نکنید که پیش از انجام محاسبات، آنها را به عدد تبدیل کنید.
همچنین دقت داشته باشید که تابع parse_csv یک تولیدکننده است، بنابراین باید در یک حلقهی for به کار گرفته شود.
🎯 مثال
ورودی
3, 3, 1, 1, 1, 1, 1
1, 1, 4, 5, 6, 7, 8
1, 5, 6, 7, 4, 3, 1
(فایل: input.csv)
خروجی
3, 3, 1, 1, 1, 1, 1, 11
1, 1, 4, 5, 6, 7, 8, 32
1, 5, 6, 7, 4, 3, 1, 27
(فایل: result.csv)
همانطور که در مثال ورودی مشاهده میکنید، این جدول ۳ سطر و ۷ ستون دارد. پس از پردازش، باید ستون هشتمی اضافه شود که شامل مجموع اعداد هر سطر است.
💡 چالشهای حل تمرین
چگونه لیست اعداد را به یک سطر در فرمت CSV تبدیل کنم؟
پس از محاسبهی مجموع هر سطر و داشتن لیست جدیدی از اعداد برای آن سطر (شامل اعداد اصلی و مجموع)، باید این لیست را به فرمت رشتهای که با کاما جدا شدهاست تبدیل کنید تا بتوانید آن را در فایل خروجی بنویسید. میتوانید از متد str() و اتصال رشتهها (با استفاده از متد .join()) استفاده کنید.
چگونه در فایل result.csv بنویسم؟
برای نوشتن در فایل خروجی (result.csv)، باید آن را با حالت مناسب باز کنید. استفاده از حالت 'w' برای نوشتن در ابتدای فایل و پاک کردن محتوای قبلی مناسب است.
برای هر فایل ورودی، باید تمام عملیات نوشتن را با یک بار باز کردن فایل result.csv انجام دهید؛ بنابراین نیازی به استفاده از حالت
'a'نیست. این حالت میتواند در داوری که تابع شما بهازای چندین فایل ورودی تست میشود، مشکل ایجاد کند؛ زیرا نتایج تمام ورودیها در ادامهی یکدیگر نوشته خواهند شد.
جوابی که دریافت میکنم کاملا درست است ولی هیچکدام از تستها پاس نمیشوند.
- مطمئن شوید که فایل خروجی شما دقیقاً با نام
result.csvو در همان مسیری که برنامهی شما اجرا میشود ذخیره شده است.- تابع
calculate_sumsنباید مقداری راreturnکند و صرفاً باید فایل خروجی را بسازد.- هنگام نوشتن هر سطر در فایل result.csv، پس از آخرین عدد (که مجموع سطر است)، نباید کاما (,) اضافه کنید.
- ساختار هر سطر باید دقیقاً مشابه مثال خروجی باشد: مقادیر با کاما جدا شده و سپس کاراکتر خط جدید (\n).
💡 راهنمایی نهایی
ساختار کلی کد به این شکل است:
def parse_csv(path):
with open(path) as csv:
for row in csv.readlines():
yield row.strip().split(',')
def calculate_sums(input_path):
with open("result.csv", 'w') as out:
for row in parse_csv(input_path):
numbers = [int(x.strip()) for x in row if x.strip()]
row_sum = sum(numbers)
numbers.append(row_sum)
row_str = ', '.join(map(str, numbers))
out.write(row_str + '\n')
parse_csv← تولیدکنندهای که هر سطر CSV را به لیستی از رشتهها تبدیل میکند.int(x.strip())← تبدیل هر رشته به عدد صحیح (حذف فاصلهها).sum(numbers)← محاسبهی مجموع اعداد سطر.numbers.append(row_sum)← اضافه کردن مجموع به انتهای لیست.', '.join(map(str, numbers))← تبدیل لیست به رشته با جداکنندهی کاما و فاصله.out.write(row_str + '\n')← نوشتن سطر در فایل خروجی.
✅ این تمرین را در ویرایشگر خود پیادهسازی کنید. به یاد داشته باشید که تابع
calculate_sumsنباید مقداری را برگرداند و فقط فایلresult.csvرا ایجاد کند.
نمونهها
3, 3, 1, 1, 1, 1, 1 1, 1, 4, 5, 6, 7, 8 1, 5, 6, 7, 4, 3, 1
3, 3, 1, 1, 1, 1, 1, 11 1, 1, 4, 5, 6, 7, 8, 32 1, 5, 6, 7, 4, 3, 1, 27
10, 20, 30
10, 20, 30, 60
1, 1 2, 2 3, 3
1, 1, 2 2, 2, 4 3, 3, 6
-5, 5, 0
-5, 5, 0, 0
برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.
ورود