在日常生活中,经常会碰到需要统计QQ或微信群接龙数据的情况,这就需要把接龙的消息文本转换成一个Excel表格。然而,将每个人的接龙信息逐个复制到表格中的操作非常繁琐。并且发起人无法保证每个接龙人都严格按信息格式回复,面对五花八门的接龙文本,处理起来非常麻烦。所以我想要写一个将文本转换成Excel表格文件的工具(图1)。
01
操作思路
首先,用户输入文字形式的表格,用分隔符分隔每一列的内容。接着,程序会遍历每行内容并按照用户输入的分隔符将每一行分隔成若干列,然后通过openpyxl库将其写入到Excel表格中。
由于文字表格中每行末都有回车(或换行),所以用控制台输入数据就显得不那么简便了。因此,这个转换工具需要GUI界面。
界面设计
在GUI界面中,我们通过输入框(Entry)和文本框(Text)两个控件来获取数据。在微信接龙的场景中,一个大群可能有上百人,那么接龙数据就有近百行。此时,必然需要滚动条(Scrollbar)控件,方便浏览和编辑多行的文字表格(图2)。
这里使用的是简洁易用的tkinter库进行GUI编程,并使用网格布局模式(grid)对窗体中的控件进行布局。以下是grid布局中的一些常用属性(表1):
参数
意义
row
组件在窗体表格中的行数
column
组件在窗体表格中的列数
ipadx/ipady
内边距,即组件横向/竖向拓宽的长度
padx/pady
外边距,即组件与横向/竖向表格线的距离
rowspan
组件竖直方向占据的行数(默认1个组件占用1行)
columspan
组件水平方向占据的列数(默认1个组件占用1列)
sticky
对齐方式,N(上对齐)、S(下对齐)、W(左对齐)、E(右对齐)
在grid布局中,padx属性接受两种类型的参数。此处可以传入一个整数a作为参数,表示组件左侧与右侧与相邻的表格线都相距a个单位;也可以传入一个元组(a,b)作为参数,表示组件与左侧表格线相距a个单位,与右侧表格线相距b个单位。若以元组(a,b)作为pady属性的参数,则表示组件与上部的表格线相距a个单位,与下部的表格线相距b个单位。ipadx和ipady属性也有同样的规则。另外,在sticky属性中,四种对齐方式可以组合使用(使用加号连接),如N+S代表组件上下填充到表格框的顶端和底端,N+S+W则表示将组件竖直方向上从底部填充到顶部并左对齐。
文字到表格的转换
在“转换”按钮的事件响应函数convert中,用get方法对输入框和文本框中的内容进行了取值,并将其传入process函数进行处理。而process函数的工作就是利用传入的两个字符串(分别表示文字表格和分隔符)获取每个单元格的内容并输出到文件中(图3)。
因为get方法在获取文本框控件的内容时,末尾可能会多一个换行符,所以需要用到strip方法去除文本末尾多余的换行符。然后对处理完的字符串再使用split方法,它可以按照指定的分隔符将一个字符串分割成若干部分并返回一个列表。这里以\n(换行符)为分隔符,就是将每行的内容分割成一个元素。
接着使用双层for循环遍历表格的每一行和每一列。在外层循环中,遍历上文所述的分割后返回的列表,然后按照指定的列分隔符再次使用split方法进行分割,得到的结果便是每个单元格的内容了。在内层循环中,遍历第二次分割后返回的列表,用Workbook(openpyxl模块中的表格对象)的cell方法将每个单元格的写入Excel表格中。
值得注意的是,openpyxl创建的Excel表格的行数是从1(而不是0)开始的,因此在使用cell方法时,需要注意内循环和外循环中计数变量的值与行数的对应关系。
02
实用改进
在接龙时遇到不符合预设格式的消息,该如何处理呢?(图4)
在代码开头导入re(正则表达式)模块,并在第二次分割时使用该模块中的split方法就行了。re.split方法有两个必选参数pattern和string,分别表示分隔符和要进行分割的字符串,pattern可以是正则表达式,会按照给定的表达式来匹配分隔符;若pattern接收到的参数是不含正则表达式的普通字符串,则功能与内建函数split相同。
(代码请在壹零社公众号下载)
邮发代号:77-19
单价:8元,年价:408元
编辑|张毅
审核|吴新
爆料联系:cpcfan1874(微信)
壹零社:用图文、视频记录科技互联网新鲜事、电商生活、云计算、ICT领域、消费电子,商业故事。《中国知网》每周全文收录;中国科技报刊100强;2021年微博百万粉丝俱乐部成员;2022年抖音优质科技内容创作者
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.