2017-08-02 21 views
0

私は11,000行と10個の列を持つスプレッドシートを持っています。私は選択された列で各行をコピーしようとしており、行ごとに追加情報を追加してtxtに出力します。openpyxl pythonで非常に大きなファイルを扱う

残念ながら、私は実際にパフォーマンスの問題が悪化しています。ファイルは100行後にスラッグしてプロセッサを強制終了します。これをスピードアップする方法や、より良い方法論を使用する方法はありますか?

for i in range(probeStart, lastRow+1): 
    dataRow ="" 
    for j in range (1,col+2): 
     dataRow = dataRow + str(sheet.cell(row=i, column=j).value) + "\t" 

    sigP = db.get(str(sheet.cell(row= i, column=1).value), "notfound") #my additional information 
    a = str(sheet.cell(row = i, column = max_column-1).value) +"\t" 
    b = str(sheet.cell(row = i, column = max_column).value) + "\t" 
    string1 = dataRow + a + b + sigP + "\n" 
    w.write(string1) 
+0

@Rahul?パフォーマンスを改善するためにどのような機能を使用する必要がありますか? – theMicroGirl

+0

ここでパンダは必要ないと思う。 openpyxlで十分です。問題は 'db.get'だと思います – Rahul

+1

' ws.cell() 'を繰り返し使用するとコード内で問題が発生し、openpyxlはワークシートを何度も何度も再解析します。 –

答えて

1

質問:これをスピードアップするか、より良い方法論を使用する方法はありますが、私はすでに多くのメモリ集約型の部分は、各セルを反復さread_only=Truedata_only=True

を使用していますか?

はこのパフォーマンスを向上させるかどうかを確認するために、次の試してみてくださいcolmax_columnの価値を知りませんでした!
私の例は、4つの列を使用し、スキップ列C.

データ
[ 'A1'、 'B1'、 'C​​1'、 'D1']、
[ 'A2'、 'B2' 、 'C2'、 'D2']


from openpyxl.utils import range_boundaries 
min_col, min_row, max_col, max_row = range_boundaries('A1:D2') 

for row_cells in ws.iter_rows(min_col=min_col, min_row=min_row, 
           max_col=max_col, max_row=max_row): 

    # Slice Column Values up to B 
    data = [cell.value for cell in row_cells[:2]] 

    # Extend List with sliced Column Values from D up to End 
    data.extend([cell.value for cell in row_cells[3:]]) 

    # Append db.get(Column A.value) 
    data.append(db.get(row_cells[0].value, "notfound")) 

    # Join all List Values delimited with \t 
    print('{}'.format('\t'.join(data))) 

    # Write to CSV 
    #w.write(data) 

出力
A1 B1 D1がNOTFOUND
A2 B2 D2は、Pythonでテスト

NOTFOUND:3.4.2 - openpyxl:パンダが優れている方法2.4.1

関連する問題