目录
问卷调查,让技术人员去搞,看着就烦,浪费时间,浪费金钱。这不,工科大学生的毛概课程非得要进行社会调查,看着就脑阔疼。但是,工科生有那么容易就会跟着你课程搁这浪费时间、浪费金钱?不好意思,脚本搞起来!!!
不想听我唠叨的小伙伴可直接拉到文章的最下面获取本问卷的完整代码。。。
以下方的问卷调查为例。
分析问卷
首先我们得分析一下这个问卷。
在我们第3问,选择第3个选项的时候,4到17问全部不见了,发生了一个跳转。好家伙,不过是个小问题。。。
继续往下看。可恶,在第6问选择第2、第3个选项的时候,第7问又不见了,又发生了跳转。离谱,代码难度加大了呀。
继续看,等等,为啥还会有多选的呀,我#¥%6@4!?.....真有你的
继续找找看,,,好了,没有了,其他的都是单选的。
代码思路
要拿到最终统计好的数据,必须要获得每一份问卷的数据,而对于每一份的问卷数据要怎样获得,方法有很多,我这里采用随机数获得。
上面分析了一下问卷的特点,即多选、单选、跳转。
- 多选:可以随机产生一个数来确定多选的个数,当然这个数不能超过多选的最大个数
- 单选:随机产生一个数来作为这个问题的选项结果,这个数肯定也是不能超过这个问题的选项个数的
- 跳转:跳过去的题就默认用0来代替,表示啥都不选
多选
if i == 8: # 多选
GeShu = random.randint(1, TiMu_XuanXiang_num[i]) # 随机产生多选题选择的个数
temp = 0
while temp < GeShu:
XuanZe = random.randint(1, TiMu_XuanXiang_num[i]) # 随机生成1到TiMu_XuanXiang_num[i]的随机整数,第i题选择哪个选项
if XuanZe not in TiMu:
TiMu.append(XuanZe) # 把题目的选择放到题目里
temp += 1
TiMu.sort(reverse=False)
elif i == 10:
GeShu = random.randint(1, TiMu_XuanXiang_num[i]) # 随机产生多选题选择的个数
temp = 0
while temp < GeShu:
XuanZe = random.randint(1, TiMu_XuanXiang_num[i]) # 随机生成1到TiMu_XuanXiang_num[i]的随机整数,第i题选择哪个选项
if XuanZe not in TiMu:
TiMu.append(XuanZe) # 把题目的选择放到题目里
temp += 1
TiMu.sort(reverse=False)
elif i == 11:
GeShu = random.randint(1, TiMu_XuanXiang_num[i]) # 随机产生多选题选择的个数
temp = 0
while temp < GeShu:
XuanZe = random.randint(1, TiMu_XuanXiang_num[i]) # 随机生成1到TiMu_XuanXiang_num[i]的随机整数,第i题选择哪个选项
if XuanZe not in TiMu:
TiMu.append(XuanZe) # 把题目的选择放到题目里
temp += 1
TiMu.sort(reverse=False)
elif i == 13:
GeShu = random.randint(1, TiMu_XuanXiang_num[i]) # 随机产生多选题选择的个数
temp = 0
while temp < GeShu:
XuanZe = random.randint(1, TiMu_XuanXiang_num[i]) # 随机生成1到TiMu_XuanXiang_num[i]的随机整数,第i题选择哪个选项
if XuanZe not in TiMu:
TiMu.append(XuanZe) # 把题目的选择放到题目里
temp += 1
TiMu.sort(reverse=False)
elif i == 14:
GeShu = random.randint(1, TiMu_XuanXiang_num[i]) # 随机产生多选题选择的个数
temp = 0
while temp < GeShu:
XuanZe = random.randint(1, TiMu_XuanXiang_num[i]) # 随机生成1到TiMu_XuanXiang_num[i]的随机整数,第i题选择哪个选项
if XuanZe not in TiMu:
TiMu.append(XuanZe) # 把题目的选择放到题目里
temp += 1
TiMu.sort(reverse=False)
elif i == 17:
GeShu = random.randint(1, TiMu_XuanXiang_num[i]) # 随机产生多选题选择的个数
temp = 0
while temp < GeShu:
XuanZe = random.randint(1, TiMu_XuanXiang_num[i]) # 随机生成1到TiMu_XuanXiang_num[i]的随机整数,第i题选择哪个选项
if XuanZe not in TiMu:
TiMu.append(XuanZe) # 把题目的选择放到题目里
temp += 1
TiMu.sort(reverse=False)
elif i == 18:
GeShu = random.randint(1, TiMu_XuanXiang_num[i]) # 随机产生多选题选择的个数
temp = 0
while temp < GeShu:
XuanZe = random.randint(1, TiMu_XuanXiang_num[i]) # 随机生成1到TiMu_XuanXiang_num[i]的随机整数,第i题选择哪个选项
if XuanZe not in TiMu:
TiMu.append(XuanZe) # 把题目的选择放到题目里
temp += 1
TiMu.sort(reverse=False)
单选
else: # 单选
XuanZe = random.randint(1, TiMu_XuanXiang_num[i]) # 随机生成1到TiMu_XuanXiang_num[i]的随机整数,第i题选择哪个选项
TiMu.append(XuanZe) # 把题目的选择放到题目里
跳转
if i == 2 and XuanZe == 3:
DiaoCha_Biao.append(TiMu) # 把每个题目的结果放到调查表里
TiMu = [] # 清空题目列表
while i != 17:
TiMu = [0]
i += 1
DiaoCha_Biao.append(TiMu)
elif i == 5 and XuanZe != 1:
DiaoCha_Biao.append(TiMu) # 把每个题目的结果放到调查表里
TiMu = [] # 清空题目列表
while i != 6:
TiMu = [0]
i += 1
DiaoCha_Biao.append(TiMu)
else:
DiaoCha_Biao.append(TiMu) # 把每个题目的结果放到调查表里
TiMu = []
生成数据
到这里,就很简单了,需要多少数据,就直接用for就能跑出来,当然在这里用到三维的列表进行对数据的临时存储。
在这里用中文输入表示一下,列表临时存储数据的结构:
【【【】,【】,【】,……,【】】,【】,【】】
最里面的中括号是每个问题的选择结果。
中间的中括号是每一份数据,就类似于每一份问卷所填的数据
最外面的中括号是所有的数据,就相当于包括了所有的问卷
# 产生数据
for k in range(0, 536):
i = 0
while i < 21:
if i == 8: # 多选
GeShu = random.randint(1, TiMu_XuanXiang_num[i]) # 随机产生多选题选择的个数
temp = 0
while temp < GeShu:
XuanZe = random.randint(1, TiMu_XuanXiang_num[i]) # 随机生成1到TiMu_XuanXiang_num[i]的随机整数,第i题选择哪个选项
if XuanZe not in TiMu:
TiMu.append(XuanZe) # 把题目的选择放到题目里
temp += 1
TiMu.sort(reverse=False)
elif i == 10:
GeShu = random.randint(1, TiMu_XuanXiang_num[i]) # 随机产生多选题选择的个数
temp = 0
while temp < GeShu:
XuanZe = random.randint(1, TiMu_XuanXiang_num[i]) # 随机生成1到TiMu_XuanXiang_num[i]的随机整数,第i题选择哪个选项
if XuanZe not in TiMu:
TiMu.append(XuanZe) # 把题目的选择放到题目里
temp += 1
TiMu.sort(reverse=False)
elif i == 11:
GeShu = random.randint(1, TiMu_XuanXiang_num[i]) # 随机产生多选题选择的个数
temp = 0
while temp < GeShu:
XuanZe = random.randint(1, TiMu_XuanXiang_num[i]) # 随机生成1到TiMu_XuanXiang_num[i]的随机整数,第i题选择哪个选项
if XuanZe not in TiMu:
TiMu.append(XuanZe) # 把题目的选择放到题目里
temp += 1
TiMu.sort(reverse=False)
elif i == 13:
GeShu = random.randint(1, TiMu_XuanXiang_num[i]) # 随机产生多选题选择的个数
temp = 0
while temp < GeShu:
XuanZe = random.randint(1, TiMu_XuanXiang_num[i]) # 随机生成1到TiMu_XuanXiang_num[i]的随机整数,第i题选择哪个选项
if XuanZe not in TiMu:
TiMu.append(XuanZe) # 把题目的选择放到题目里
temp += 1
TiMu.sort(reverse=False)
elif i == 14:
GeShu = random.randint(1, TiMu_XuanXiang_num[i]) # 随机产生多选题选择的个数
temp = 0
while temp < GeShu:
XuanZe = random.randint(1, TiMu_XuanXiang_num[i]) # 随机生成1到TiMu_XuanXiang_num[i]的随机整数,第i题选择哪个选项
if XuanZe not in TiMu:
TiMu.append(XuanZe) # 把题目的选择放到题目里
temp += 1
TiMu.sort(reverse=False)
elif i == 17:
GeShu = random.randint(1, TiMu_XuanXiang_num[i]) # 随机产生多选题选择的个数
temp = 0
while temp < GeShu:
XuanZe = random.randint(1, TiMu_XuanXiang_num[i]) # 随机生成1到TiMu_XuanXiang_num[i]的随机整数,第i题选择哪个选项
if XuanZe not in TiMu:
TiMu.append(XuanZe) # 把题目的选择放到题目里
temp += 1
TiMu.sort(reverse=False)
elif i == 18:
GeShu = random.randint(1, TiMu_XuanXiang_num[i]) # 随机产生多选题选择的个数
temp = 0
while temp < GeShu:
XuanZe = random.randint(1, TiMu_XuanXiang_num[i]) # 随机生成1到TiMu_XuanXiang_num[i]的随机整数,第i题选择哪个选项
if XuanZe not in TiMu:
TiMu.append(XuanZe) # 把题目的选择放到题目里
temp += 1
TiMu.sort(reverse=False)
else: # 单选
XuanZe = random.randint(1, TiMu_XuanXiang_num[i]) # 随机生成1到TiMu_XuanXiang_num[i]的随机整数,第i题选择哪个选项
TiMu.append(XuanZe) # 把题目的选择放到题目里
if i == 2 and XuanZe == 3:
DiaoCha_Biao.append(TiMu) # 把每个题目的结果放到调查表里
TiMu = [] # 清空题目列表
while i != 17:
TiMu = [0]
i += 1
DiaoCha_Biao.append(TiMu)
elif i == 5 and XuanZe != 1:
DiaoCha_Biao.append(TiMu) # 把每个题目的结果放到调查表里
TiMu = [] # 清空题目列表
while i != 6:
TiMu = [0]
i += 1
DiaoCha_Biao.append(TiMu)
else:
DiaoCha_Biao.append(TiMu) # 把每个题目的结果放到调查表里
TiMu = []
TiMu = [] # 清空题目列表
i += 1
ZongDiaoCha_Biao.append(DiaoCha_Biao)
DiaoCha_Biao = []
yan_shi = random.random()
time.sleep(yan_shi)
print(k + 1)
统计数据
数据生成完之后,需要对数据进行一个统计。
# 对数据进行统计
DiaoCha_Biao = []
biao = []
ZongTongJiBiao = np.zeros((21, 8))
for biao in (ZongDiaoCha_Biao):
i = 0
for ti_mu in (biao):
for j in range(1, TiMu_XuanXiang_num[i] + 1):
if j in ti_mu:
ZongTongJiBiao[i][j - 1] += 1
i += 1
print(ZongTongJiBiao)
保存数据
数据统计完之后,还可以将数据保存到excel表格,方便对数据作进一步的处理。
# 保存数据到excel表格
Data = load_workbook('总统计数据.xlsx')
Data_0 = Data['Sheet1']
Data_0.cell(1, 1).value = '题号'
for i in range(2, 23):
Data_0.cell(i, 1).value = '题' + str(i - 1)
for i in range(2, 10):
Data_0.cell(1, i).value = '选项' + str(i - 1)
for i in range(0, 21):
for j in range(0, 8):
Data_0.cell(i + 2, j + 2).value = ZongTongJiBiao[i][j]
Data.save('总统计数据.xlsx')
Data.close()
好了,现在我们就得到了一份完美的数据,不仅省钱、省力、省时间,还可以提高编写代码能力,一箭四雕,嘻嘻嘻。。。
下面附上本问卷的完整代码。
完整代码
# Author:Eric
# -*- codeing = utf-8 -*-
# @Time : 2022-04-01 14:18
# @Author : cet
# @File : MoNi_ShuJu_1.py
# @Software: PyCharm
import random # 引入随机库
import numpy as np
import time
from openpyxl import load_workbook
ZongDiaoCha_Biao = [] # 总调查表
DiaoCha_Biao = [] # 调查表
TiMu = [] # 题目
GeShu = 0 # 多选题的个数
XuanZe = 0 # 选择到的选项
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
TiMu_XuanXiang_num = [4, 5, 3, 4, 2, 3, 6, 2, 3, 8, 4, 4, 4, 4, 4, 5, 8, 4, 4, 4, 4] # 每一题的选项数
# 产生数据
for k in range(0, 536):
i = 0
while i < 21:
if i == 8: # 多选
GeShu = random.randint(1, TiMu_XuanXiang_num[i]) # 随机产生多选题选择的个数
temp = 0
while temp < GeShu:
XuanZe = random.randint(1, TiMu_XuanXiang_num[i]) # 随机生成1到TiMu_XuanXiang_num[i]的随机整数,第i题选择哪个选项
if XuanZe not in TiMu:
TiMu.append(XuanZe) # 把题目的选择放到题目里
temp += 1
TiMu.sort(reverse=False)
elif i == 10:
GeShu = random.randint(1, TiMu_XuanXiang_num[i]) # 随机产生多选题选择的个数
temp = 0
while temp < GeShu:
XuanZe = random.randint(1, TiMu_XuanXiang_num[i]) # 随机生成1到TiMu_XuanXiang_num[i]的随机整数,第i题选择哪个选项
if XuanZe not in TiMu:
TiMu.append(XuanZe) # 把题目的选择放到题目里
temp += 1
TiMu.sort(reverse=False)
elif i == 11:
GeShu = random.randint(1, TiMu_XuanXiang_num[i]) # 随机产生多选题选择的个数
temp = 0
while temp < GeShu:
XuanZe = random.randint(1, TiMu_XuanXiang_num[i]) # 随机生成1到TiMu_XuanXiang_num[i]的随机整数,第i题选择哪个选项
if XuanZe not in TiMu:
TiMu.append(XuanZe) # 把题目的选择放到题目里
temp += 1
TiMu.sort(reverse=False)
elif i == 13:
GeShu = random.randint(1, TiMu_XuanXiang_num[i]) # 随机产生多选题选择的个数
temp = 0
while temp < GeShu:
XuanZe = random.randint(1, TiMu_XuanXiang_num[i]) # 随机生成1到TiMu_XuanXiang_num[i]的随机整数,第i题选择哪个选项
if XuanZe not in TiMu:
TiMu.append(XuanZe) # 把题目的选择放到题目里
temp += 1
TiMu.sort(reverse=False)
elif i == 14:
GeShu = random.randint(1, TiMu_XuanXiang_num[i]) # 随机产生多选题选择的个数
temp = 0
while temp < GeShu:
XuanZe = random.randint(1, TiMu_XuanXiang_num[i]) # 随机生成1到TiMu_XuanXiang_num[i]的随机整数,第i题选择哪个选项
if XuanZe not in TiMu:
TiMu.append(XuanZe) # 把题目的选择放到题目里
temp += 1
TiMu.sort(reverse=False)
elif i == 17:
GeShu = random.randint(1, TiMu_XuanXiang_num[i]) # 随机产生多选题选择的个数
temp = 0
while temp < GeShu:
XuanZe = random.randint(1, TiMu_XuanXiang_num[i]) # 随机生成1到TiMu_XuanXiang_num[i]的随机整数,第i题选择哪个选项
if XuanZe not in TiMu:
TiMu.append(XuanZe) # 把题目的选择放到题目里
temp += 1
TiMu.sort(reverse=False)
elif i == 18:
GeShu = random.randint(1, TiMu_XuanXiang_num[i]) # 随机产生多选题选择的个数
temp = 0
while temp < GeShu:
XuanZe = random.randint(1, TiMu_XuanXiang_num[i]) # 随机生成1到TiMu_XuanXiang_num[i]的随机整数,第i题选择哪个选项
if XuanZe not in TiMu:
TiMu.append(XuanZe) # 把题目的选择放到题目里
temp += 1
TiMu.sort(reverse=False)
else: # 单选
XuanZe = random.randint(1, TiMu_XuanXiang_num[i]) # 随机生成1到TiMu_XuanXiang_num[i]的随机整数,第i题选择哪个选项
TiMu.append(XuanZe) # 把题目的选择放到题目里
if i == 2 and XuanZe == 3:
DiaoCha_Biao.append(TiMu) # 把每个题目的结果放到调查表里
TiMu = [] # 清空题目列表
while i != 17:
TiMu = [0]
i += 1
DiaoCha_Biao.append(TiMu)
elif i == 5 and XuanZe != 1:
DiaoCha_Biao.append(TiMu) # 把每个题目的结果放到调查表里
TiMu = [] # 清空题目列表
while i != 6:
TiMu = [0]
i += 1
DiaoCha_Biao.append(TiMu)
else:
DiaoCha_Biao.append(TiMu) # 把每个题目的结果放到调查表里
TiMu = []
TiMu = [] # 清空题目列表
i += 1
ZongDiaoCha_Biao.append(DiaoCha_Biao)
DiaoCha_Biao = []
yan_shi = random.random()
time.sleep(yan_shi)
print(k + 1)
print(len(ZongDiaoCha_Biao))
# 对数据进行统计
DiaoCha_Biao = []
biao = []
ZongTongJiBiao = np.zeros((21, 8))
for biao in (ZongDiaoCha_Biao):
i = 0
for ti_mu in (biao):
for j in range(1, TiMu_XuanXiang_num[i] + 1):
if j in ti_mu:
ZongTongJiBiao[i][j - 1] += 1
i += 1
print(ZongTongJiBiao)
# 保存数据到excel表格
Data = load_workbook('总统计数据.xlsx')
Data_0 = Data['Sheet1']
Data_0.cell(1, 1).value = '题号'
for i in range(2, 23):
Data_0.cell(i, 1).value = '题' + str(i - 1)
for i in range(2, 10):
Data_0.cell(1, i).value = '选项' + str(i - 1)
for i in range(0, 21):
for j in range(0, 8):
Data_0.cell(i + 2, j + 2).value = ZongTongJiBiao[i][j]
Data.save('总统计数据.xlsx')
Data.close()
print("数据保存完成!")