2017-05-02 17 views
0

私のプロジェクトは、さまざまなExcelファイルを扱うことです。これを行うには、私は前のファイルのいくつかのデータを含む単一のファイルを作成したいと思います。このすべて私のデータベースを持っているために。目標は、これらのデータのグラフを取得することです。これはすべて自動的に行われます。PythonからExcelファイルを作成

私はこのプログラムをPythonで書いています。しかし、それを実行するには20分かかります。どのように私はそれを最適化できますか? さらに、いくつかのファイルには同じ変数があります。ですから、私は最終的なファイルで同じ変数が繰り返されないようにしたいと思います。実行する方法?あなたの将来の助けを

import os 
import xlrd 
import xlsxwriter 
from xlrd import open_workbook 

wc = xlrd.open_workbook("U:\\INSEE\\table-appartenance-geo-communes-16.xls") 
sheet0=wc.sheet_by_index(0) 

# création 

with xlsxwriter.Workbook('U:\\INSEE\\Department61.xlsx') as bdd: 
    dept61 = bdd.add_worksheet('deprt61') 

folder_path = "U:\\INSEE\\2013_telechargement2016" 

col=8 
constante3=0 
lastCol=0 
listeV = list() 

for path, dirs, files in os.walk(folder_path): 
    for filename in files:    
     filename = os.path.join(path, filename)   
     wb = xlrd.open_workbook(filename, '.xls')    
     sheet1 = wb.sheet_by_index(0)   
     lastRow=sheet1.nrows   
     lastCol=sheet1.ncols   
     colDep=None 
     firstRow=None 
     for ligne in range(0,lastRow):     
      for col2 in range(0,lastCol):      
       if sheet1.cell_value(ligne, col2) == 'DEP': 
        colDep=col2 
        firstRow=ligne 
        break 
      if colDep is not None: 
       break 
     col=col-colDep-2-constante3 
     constante3=0 
     for nCol in range(colDep+2,lastCol): 
        constante=1 
        for ligne in range(firstRow,lastRow): 
          if sheet1.cell(ligne, colDep).value=='61': 
            Q=(sheet1.cell(firstRow, nCol).value in listeV) 
            if Q==False: 
              V=sheet1.cell(firstRow, nCol).value 
              listeV.append(V) 
              dept61.write(0,col+nCol,sheet1.cell(firstRow, nCol).value) 
              for ligne in range(ligne,lastRow): 
                if sheet1.cell(ligne, colDep).value=='61': 
                  dept61.write(constante,col+nCol,sheet1.cell(ligne, nCol).value) 
                constante=constante+1 

            elif Q==True: 
              constante3=constante3+1 # I have a problem here. I would like to count the number of variables that already exists but I find huge numbers. 
        break 
     col=col+lastCol 

bdd.close() 

おかげであなたを:

は、ここに私のプログラムです。 :)

+0

imhoの場合、 'filename for files:'の後ろにあるコードブロック全体を1レベルだけインデントする必要があります。ループは 'bdd.close()'を除いて意味があります。私はその編集をしました。それが間違っている場合は、再度編集してください。 – aneroid

答えて

0

これは広すぎる可能性がありますので、ここでは最適化できる箇所をいくつか紹介します。シートの見た目のサンプルスクリーンショットを追加することもできます。

  1. wrt if sheet1.cell_value(ligne, col2) == 'DEP':「DEP」はシート内に複数回現れますか? が一度だけとなる場合は、colDepfirstRowの両方の値が得られたら、両方のループから抜け出してください。両方のループからbreakを追加するには、内側のループを終了するためにブレークを追加してから、フラグ値をチェックし、外側のループから抜け出してから繰り返します。これと同じように:

    colDep = None # initialise to None 
    firstRow = None # initialise to None 
    for ligne in range(0,lastRow):     
        for col2 in range(0,lastCol):      
         if sheet1.cell_value(ligne, col2) == 'DEP': 
          colDep=col2 
          firstRow=ligne 
          break # break out of the `col2 in range(0,lastCol)` loop 
        if colDep is not None: # or just `if colDep:` if colDep will never be 0. 
         break # break out of the `ligne in range(0,lastRow)` loop 
    
  2. 私はあなたがfirstRowの-1から0までは、あなただけに読んでいるsheet1に空になることを知っているので、あなたの書き込みツーBDDブロックでfor ligne in range(0,lastRow):で範囲がfirstRowに開始すべきだと思いますヘッダーを探します。

    for ligne in range(firstRow, lastRow): 
    

    これは、空のヘッダー行を読み取る時間を無駄にしないようにします。クリーンなコードのための

その他の考慮事項:

    • といつもはダブルスラッシュに制御文字の前にいない場合でも、\\内部の文字列を使用します。 value=='61'ケースに拡張されたセル情報が必要な場合を除き、1つを選択します。
    • もっと読みやすいコードを書くにはPEP-8を読んでください。
  • +0

    ご協力いただきありがとうございます。私はそれを読むでしょう。 – Jen

    +0

    私のコードを変更しました。しかし、私はいくつかの問題があります。 – Jen

    関連する問題