2017-08-02 163 views
0

我有一個有11,000行和10列的電子表格。我試圖複製每行與選定的列,每行添加額外的信息和輸出到TXT。使用openpyxl處理非常大的文件python

不幸的是,我遇到了非常糟糕的性能問題,文件開始在100行後死掉並終止我的處理器。有沒有辦法來加速或使用更好的方法?我已經使用read_only=Truedata_only=True

大多數內存密集型部分是通過遍歷每個單元:

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

問題:有沒有辦法加快這或用更好的方法?

請嘗試以下,看是否能提高性能:

注意:不知道的colmax_column的價值!
我的實施例使用4列和跳過列C.

數據
[ 'A1', 'B1', 'C1', '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 NOTFOUND

與Python測試:3.4.2 - openpyxl:2.4.1