-
پنجشنبه, ۱۹ فروردين ۱۴۰۰، ۰۱:۳۴ ق.ظ
-
۶۲۷۹
![](http://bayanbox.ir/view/9045859970699306191/csv-file.png)
سلام دوستان :)
امروز میخواستم پروژه مرتب کردن معدل ها از فایل csv رو نشون بدم
شرح این پروژه اینه:
در این پروژه شما باید برنامه ایی بنویسید که نمرات افراد مختلف را از یک فایل csv بخواند ومحاسبات زیر را روی نمرات انجام داده و مقادیر حاصل را در یک فایل ذخیره کند
در این پروژه شما ۵ task مختلف را باید پیاده سازی کنید.
1-معدل هر فرد را محاسبه کند و همراه با نام هر فرد ذخیره کند، ترتیب خروجی اسامی باید دقیقا مساوی ترتیب فایل ورودی باشد.
2-معدل ها را به ترتیب صعودی همراه با نام هر فرد ذخیره کند.
3-سه معدل برتر را با نام هر فرد ذخیره کند.
4-سه معدل پایین را بدون نام هر فرد ذخیره کند.
5-میانگین معدل ها را محاسبه و ذخیره کند.
خب اینم از شرح پروژه
فقط یک نکته ای هست که پایتون نمیتونه ترتیب ورود اطلاعات به دیکشنری رو به یاد بیاره
برای همین میتونیم از OrderedDict در کتابخانه collections استفاده کنیم D:
برای میانگین گرفتن هم میتونیم از متد mean در کتابخانه statistics استفاده کنیم
اول از همه ماژول هامون رو ایمپورت می کنیم
import csv from statistics import mean from collections import OrderedDict
بعد باید یک تابع درست کنیم برای اینکه فایلمون رو باز کنه و از نمره ها میانگین بگیره.
def calculate_averages(input_file_name, output_file_name): averages = OrderedDict() with open(input_file_name) as csv_file: csvfile = csv.reader(csv_file, delimiter=',') for row in csvfile: scores = [] for i in range(1, len(row)): scores.append (float(row[i])) avg = mean(scores) averages [row[0]] = avg with open (output_file_name, 'w') as out: count = 0 for person in averages: count += 1 if count == 1: out.write(person+ ","+ str(averages[person])) else: out.write("\n"+ person+ ","+ str(averages[person]))
خب اول یک OrderedDict درست می کنیم و فایل csv مون رو باز میکنیم اینجا یک حلقه داریم که میاد مقادیر رو میخونه و میانگینشون رو میگیره و توی یک لیست ذخیره میکنه بعدش یک فایل csv می سازیم و نام ها و میانگین نمرات هر نفر رو توش ذخیره میکنیم
بعدش یک تابع تعریف میکنیم که معدل ها رو از بزرگ به کوچیک توی فایلمون ذخیره کنه اینم شبیه همون بالاییه.
lambda همون تابع موقته :)
def calculate_sorted_averages(input_file_name, output_file_name): averages = {} with open(input_file_name) as csv_file: csvfile = csv.reader(csv_file, delimiter=',') for row in csvfile: scores = [] for i in range(1, len(row)): scores.append (float(row[i])) avg = mean(scores) averages [row[0]] = avg averages_ord = OrderedDict (sorted (averages.items(), key=lambda x:(x[1], x[0]))) with open (output_file_name, 'w') as out: count = 0 for person in averages_ord: count += 1 if count == 1: out.write(person+ ","+ str(averages_ord[person])) else: out.write("\n"+ person+ ","+ str(averages_ord[person]))
خب حالا باید سه نفر برتر رو از توی لیست پیدا کنیم
def calculate_three_best(input_file_name, output_file_name): averages = {} with open(input_file_name) as csv_file: csvfile = csv.reader(csv_file, delimiter=',') for row in csvfile: scores = [] for i in range(1, len(row)): scores.append (float(row[i])) avg = mean(scores) averages [row[0]] = avg averages_ord = OrderedDict (sorted (averages.items(), key=lambda x:(-x[1], x[0]))) with open (output_file_name, 'w') as out: best = [] for i in range (3): best_avg = averages_ord.popitem (last=False) best.append (best_avg) out.write (best[0][0]+","+str(best[0][1])+"\n") out.write (best[1][0]+","+str(best[1][1])+"\n") out.write (best[2][0]+","+str(best[2][1]))
بعدش باید سه نفر آخر رو پیدا کنیم
def calculate_three_worst(input_file_name, output_file_name): averages = {} with open(input_file_name) as csv_file: csvfile = csv.reader(csv_file, delimiter=',') for row in csvfile: scores = [] for i in range(1, len(row)): scores.append (float(row[i])) avg = mean(scores) averages [row[0]] = avg averages_ord = OrderedDict (sorted (averages.items(), key=lambda x:(x[1], x[0]))) with open (output_file_name, 'w') as out: worst = [] for i in range (3): worst_avg = averages_ord.popitem (last=False) worst.append (worst_avg) out.write (str(worst[0][1])+"\n") out.write (str(worst[1][1])+"\n") out.write (str(worst[2][1]))
در نهایت هم باید میانگین تمام نمرات رو حساب کنیم
def calculate_average_of_averages(input_file_name, output_file_name): averages = {} with open(input_file_name) as csv_file: csvfile = csv.reader(csv_file, delimiter=',') for row in csvfile: scores = [] for i in range(1, len(row)): scores.append (float(row[i])) avg = mean(scores) averages [row[0]] = avg averages_ord = OrderedDict (sorted (averages.items(), key=lambda x:(x[1], x[0]))) SUM = 0 count = 0 for average in averages_ord: count += 1 SUM += float(averages_ord[average]) avg_avg = SUM/count with open (output_file_name, 'w') as out: out.write(str(avg_avg))
این هم کد کامل
import csv from statistics import mean from collections import OrderedDict def calculate_averages(input_file_name, output_file_name): averages = OrderedDict() with open(input_file_name) as csv_file: csvfile = csv.reader(csv_file, delimiter=',') for row in csvfile: scores = [] for i in range(1, len(row)): scores.append (float(row[i])) avg = mean(scores) averages [row[0]] = avg with open (output_file_name, 'w') as out: count = 0 for person in averages: count += 1 if count == 1: out.write(person+ ","+ str(averages[person])) else: out.write("\n"+ person+ ","+ str(averages[person])) def calculate_sorted_averages(input_file_name, output_file_name): averages = {} with open(input_file_name) as csv_file: csvfile = csv.reader(csv_file, delimiter=',') for row in csvfile: scores = [] for i in range(1, len(row)): scores.append (float(row[i])) avg = mean(scores) averages [row[0]] = avg averages_ord = OrderedDict (sorted (averages.items(), key=lambda x:(x[1], x[0]))) with open (output_file_name, 'w') as out: count = 0 for person in averages_ord: count += 1 if count == 1: out.write(person+ ","+ str(averages_ord[person])) else: out.write("\n"+ person+ ","+ str(averages_ord[person])) def calculate_three_best(input_file_name, output_file_name): averages = {} with open(input_file_name) as csv_file: csvfile = csv.reader(csv_file, delimiter=',') for row in csvfile: scores = [] for i in range(1, len(row)): scores.append (float(row[i])) avg = mean(scores) averages [row[0]] = avg averages_ord = OrderedDict (sorted (averages.items(), key=lambda x:(-x[1], x[0]))) with open (output_file_name, 'w') as out: best = [] for i in range (3): best_avg = averages_ord.popitem (last=False) best.append (best_avg) out.write (best[0][0]+","+str(best[0][1])+"\n") out.write (best[1][0]+","+str(best[1][1])+"\n") out.write (best[2][0]+","+str(best[2][1])) def calculate_three_worst(input_file_name, output_file_name): averages = {} with open(input_file_name) as csv_file: csvfile = csv.reader(csv_file, delimiter=',') for row in csvfile: scores = [] for i in range(1, len(row)): scores.append (float(row[i])) avg = mean(scores) averages [row[0]] = avg averages_ord = OrderedDict (sorted (averages.items(), key=lambda x:(x[1], x[0]))) with open (output_file_name, 'w') as out: worst = [] for i in range (3): worst_avg = averages_ord.popitem (last=False) worst.append (worst_avg) out.write (str(worst[0][1])+"\n") out.write (str(worst[1][1])+"\n") out.write (str(worst[2][1])) def calculate_average_of_averages(input_file_name, output_file_name): averages = {} with open(input_file_name) as csv_file: csvfile = csv.reader(csv_file, delimiter=',') for row in csvfile: scores = [] for i in range(1, len(row)): scores.append (float(row[i])) avg = mean(scores) averages [row[0]] = avg averages_ord = OrderedDict (sorted (averages.items(), key=lambda x:(x[1], x[0]))) SUM = 0 count = 0 for average in averages_ord: count += 1 SUM += float(averages_ord[average]) avg_avg = SUM/count with open (output_file_name, 'w') as out: out.write(str(avg_avg))
ویرایش:
بخاطر درخواست های زیاد دوستان برای ارسال فایل زیپ، میتونین فایل زیپ رو از همینجا دانلود کنین:
امیدوارم براتون مفید بوده باشه D: