用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!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM