Python写入Excel数据(100万条,压力测试)

Python写入Excel数据(100万条,压力测试)

​ 上周开发提测一个功能,某个导入业务需要支持100万条数据的量

​ 于是就利用Python写了一些测试数据,100万测试数据占用空间差不多22MB。一个py文件,同级目录放2个表格,一个表格作为初始数据读取,另一个表格作为写入数据。

100万条数据

执行结束

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import xlrd
import xlsxwriter

fileDemo = r'被读取的表格路径'
insertData = r'数据写入的表格路径'
data = xlrd.open_workbook(fileDemo)

# 获取一个sheet页
first_sheet = data.sheets()[0]
# 获取表格数据
content = first_sheet.row(3)

"""
content:[empty:'', empty:'', text:'91330108MA27XWH96M', text:'杭州西西沃', text:'万里测试真实企业',
empty:'', empty:'', empty:'', empty:'', empty:'',empty:'', empty:'', empty:'', empty:'', empty:'',
empty:'', empty:'', empty:'', empty:'', empty:'']
通过上面print内容可以看到,直接读出的内容,虽然是list,但每条数据前加了test字样,不能直接强转成tuple为我们所用,
于是自定义一个转换方法将其转换为可以用的list以便后面强转成tuple
"""
def rowToTuple(rowNum):
data = []
for i in range(len(content)):
data.append(first_sheet.cell_value(rowNum, i))
# 将每个单元格中的数据读取出来加到data这个list中并强转成元组返回
return tuple(data)

# 将第0行(即excel中的第1行表头)数据读取并转成元组赋给header
header = rowToTuple(2)
# 将第1行(即excel中的第4行)示例数据读取并转成元组赋给data1
data1 = rowToTuple(3)

""" 如果数据量非常大,可以启用constant_memory,这是一种顺序写入模式,得到一行数据就立刻写入一行,
而不会把所有的数据都保持在内存中。
如果不启用此模式,当数据量巨大时,程序很大概率地卡死 """
workbook = xlsxwriter.Workbook(insertData, {'constant_menory': True})
# 创建新的sheet页
new_sheet = workbook.add_worksheet()
# startNum表示从第几行开始写,这里的数字是从1开始,因为后面要和字母组合对应在excel中,如A1代表第1行第A列
startNum = 1
# 初始值,后面的数字在它们的基础上依次增加
startValues = ['000000000000001','00000001']
# 初始值对应的列
col = ['C','D']
#先将表头写入文件
new_sheet.write_row('A' + str(startNum), header)

# 正式开始写入数据
for i in range(1000000):
# 表头占据了第1行,所以首条数据从第2行开始,当i=0时,写入的数据从A2开始
print("正在生成第",i+1, "条数据...")
# 将data1中的数据依次写入C2、D2、……
new_sheet.write_row('A' + str(startNum + i + 1), data1)
# 前面相当于复制了第一条数据的所有内容,但是C、D两列内容需要依次往下排,因此我们将重写每行中C、D单元格中的值
for m in col:
length = len(startValues[col.index(m)])
# 数字用初始值+i
content = str(int(startValues[col.index(m)]) + i)
# 因为像000001这样的数字在计算中会丢失前面的0,为了保持位数,将失去的0再给它补回来
if (len(content) < length):
content = '0'* (length - len(content)) + content
# 将计算好的值写入到对应的单元格中
new_sheet.write(m + str(startNum + i + 1), content)
workbook.close()
#

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×