نظام تسجيل الطلاب - برمجة مشروع تخرج - بايثون

output
canvas
info

نظام تسجيل الطلاب - برمجة مشروع تخرج - بايثون

بايثون اون لاين نظام تسجيل الطلاب بايثون باستخدام مكتبة json البسيطة وبعض دوال بايثون الرائعة أفكار مشاريع بايثون للمبتدئين.

في لغات البرمجة عموماً تحتاج لتخزين البيانات لادارتها لاحقا واجراء التعديلات عليها اذا لزم الامر ليس فقط لادارة الطلاب او المخازن ولكن البيانات المخزنة هي ذاكرة برنامجك او نظامك.

ماذا سوف نتعلم في هذا الدرس:

  1. برمجة سطر اوامر خاص لادارة النظام
  2. اضافة الطلاب
  3. تعديل الطلاب
  4. حذف الطلاب
  5. بحث عن طالب

ملاحظة هذا النظام سوف يتم ادارتة بالكامل عبر الـ terminal او command line او سطر الاوامر بمعني انه خالي تماما من الواجهات الرسومية GUI.

سوف نتعلم في هذا الدرس كيفية انشاء الملفات في بايثون، وتحويلها الي مستودع لنصوص json ، واستخدامها لحفظ بيانات سكربت بايثون ،واجراء عمليات متنوعة علي البيانات مثل: اضافة، تعديل، بحث، حذف.

سوف نتعلم ايضاً كيفية التحكم في سكربت بايثون من خلال سطر اوامر خاص ، ونحن من سوف يحدد تلك الاوامر ، وهذا بدلاً من اجراء تعديلات متكررة علي الكود واعادة التشغيل.

ليس الهدف من هذا الدرس هو برمجة سكربت بايثون لحفظ بيانات الطلاب فقط ، وانما الهدف هو كيفية ادارة البيانات ، وتقديم برنامج بايثون يستطيع المستخدم العادي استخدامه بسهوله مع بعض الارشادات التي سوف نتركها له في شاشة البرنامج.

انشاء ملف json وربطة مع سكربت بايثون

import json

dfile = 'stud.json'
try:
    f = open(dfile, 'r')
except:
    newFile = {"students" : []}
    jloads = json.dumps(newFile)
    f = open(dfile, 'w')
    f.write(jloads)
    f.close()
    print('file created')

studFile = json.loads(open(dfile, 'r').read())

في الكود السابق قمنا باستدعاء مكتبة json لتحويل python object الي json string ، والعكس. ثم قمنا بالتصريح عن متغير dfile ، وقيمتة اسم الملف الذي سوف نحفظ به بيانات السكربت او بيانات الطلاب.

ثم بعد ذلك استخدمنا try ، except الخاصة بتتبع الاخطاء، وتفاديها للتحقق من وجود الملف وانشائة ان لم يكن موجود.

عند محاولة (try) فتح الملف dfile اذا حدثت مشكلة عدم وجود ملف سوف يتم الانتقال الي كتلة except ، والتي بداخلها قمنا بالتصريح عن متغير جديد باسم newFile ، وقيمتة تساوي قاموس (dictionary) مع مفتاح واحد students وقيمتة مصفوفة او قائمة فارغة (array or list).

بعد ان تم انشاء كائن بايثون newFile قومنا بتحويلة الي نص جسون من خلال json.dumps ثم نقوم بفتح ملف جديد بنفس اسم dfile ، ونقوم بكتابة قيمة متغير jloads بداخلة ثم نغلق الملف ، ونطبع رسالة تم انشاء الملف.

بعد التحقق من الملف او انشاء ملف جديد يتم التصريح عن متغير studFile ، والذي سوف يحتوي علي كائن بايثون dictionary من خلال فتح وتحويل محتوي الملف الي python object.

جميع العمليات من اضافة وبحث وتعديل وحذف سوف تتم علي متغير studFile قبل حفظ التعديلات في الملف dfile.

دالة تحديث البيانات

هذه الدالة سوف تكون خاصة بحفظ التعديلات التي نجريها علي البيانات داخل الملف من خلال اعادة كتابة ملف json.

def savedata():
    jdumps = json.dumps(studFile)
    f = open(dfile, 'w')
    f.write(jdumps)
    f.close()

نقوم بالتصريح عن دالة جديدة باسم savedata لمزيد من المعلومات عن الدوال في بايثون راجع درس مقدمة عن الدوال

داخل دالة savedata تم التصريح عن متغير jdumps وقيمته تساوي تحويل كائن بايثون studFile الي نص json حتي نتمكن من حفظة في شكل نص داخل الملف dfile.

علي السطور التالي تم فتح الملف في متغير f ثم تم كتابة محتوي jdumps الي الملف وتم اغلاق الملف.

الان في كل مرة يتم الاتصال بالدالة savedata سوف يتم تحويل كائن الطلاب studFile الي نص json واعادة كتابة الملف dfile مع البيانات الجديدة ، وهذا ما سوف يحدث فقط مع العمليات التي تستدعي تعديل علي الملف مثل: الاضافة والتعديل والحذف.

دالة الطباعة الخاصة

هذة الدالة سوف تكون خاصة بطباعة البيانات للمستخدم بدلاً من تكرار اوامر الطباعة كثيراً في ملف بايثون ، وهذا لاننا سوف نقوم بطباعة البيانات في دالة الاضافة ، والبحث والتعديل ، ....

def customPrint(id,std):
    print('''
    id: %s
    first name: %s
    last_name: %s
    score: %s
    ------''' % (id, std["first_name"], std["last_name"], std["score"]))

التصريح عن دالة customPrint مع براميتر id و std نوع البيانات داخل متغير std سوف تكون قاموس مثل الشكل التالي:

{"first_name":"brmgha","last_name":"com","score":"10"}

داخل الدالة customPrint سوف نقوم بطباعة بيانات الطالب باستخدام احدي اساليب تنسيق الاخراج في بايثون.

دالة اضافة بيانات جديدة

في هذه الدالة سوف نحصل علي البيانات الجديدة من المستخدم ، واضافتها الي كائن الطلاب studFile.

def addNew():
    studObj = {
        "first_name": "",
        "last_name": "",
        "score": ""
        }
        
    for k, v in studObj.items():
        studObj[k] = input(k + ': ')
    studFile["students"].append(studObj)
    savedata()
    customPrint(len(studFile["students"]) + 1,studObj)

بعد التصريح عن دالة addNew ، قمنا بانشاء كائن طالب او شكل للبيانات المطلوبة يمكنك اعتبارة نموذج لتعبئة البيانات - باسم studObj نوع البيانات قاموس يحتوي علي ثلاث مفاتيح هي:

  1. first_name
  2. last_name
  3. score

ويمكنك اضافة المزيد من المفاتيح الي كائن الطالب لان الجزء التالي من الكود سوف يقوم بمهمة طلب البيانات من خلال مفتاح تلو الاخر كالتالي:

for k, v in studObj.items():
        studObj[k] = input(k + ': ')

ننشي حلقة تكرار علي قيم ومفاتيح كائن الطلاب studObj ومن خلال المفتاح نطلب البيانات من المستخدم ، وتعديل قيمة المفتاح حتي الوصول لاخر مفتاح في كائن الطالب.

بعد تعبئة جميع المفاتيح المطلوبة نقوم باضافة كائن الطالب studObj الي القائمة الموجودة في قاموس الطلاب studFile كالتالي:

studFile["students"].append(studObj)

ثم الاتصال بالدالة savedata لتحديث بيانات الملف dfile ، والاتصال بالدالة customPrint لطباعة بيانات الطالب الجديد.

دالة تعديل البيانات

هذه الدالة سوف تكون مسؤلة عن تعديل بيانات الطالب من خلال رقم الفهرس او id.

def editStud(sid):
    try:
        std = studFile["students"][sid]
        print(std)
        for k, v in std.items():
            newdata = input('old %s : %s : new: ' % (k,v))
            if newdata != "":
                std[k] = newdata
        savedata()
        customPrint(sid, std)
    except:
        print('student not found')

في البداية نقوم بالتصريح عن دالة باسم editStud مع براميتر sid ، وسوف يكون نوع رقمي integer .

داخل الدالة سوف نستخدم try except لتفادي خطا  IndexError: list index out of range  اذا كان رقم الطالب غير موجود في القائمة يتم طباعة جملة لم يتم العثور علية.

اذا كان الطالب موجود فان السطر التالي سوف يعمل بلا اي مشاكل:

std = studFile["students"][sid]

ومن خلال المتغير std يمكننا تعديل البيانات الخاصة بهذا الطالب داخل كائن الطلاب studFile.

ثم عمل حلقة تكرار for مثل الحلقة التي استخدمناها في دالة اضافة بيانات جديدة addNew ، ولكن مع بعض التعديلات مثل استخدام المفتاح، والقيمة الحالية للمفتاح في الطباعة.

ثم الاتصال بدالة حفظ البيانات savedata و دالة الطباعة الخاصة customPrint.

دالة عرض الكل

هذة الدالة سوف تكون خاصة بطباعة كل الطلاب الموجودين في كائن الطلاب او في ملف json.

def viewAll():
    for i in range(len(studFile["students"])):
        std = studFile["students"][i]
        customPrint(i, std)

نقوم بالتصريح عن دالة جديدة باسم viewAll ، وداخل الدالة نقوم بعمل حلقة تكرار for علي طول القائمة students في كائن studFile.

ومن خلال متغير حلقة التكرار ( i ) نقوم بالحصول علي قاموس الطالب الحالي وارسالة الي دالة الطباعة الخاصة customPrint.

دالة البحث

سوف نستخدم دالة search للبحث عن البيانات او الطالب داخل كائن الطلاب studFile ، وحتي الان هي للبحث في البيانات داخل مفتاح first_name , last_name في كائن الطالب std.

def search(x):
    for i in range(len(studFile["students"])):
            std = studFile["students"][i]
            if len(x) < 2:
                if x[0] == std["first_name"]:
                    customPrint(i, std)
            elif len(x) >= 2:
                if x[0] == std["first_name"] and x[1] == std["last_name"]:
                    customPrint(i, std)

في البداية صرحنا عن دالة search مع براميتر واحد وهو ( x ) ، وسوف يكون من نوع القائمة list عدد عناصرها عنصر واحد او عنصرين.

مثال علي شكل البيانات داخل متغير x:

["ahmed", "mohamed"]

داخل الدالة search قمنا بعمل تكرار علي كائن الطلاب studFile ؛ حتي يتحقق الشرط الاول او الشرط الثاني ، والشروط الداخلية.

الشرط الاول:

 

if len(x) < 2:
    # x = ["ahmed"]
    if x[0] == std["first_name"]:
        customPrint(i, std)

اذا كان طول x اقل من 2 هذا يعني ان المستخدم ادخل الاسم الاول فقط لذلك سوف نتحقق من البيانات في مفتاح first_name فقط.

الشرط الثاني:

elif len(x) >= 2:
    if x[0] == std["first_name"] and x[1] == std["last_name"]:
        customPrint(i, std)

اذا كان طول x اكبر من او يساوي 2 فهذا يعني ان المستخدم ادخل الاسم الاول ، والاسم الثاني ، وسوف نتحقق من البيانات في مفتاح first_name ، last_name.

دالة الحذف

سوف نستخدم دالة الحذف لنقوم بحذف بيانات احد الطلاب من كائن الطلاب studFile.

def remove(sid):
    std = studFile["students"][sid]
    customPrint(sid, std)
    confirm = input("type y to delete or c to cancel: ")
    if confirm == 'y':
        del studFile["students"][sid]
        savedata()
        print("[*] student {} {} has been deleted".format(std['first_name'], std['last_name']))

يتم التصريح عن الدالة remove مع براميتر واحد وهو sid وسوف يكون رقم الفهرس للطالب (id) داخل ملف الطلاب او كائن الطلاب studFile.

في البداية تم استخراج بيانات الطالب، وطباعتها ، وطلب التاكيد من المستخدم بارسال حرف y للتاكيد او c للالغاء ، ولكن علي كل حال جميع حروف الكيبورد قادرة علي الغاء الحذف ما عدا حرف y .

سوف نقوم بالتحقق من قيمة متغير confirm للتاكد من ان المستخدم ادخل حرف y ، واذا كان صحيح يتم الحذف من خلال الكلمة المحجوزة del ، ثم الاتصال بدالة الحفظ savedata لحفظ الملف الجديد. ثم قمنا باستخدام تنسيق الاخراج لطباعة رسالة تم الحذف بنجاح.

دالة سطر الاوامر

ذكرنا في البداية بان هذا السكربت لا يمتلك واجهة رسومية ، وان التحكم به سوف يكون من خلال سطر اوامر خاص بالسكربت هذا ليس سطر اوامر حقيقي مثل cmd او terminal ولكن هذه محاكاة ؛الهدف منها هو اعطاء اوامر للسكربت بدون الحاجة للتعديل في الكود او ملف السكربت.

def cmdline():
     
    useri = input('\nCMD line :>')
    print(useri)
    x = useri.split()
    
    if '-add' in x:
        addNew()

    if '-edit' in x:
        if '-id' in x:
            sid = int(x[x.index("-id") + 1])
            editStud(sid)
        else:
            print('hint: -edit -id 1')

    if '-view' in x:
        viewAll()

    if '-find' in x:
        if len(x) < 2:
            print('help[find]: -find firstname lastname')
        else:
            search(x[1:])
    
    if '-del' in x:
        if len(x) > 1:
            sid = int(x[x.index("-del") + 1])
            remove(sid)
        else:
            print('help[delete]: -del id')
    else:
        cmdline()

دالة cmdline هي المشغل الرئيسي للدوال الاخري داخل السكربت ؛ وظيفتها هي الحصول علي المدخلات من المستخدم والتحقق من النصوص بداخلها واختيار الدالة المناسبة مع البيانات المطلوبة.

في البداية سوف نحصل علي المدخلات من المستخدم ونقوم بتحويلها الي قائمة من خلال دالة split.

useri = input('\nCMD line :>')
x = useri.split()

من خلال دالة split سوف نقوم بفصل الكلمات وتحويلها الي list لنفصل العناصر المطلوبة ونتحقق من الشروط.

تعتمد الدالة علي 5 شروط وهي (الاضافة - التعديل - عرض الكل - البحث - الحذف )

جميع الشروط متشابهة وكلها تتصل بالدوال المخصصة لها منها ما لا يحتاج الي بيانات عند الاتصال بالدالة الخاصة به، ومنها ما يحتاج الي بيانات من مدخلات المستخدم.

الشرط الاول - اضافة جديد :

if '-add' in x:
        addNew()

اذا كانت القائمة الموجودة في متغير x تحتوي علي عنصر قيمتة "-add" يتم الاتصال بالدالة addNew().

الشرط الثاني - التعديل :

if '-edit' in x:
    if len(x) > 1:
        sid = int(x[x.index("-edit") + 1])
        editStud(sid)
    else:
        print('hint: -edit 1')

في هذا الشرط يجب علي المستخدم ادخال امر -edit مع رقم الطالب كالشكل التالي:

"-edit 2"

سوف نحصل علي رقم الطالب من خلال دالة البحث او عرض الكل، لذلك سوف نتحقق من ان طول القائمة x اكبر من 1.

sid = int(x[x.index("-edit") + 1])

ومن خلال دالة index قمنا بتحديد رقم فهرس القيمة "-edit" داخل متغير x وقمنا باستخراج الرقم الذي يليها - تحضيراً لارساله الي دالة التعديل.

اذا كنت لا تستوعب السطر السابق راجع " النصوص في بايثون "

الشرط الثالث - عرض الكل:

if '-view' in x:
    viewAll()

هذا الشرط مشابة لشرط اضافة طالب جديد لا يحتاج الي استخراج اي بيانات من المدخلات ، كل ما في الموضوع اذا وجدت "-view" داخل x سوف يتم الاتصال بدالة viewAll وسوف يتم عرض كل الطلاب.

الشرط الرابع - البحث:

if '-find' in x:
    if len(x) < 2:
        print('help[find]: -find firstname lastname')
    else:
        search(x[1:])

في هذا الامر اذا كان عدد الكلمات المدخلة اقل من 2 سوف يتم طباعة تنوية لشكل الامر ؛ غير ذلك سوف يتم قص المصفوفة x لحذف الامر "-find" من المصفوفة ، ومن ثم الاتصال بالدالة search.

الشرط الخامس - الحذف:

if '-del' in x:
    if len(x) > 1:
        sid = int(x[x.index("-del") + 1])
        remove(sid)
    else:
        print('help[delete]: -del id')
else:
    cmdline()

شرط الحذف مشابة تماماً لشرط التعديل فهو يعتمد علي استخراج رقم الطالب من المدخلات او النص المقدم من قبل المستخدم وارسالة الي دالة الحذف.

تم اضافة else الي الشرط الاخير لتشغيل دالة سطر الاوامر cmdline اذا كان الامر خاطيء.

حلقة التكرار الرئيسية

سوف تعمل تلك الحلقة علي ضمان بقاء دالة cmdline تعمل باستمرار طيلة عملة البرنامج او السكربت.

 

while True:
    print("""-add  : add new student\n-edit : edit student data\n-find : search\n-view : all students\n-del  : delete student""")
    try:
        cmdline()
    except KeyboardInterrupt:
        cmdline()
    finally:
        cmdline()

كل ما فيها حلقة تكرار ما لا نهائية وبداخلها try except لتصيد المشاكل وتفاديها.

الخاتمة

كان هذا مثالاً بسيطا علي مشاريع بايثون جاهزة للمبتدئين بناء برنامج او سكربت لادارة البيانات باستخدام بعض المهارات الاساسية للغة البرمجة بايثون مثل الدوال والشروط والمتغيرات وبعض عمليات النصوص.

يمكن استخدام دالة cmdline مع السكربتات التي تحتاج دائما الي تعديل القيم اثناء عملها مثل سكربتات web scraping ، وايضاً حفظ البيانات من خلال json والتحقق منها قبل اجراء العمليات قد يختصر الكثير من الوقت ، ومن موارد النظام.

عزيزي القاري ان كنت قد وصلت الي هنا يمكنك اضافة هذا المشروع الي حسابك واجراء التعديلات عليه اون لاين.

بواسطة : admin
رابط مباشر https://www.brmgha.com/ide?embd=7jGs8hk8MCd

تضمين في موقع الكتروني

التعليقات

no comments found.
  • من خلال الضغط علي زر {;} في شريط الادوات يمكنك اضافة اكواد بايثون الي التعليق للتجربة اون لاين.
  • برجاء مراعاة قواعد الكتابة، والادب.

اكواد بايثون جاهزة

بحث
رسم بورترية python turtle

رسم بورترية python turtle

كود رسم دائرة بايثون turtle

رسم نجمة خماسية بايثون turtle

Python Turtle Online Shaheed Minar

رسم قلب python turtle

Python Turtle Online Fractal Art Tree Of Life

Python Turtle Online Play Sierpinski's Game

Python Turtle Online draw koch snowflakes by click window

Python Turtle Online Draws a Koch snowflake fractal

Python Turtle Online Draw Sierpinski Square

Python Turtle Online Sierpinski Triangle fractal

Python Turtle Online Nonuniform Fractal Tree Drawer

Python Turtle Online Fractal Tree Drawer

Python Turtle Online Drawing Mona Lisa

Python Turtle Online Ulam Spiral

Python Turtle Online Draw Polygons

Python Turtle Online Draw decorative graphics

Python Turtle Online Draw Tree branches

Python Turtle Online Draw Snakes

اون لاين بايثون, اون لاين كومبايلر, بايثون اون لاين كومبايلر, كومبايلر اون لاين, باثون اون لاين, برنامج بايثون اون لاين, محرر نصوص اون لاين, كومبايلر اونلاين, محرر أكواد بايثون اون لاين, بايثون كومبايلر, بايثون اون لاين, محرر اكواد اون لاين, بايثون اونلاين, محرر بايثون اون لاين, mtplotlib