用python完成问卷信息的处理

给自己找到一个活。

背景资料:

毕业季过去,大学里会收集毕业生的一些基础信息以便建立校友网络。我所在的大学采用问卷星来收集毕业生的联系方式和毕业去向,并且要求证件照以在民政局备案校友组织成员。获得的问卷数约有1000条,附带近2000个图片文件。

特殊情况:

问卷有两个版本,第一个版本在发布后有了几十份的数据,工作人员更改了问卷,简化了需要提交的信息数量,他们采用的方式是更改原有的问卷,导致原来问卷的数据不再储存于网站服务器端 ,在更改问卷前,工作人员把原来的数据导出成Excel文件。

需求:

将数据从问卷星网站导出,整合成一个Excel文件,要求每一个学号只能出现一次,格式信息不正确的不输出。

将身份证照片从网站导出并且按照学号作为一个文件夹下的两张照片。

计划阶段:

数据格式分析

下载问卷星网站的两份文件,一份含有所有图片的文件夹,两个Excel文件(称为较新版表格A,较旧版表格B)

每个表格中的列顺序是不同的。

每个表格包含的内容是不同的(新版没有QQ号和微信号,只有手机)

数据有重复部分,有的毕业生会提交第二次。

数据有无效部分,只要提交的数据没有身份证正反面照片,学号不符合长度标准,则视为无效。

所有照片以网址链接的形式存在,网址的长度大约为200位。

文件夹中的

表格A

表格B相关功能包查找、学习、使用

我之前没有做过类似的任务,不了解如何使用相关功能。还好有python几乎全能的第三方库和Google。

操作excel文件:

xlrd,xlwd,xlutil 这三个包。可以完成对Excel文件的读取、写入。

#读取文件

newer = xlrd.open_workbook(newer_uri)

#写入文件

wb = xlwt.Workbook()

outsh = wb.add_sheet('A')

wb.save('result.xls')

字符串匹配:

python find 函数

i['url1'].encode('utf-8').find(shortcut,0)>0

find 函数可以确定一个字符串是否在另一个字符中。并且返回一个数值,如果不匹配,则返回-1,如果匹配就返回第一个匹配字符开头的位数。

数据的过滤:

我对数据的处理是渐进的,到了数据处理的步骤,先解决的是如何融合两份文件的问题,首先我希望自己处理的结构是一份列表,这样我就可以遍历它,以进行查找、过滤的操作。

然后查找两份问卷里面都有的信息,比如id,名字…这些东西才是我需要保留的。

实际过滤的流程是下图的样子

数据过滤(第一版)

图片文件处理

图片文件处理,经过对图片网址和文件的多次研究,发现文件名对应网址的一部分。先根据过滤后的数据集来建立id对应的文件夹。再移动匹配好的图片到相应的文件夹中。

整体图片文件有3GB大小。在图片文件处理过程中出现了最多的问题。

以上是在正式开始写代码之前做的分析和计划。真实写完代码运行后,bug诞生了,还有一些需求冒出来了。进入了再分析阶段。

再分析阶段:

需要保证没有遗漏、没有重复的录入数据,要向甲方证明没有问题。将程序的过程中的中间变量输出,把去除掉的数据都存储起来,以便追踪。

文件处理阶段是没有考虑到进行异常处理的,导致代码逻辑出bug的时候,直接中断了运行,没有遗留下能够提供报错的信息。每次文件处理都需要将3G大小的文件夹从备份处复制出来,上十次的重复读写对于SSD硬盘的读写磨损还是比较高的。

在改进的报错信息提示下,发现有些图片名称是含有中文的,在网址中则以转码的方式表现出来,如果使用全文匹配,会有一些文件不能匹配。再次观察发现所有图片文件是以序号为开头的,不管后面的原来的上传文件是什么,问卷星网站都会对同一份问卷下的附件添加序号前缀。我使用了一个五位长度的字符串变量shortcut来表示文件的序号,再次测试后,发现由于网址很长,可能会出现前面的字符串中的某一部分和序号部分重复,比如”63_8_”,后来通过观察,在需要识别的字符串上添加了%3d,解决这个问题。

部分网址样式

数据过滤(第二版)

debug:

遇到的bug算是比较多的,因为第一次写这种类型的脚本。基本上可以分为三种类型的bug

逻辑bug

逻辑bug是硬伤,也是思考不够全面导致的。其中对文件操作的部分是影响最大的,进行了5,6次的测试,硬盘花销很多,但总是每个文件夹里面就只有一张照片,知知道我请到一位同学来帮我check一下代码,花了一个小时才明白自己的一个if语句逻辑的错误。

if i['url1'] not in downloadlist or i['url2'] not in downloadlist:

downloadlist.append(i['url1'])

忽略了一旦一张图片进入了文件夹,这个if语句就不会被激活,后来简单的把语句分成两个if语句,downloadlist从一个数据项变成了网址的项。

文本编码bug

使用python 2.7 版本,这个版本对于str和unicode的关系让我混淆,而且print语句对于数字类型和字符串类型的连接是不直接支持的,很少使用python的我,在开始写的时候,遇到这些问题,Google了,报错了,更改。

网址的中文显示不是unicode,而是百分号加两个十六进制数字,在已经进入实际运行的时候报错。

文件操作bug

开始为了偷懒,没有写文件处理的异常处理,导致接连几次程序中断。后来加上了异常发生时提交最后状态的信息。

总结:

代码应该先在心里,

git 的使用还是不太清楚,导致想上传到github中还得进行二次处理去掉一些信息。

本次最难点是路径匹配,和网址规则的发现。

写代码格式化是省时间,开始时随性的写,到时候改可没那么轻松了。

注释很重要,毕竟写了后,只要过几天,可能作者都记不得当时这个变量做什么作用,这段代码的逻辑是什么了。

模拟运行,是我新学到的教训。如果运行一次需要消耗巨大的成本,为什么不在测试阶段进行逻辑测试和小样本测试排除bug呢?这样可以节省很多资源。

final Version:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180819G03OCL00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券