【Python实现调查问卷数据统计】 |
您所在的位置:网站首页 › 纸质问卷的数据结果如何统计 › 【Python实现调查问卷数据统计】 |
一、背景
系统发出调查问卷,问卷的填写记录入了数据库,现在需要对用户的调查问卷填写情况进行统计。 这里使用Python对数据进行简单的处理,并将统计结果保存为excel文件。 二、连接MySQL查询数据因为数据存储在MySQL,我使用pymysql库连接数据库。 这里编写了三条查询SQL语句,将数据分为三部分:调查问卷基本信息、调查问卷填写详情、调查问卷问题和选项。 将这三部分数据保存在一个列表中,方便后续处理。 import traceback from pprint import pprint import pymysql import yaml def data_detail(dbinfo, survey_name): """ 连接数据库查询详细数据,保存为excel :param dbinfo: 数据库连接信息 :param survey_name: 调查名称 :return: 数据库查询结果 """ # SQL列表示例 sql_list = [f'调查问卷基本信息查询SQL:select * from table1 where name={survey_name}', '调查问卷填写详情查询SQL', '调查问卷问题和选项查询SQL'] data = [execute_sql(dbinfo, sql) for sql in sql_list] return data def execute_sql(dbinfo, sql): """ 连接数据库,执行sql查询语句,返回查询结果 :param dbinfo: 数据库配置信息 :param sql: 数据库查询语句 :return: """ try: conn = pymysql.connect(**dbinfo) # 连接数据库 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 数据库游标 cursor.execute(sql) # 执行sql语句 results = cursor.fetchall() # 查询结果 conn.close() # 关闭数据库连接 return results except Exception as err: info = f"出了点小问题!\n{repr(err)}\n{traceback.format_exc()}" print(info) def yaml_read(filename): """ 读取yaml文件 """ with open(file=filename, mode="r", encoding="utf-8") as f: data = yaml.safe_load(f.read()) return data if __name__ == "__main__": db_info = yaml_read('cfg_mysql_test.yaml') datas = data_detail(db_info, '调查问卷数据统计测试') pprint(datas)运行结果: 将查询的数据结果保存到同一个excel表格中,用于后续分析统计。 先看一下查询的数据结果示例:[[{k:v,k:v},{k:v,k:v}],[{k:v,k:v},{k:v,k:v}],[{k:v,k:v},{k:v,k:v}]] 从内到外:字典-列表-字典 这里我做了如下处理: 1.使用xlwt模块写入数据 2.查询结果写入到同一个表格的多个工作表 3.xlwt.xfstyle()设置表格的样式:表头、表格、时间数据 import datetime import os import time import traceback import xlwt def to_excel(data, sheet_name=None, file_name=None): """ 数据写入excel :param data: 数据查询结果 :param sheet_name: 工作表名称 :param file_name: excel文件名称 :return: """ try: book = xlwt.Workbook(encoding='utf-8') # 新建工作簿 new_datas = data_pre_handle(data) # 预处理数据 if sheet_name is None: sheet_name = ["new_sheet" + str(i + 1) for i in range(len(new_datas))] write_data(book, new_datas, sheet_name) # 数据写入工作表 save_excel(book, file_name) # 保存工作簿 except Exception as err: info = f"出了点小问题!\n{repr(err)}\n{traceback.format_exc()}" print(info) def save_excel(workbook, file_name=None): """ 保存工作簿 :param workbook: 工作簿 :param file_name: excel文件名称 :return: """ if file_name is None: sj = datetime.datetime.now().strftime("%Y-%m-%d %H%M%S") name = sj + ".xlsx" else: name = file_name + ".xlsx" workbook.save(name) cur_file = os.path.dirname(os.path.abspath(__file__)) + os.sep + name # 当前excel的保存路径 print(f"excel保存成功!【{cur_file}】") def data_pre_handle(data): """ 预处理数据库查询到的数据 :param data: 数据查询结果 :return: """ return [[list(v[0].keys())] + [list(val.values()) for index, val in enumerate(v)] for i, v in enumerate(data)] def write_data(workbook, data, sheet_name): """ 数据写入sheet :param workbook: 工作簿 :param data: 要写入的数据 :param sheet_name: 工作表名称 :return: """ try: for index, value in enumerate(data): sheet = workbook.add_sheet(sheet_name[index], cell_overwrite_ok=True) # 新建sheet size = [12 for i in value[0]] head_style = style_head(sheet, size, wrap=1, is_bg=1) # 定义表头样式 time_style = style_table_time() # 时间内容样式 normal_style = style_table_normal({"horz": "CENTER", "vert": "CENTER"}) # 普通内容样式 for col, val in enumerate(value[0]): sheet.write(0, col, val, head_style) print(f"写入表头成功!{value[0]}") for i, v in enumerate(value[1:]): for co, va in enumerate(v): val = str(va) if is_date(val): if len(val) > 19: new_val = datetime.datetime.strptime(val, "%Y-%m-%d %H:%M:%S.%f") elif 10 < len(val) 19: new_val = datetime.datetime.strptime(val, "%Y-%m-%d %H:%M:%S.%f") elif 10 < len(val) 19: new_val = datetime.datetime.strptime(val, "%Y-%m-%d %H:%M:%S.%f") elif 10 < len(val) |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |