1. 程式人生 > >用Python3生成30萬條excel資料(xlsx格式)

用Python3生成30萬條excel資料(xlsx格式)

在B/S架構的系統測試中,有時需要通過匯入excel檔案來生成一些資料記錄,當資料量小的時候,一般不會出現什麼問題,而當匯入的資料量巨大時,對系統的效能就是一個考驗了。為了驗證系統的效能,有時需要匯入海量的資料,如30萬條資料記錄,而手頭並沒有這麼多資料時該怎麼辦呢?一條一條複製貼上,或者通過excel的下拉拖動來生成記錄?這樣會把測試人員累死,而且單調重複的工作,非常無趣。這時,我們只需藉助python,便可以輕鬆生成大量資料,把人從單調重複的工作中解放出來,去做更有意義的事。

例如,我們需要生成如下的資料。

這是一條使用者資訊的示例資料,其中包含幾種編號、姓名、性別、愛好、最喜歡的電影、音樂等資訊,而其中只需校驗A、I、L這三列的不同編號。其他資料在效能測試中不是很關心,那麼我們可以利用規則生成一些資料,其中僅A、I、L三列不同,其他資訊保持不變。

思路:先將表頭和示例資料儲存在一個示例檔案中,通過xlrd來讀取示例內容,通過xlsxwriter來按規則寫入表頭和不同的資訊。

話不多說,我們直接上程式碼:

 1 import xlrd
 2 import xlsxwriter
 3 #檔名以及路徑,前面加一個r防止生成不必要的轉義。
 4 filename=r'D:\001\example.xlsx'
 5 data = xlrd.open_workbook(filename)
 6 # 獲取第1個sheet頁
 7 table = data.sheets()[0]
 8 # 獲取第2行(第1條)資料
 9 content=table.row(1)
10 print('第1條示例資料為:',content) 11 # 通過上面print內容可以看到,直接讀出的內容,雖然是list,但每條資料前加了 12 # text:字樣,不能直接強轉成tuple為我們所用,於是自定義一個轉換方法將其轉換為可以用的list以便後面強轉成tuple 13 def convertRowToTuple(rowNum): 14 data=[] 15 # len(content)是上面獲取到的該行的資料列數 16 for i in range(len(content)): 17 data.append(table.cell_value(rowNum,i))
18 # 將每個單元格中的資料讀取出來加到data這個list中並強轉成元組返回 19 return tuple(data) 20 # 將第0行(即excel中的第1行表頭)資料讀取並轉成元組賦給header 21 header=convertRowToTuple(0) 22 # 將第1行(即excel中的第2行)示例資料讀取並轉成元組賦給data1 23 data1=convertRowToTuple(1) 24 # print(header) 25 # print(data1) 26 # 即將寫入資料的檔名 27 filename2=r'D:\001\TestDatas2.xlsx' 28 # 如果資料量非常大,可以啟用constant_memory,這是一種順序寫入模式,得到一行資料就立刻寫入一行,而不會把所有的資料都保持在記憶體中。 29 # 如果不啟用此模式,當資料量巨大時,程式很大概率地卡死 30 workbook = xlsxwriter.Workbook(filename2, {'constant_memory': True}) 31 # 建立新的sheet頁 32 worksheet = workbook.add_worksheet() 33 # startNum表示從第幾行開始寫,這裡的數字是從1開始,因為後面要和字母組合對應在excel中,如A1代表第1行第A列 34 startNum=1 35 # 初始值,後面的數字在它們的基礎上依次增加 36 startValues=['000001','245353','24289796'] 37 # 初始值對應的列 38 col=['A','I','L'] 39 #先將表頭寫入檔案 40 worksheet.write_row('A'+str(startNum), header) 41 # 正式開始寫入資料 42 for i in range(300000): 43 # 為了不讓生成過程無聊,加此列印資訊以便檢視進度 44 print('正建立第',i+1,'條資料') 45 # 表頭佔據了第1行,所以首條資料從第2行開始,當i=0時,寫入的資料從A2開始 46 # 將data1中的資料依次寫入A2、B2、C2…… 47 worksheet.write_row('A'+str(startNum+i+1), data1) 48 # 前面相當於複製了第一條資料的所有內容,但是A、I、L三列內容需要依次往下排,因此我們將重寫每行中A I L單元格中的值 49 for m in col: 50 length=len(startValues[col.index(m)]) 51 # 數字用初始值加上i 52 content=str(int(startValues[col.index(m)])+i) 53 # 因為像000001這樣的數字在計算中會丟失前面的0,為了保持位數,將失去的0再給它補回來 54 if(len(content)<length): 55 content='0'*(length-len(content))+content 56 # 將計算好的值寫入到對應的單元格中 57 worksheet.write(m+str(startNum+i+1), content) 58 # 寫完之後關閉workbook,否則會報錯 59 workbook.close()

 

接下來,生成資料的活交給計算機,讓我們去泡杯茶,靜待資料生成成功吧!

經測試,生成30萬條資料僅需大約4min!