用Python3生成30万条excel数据(xlsx格式)

Auth:焱讲       Date:2019/12/26       Cat:文章精选       Word:共2478字

已关闭评论

用Python3生成30万条excel数据(xlsx格式)

在B/S架构的系统测试中,有时需要通过导入excel文件来生成一些数据记录,当数据量小的时候,一般不会出现什么问题,而当导入的数据量巨大时,对系统的性能就是一个考验了。为了验证系统的性能,有时需要导入海量的数据,如30万条数据记录,而手头并没有这么多数据时该怎么办呢?一条一条复制粘贴,或者通过excel的下拉拖动来生成记录?这样会把测试人员累死,而且单调重复的工作,非常无趣。这时,我们只需借助python,便可以轻松生成大量数据,把人从单调重复的工作中解放出来,去做更有意义的事。

例如,我们需要生成如下的数据。

用Python3生成30万条excel数据(xlsx格式) - 第1张图片

这是一条用户信息的示例数据,其中包含几种编号、姓名、性别、爱好、最喜欢的电影、音乐等信息,而其中只需校验A、I、L这三列的不同编号。其他数据在性能测试中不是很关心,那么我们可以利用规则生成一些数据,其中仅A、I、L三列不同,其他信息保持不变。

思路:先将表头和示例数据保存在一个示例文件中,通过xlrd来读取示例内容,通过xlsxwriter来按规则写入表头和不同的信息。

话不多说,我们直接上代码:

用Python3生成30万条excel数据(xlsx格式) - 第2张图片

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()

用Python3生成30万条excel数据(xlsx格式) - 第2张图片

 

接下来,生成数据的活交给计算机,让我们去泡杯茶,静待数据生成成功吧!

经测试,生成30万条数据仅需大约4min!

import.py

      

评论已关闭!