python 3 excelの読み書き、単位成績の計算

9966 ワード

問題の背景
今日は小さな任務に出会って、学校全体の電力学部の1学期の各科の成績表に基づいて、一人一人の単位成績を計算します.データは全部で5000+本あり、各データは一人一人の各科の成績を表し、一人一人の試験科目の数が異なり、単位成績計算に参加しない任意の授業があるため、excelを直接使うことは目的を達成できない.python 3スクリプトを使用して単位を計算することを考慮しました.
一.インストールライブラリ
まず、読み書きexcelの2つのライブラリをインストールしてexcelライブラリに書き込む
pip install xlwt

EXcelライブラリの読み込み
pip install xlrd

二.excelファイルを読み取るテスト
#   excel  
input_data = xlrd.open_workbook('score.xlsx')
#            ,   0  
score_sheet = input_data.sheet_by_index(0)
#        
n = score_sheet.nrows
#            
for row_num in range(1, n):
    #      ,  ,               ,          
    name = score_sheet.cell_value(row_num,1)
    #            ···

三.excelファイルを書き込むテスト
#     
result_book = xlwt.Workbook()
#      
result_sheet = result_book.add_sheet('Result Sheet')
#          ,     ,  ,  ,   0  
def writeTitle(result_sheet):
    result_sheet.write(0, 0, '    ')
    result_sheet.write(0, 1, '    ')
    result_sheet.write(0, 2, '    ')
    result_sheet.write(0, 3, '     ')
    result_sheet.write(0, 4, '     ')
    result_sheet.write(0, 5, '     ')
writeTitle(result_sheet)
#     ,           excel,             
result_book.save('15    .xlsx')

四.考え方
EXcel自体にソート機能があり、ソート後のファイルのため、データが読み出される順序も変わります.したがって,あらかじめexcelで学号に基づいて並べ替え,同一人物の各成績データが連続することを保証することができる.これにより、次のデータの学号と現在のデータの学号が一致しているかどうかに基づいて、一人のすべての情報が統計されたかどうかを判断することができます.人のデータを集計するごとに、単位を保存した表にその人の情報を書き込んで、最終的に保存すればいい.
五.注意事項
  • excelテーブルをソートするときは、名前に基づいてソートしないでください.重複する問題がある可能性があります.
  • 個々のデータの中で成績が空の場合や、合格、優秀などの文字があるかどうかに注意する必要があります.このようなデータは事前に処理したほうがいいです.
  • 表のデータにスペースがあるかどうかに注意し、学号フィールドにスペースがある場合、学号が一致していると判断するエラーが発生する可能性があります.
  • 任意選択科目
  • が削除されたかどうかに注意する必要があります.
  • excelのフィルタリング機能は、データの読み取りに影響を与えません.テーブルの一部のデータを読み取りたい場合は、16,17レベルのデータをフィルタリングし、15レベルのデータだけを残して、15レベルのデータをテーブル2にコピーして読み取ります.

  • 六.ソース付録
    import xlwt
    import xlrd
    
    
    #    0  ,   0 ,      1   
    #       :1  ,2  ,4  ,8  ,9  
    std_num_index = 1
    name_index = 2
    class_index = 4
    xf_index = 8 #     
    score_index = 11 #      
    type_index = 10 #      
    input_data = xlrd.open_workbook('aa.xlsx')
    score_sheet = input_data.sheet_by_index(3)
    #       :0  ,1  ,2  ,3   ,4   ,5    
    r_std_num_index = 0
    r_name_index = 1
    r_class_index = 2
    r_all_xf_index = 3
    r_all_score_index = 4
    r_result_index = 5
    #       +1
    result_num = 1
    name = ''
    std_class = ''
    #        
    all_xf = 0;
    all_score = 0;
    
    def writeOneStudent(result_sheet,result_num):
        result_sheet.write(result_num, r_std_num_index, std_num)
        result_sheet.write(result_num, r_name_index, name)
        result_sheet.write(result_num, r_class_index, std_class)
        result_sheet.write(result_num, r_all_xf_index, all_xf)
        result_sheet.write(result_num, r_all_score_index, all_score)
        if all_xf!= 0:
            result_sheet.write(result_num, r_result_index, all_score/all_xf)
    def writeTitle(result_sheet):
        result_sheet.write(0, r_std_num_index, '    ')
        result_sheet.write(0, r_name_index, '    ')
        result_sheet.write(0, r_class_index, '    ')
        result_sheet.write(0, r_all_xf_index, '     ')
        result_sheet.write(0, r_all_score_index, '     ')
        result_sheet.write(0, r_result_index, '     ')
    
    
    #          
    result_book = xlwt.Workbook()
    result_sheet = result_book.add_sheet('Result Sheet')
    writeTitle(result_sheet)
    #   :      ,    ,   ,              ,    ,            ,  
    #          
    next_std_num = score_sheet.cell_value(1,std_num_index).strip()
    n = score_sheet.nrows
    for row_num in range(1, n):
        print(row_num)
        #                
        std_num = next_std_num
        #         
        # name = score_sheet.cell_value(row_num, name_index)
        #         
        # std_class = score_sheet.cell_value(row_num, class_index)
        type = score_sheet.cell_value(row_num, type_index)
        if type.strip() != '  ':
    
            #   
            xf = score_sheet.cell_value(row_num, xf_index)
            #   (    )
            score = score_sheet.cell_value(row_num, score_index)
            if xf != '' and not str(xf).isspace() and score != '' and not str(score).isspace():
                #     
                xf = abs(float(xf))
                all_xf+= xf
                #     
                score = abs(float(score))
                all_score+= xf*score
            #         
        if row_num1:
            next_std_num = score_sheet.cell_value(row_num+1, std_num_index).strip();
            if next_std_num != std_num:
                #           
                name = score_sheet.cell_value(row_num, name_index)
                std_class = score_sheet.cell_value(row_num, class_index)
                #     
                writeOneStudent(result_sheet,result_num)
                result_num+=1
                #           
                all_xf = 0;
                all_score = 0;
        else:
            #   
            #           
            name = score_sheet.cell_value(row_num, name_index)
            std_class = score_sheet.cell_value(row_num, class_index)
            #     
            writeOneStudent(result_sheet, result_num)
            result_num += 1
            #           
            all_xf = 0
            all_score = 0
    result_book.save('15 2017-2018(1)   .xlsx')

    七.総括は実は読み書き機能がどのように実現するかを理解した後、基本的に難点はなく、ソースコードは一時的に簡単に書いたので、比較的に醜いので、参考に供する.