2016-12-13 18 views
-1

コードでは、10秒ごとに2つの乱数を記録し、3行に数値を追加するスプレッドシートを作成し、特定の条件が満たされたらループを終了することができましたが、ループが終了した後、新しいスプレッドシートが作成され、ループが再び開始されます。しかし、最初のシートが終了したのと同じ条件で終了させたいときに、ループが再び開始されると、シートに数字の余分な行が追加されます。私は数字でいっぱいに余分な行が得られた理由を把握できなかったようです。余分なデータを取得する理由

# global variable 
globvar = 1 
# start generate_random_number function 
def generate_random_number(): 
    int1 = random.randint(55, 99) 
    int2 = random.randint(1, 50) 
    print('Numbers have been generated') 
    return int1, int2 
# end generate_random_number function 

# start create_excel function 
def create_excel(): 
    # call global 
    global globvar 
    #check file created and not 
    if(globvar == 1): 
     wb = Workbook() 
     wb.remove_sheet(wb.get_sheet_by_name('Sheet')) 
     wb.create_sheet('Test '+str(globvar)) 
     ws = wb.get_sheet_by_name('Test '+str(globvar)) 
     ws['A1'] = 'Random 1' 
     ws['B1'] = 'Random 2' 
     wb.save('sample.xlsx') 
     print('Document created') 
    else: 
     wb = load_workbook('sample.xlsx') 
     wb.create_sheet('Test '+str(globvar)) 
     ws = wb.get_sheet_by_name('Test '+str(globvar)) 
     ws['A1'] = 'Random 1' 
     ws['B1'] = 'Random 2' 
     wb.save('sample.xlsx') 
     print('Document created') 
# end create_excel function 

# start update_excel function 
def update_excel(): 
    global globvar 
    wb = load_workbook('sample.xlsx') 
    ws = wb.get_sheet_by_name('Test '+str(globvar)) 
    ws.append(generate_random_number()) 
    wb.save('sample.xlsx') 
    print('Spreadsheet updated') 
# end update_excel function 

# start main function 
def main(): 
    global globvar 
    m = 1 
    create_excel() 
    update_excel() 
    schedule.every(10).seconds.do(update_excel) 
    loop = True 
    while loop: 
     schedule.run_pending() 
     m += 1 
     print('Waiting...') 
     time.sleep(10) 
     if m == 3: 
      schedule.run_pending() 
      loop = False 
      globvar +=1 
      #print('Finished program. ' + str(datetime.datetime.now())) 
      #print('Starting program now.... ' + str(datetime.datetime.now())) 
      #main() 
# end main function 

# starts whole script here 
print('Starting program now.... '+ str(datetime.datetime.now())) 
t = 1 
while True:  
    main() 
    t += 1 
    if t == 3: 
     break 
print('Finished program. '+ str(datetime.datetime.now())) 
+0

"余分なデータ"とはどういう意味でしょうか。 – SpliFF

+0

コードをもう一度見た後、メイン関数の最後にエラーがメインコールされているかもしれないと思ったが、コメントを外してメインのループを作成しても、余分なデータが得られる。 – cojoe

+0

私は3行にランダムな数字を追加するプログラムを持っているが、最初のシートの後に6行に数字を追加する – cojoe

答えて

1

globvarの増分間に10秒以上経過しているからです。何が起きるかは、インクリメントごとに1つではなく、update_excelという2つ以上の保留中のコールが実行されていることです。

コード実行によって余分な遅延が発生すると、ループが10秒より長くなり、スケジュールされたタスクがキューに入れられるという意味で、10秒間のスリープと10秒間のスリープが発生するので、それほど驚くことではありません。

schedule.everyの代わりに、update_excelコールを直接ループに入れてください。

def main(): 
    ... 
    create_excel() 
    while loop: 
     update_excel() 
     time.sleep(10) 
     m += 1 
     if m == 3: 
      globvar += 1 
      return 
+0

これは余分な行を解決しますが、プログラム全体を実行すると2枚となります。最初のシートは番号なしのシート、2番目のシートは数値のテスト2となります。シートと呼ばれるシートは、Excelの作成機能に記載されているように削除され、テスト1に置き換えられるはずです – cojoe

+0

私は問題を理解したことはありません。私は変更しなかった行を見落としました。 – cojoe

関連する問題