智能时代:修BUG时想到的一些东西 LeeRinji

背景提要

理论上来说这篇文章算是两个主题内容的杂糅,如果作为读者的你没有技术背景的话,可以直接跳转到文章的第四部分开始阅读。

最近在做一些数据处理和分析的工作,其中包含一项非常简单的任务:合并N个XLSX文件中的内容(N>50,每个文件大约有20万条记录),并对这N个XLSX文件中的内容进行去重,再对去重后的结果创建新的N个XLSX文件,每个新的文件都对应一个未去重的原文件。

实际上这件工作确实是非常简单,所有的功能都有现成的实现,不过在创建新XLSX文件的时候我是这样完成代码的:

def create_xlsx_file(data,path,filename):
    writer = pd.ExcelWriter(path+filename)
    data.to_excel(writer,'Sheet1')
    writer.save()

而这样的处理代码实际上遇到了以下的几个问题:

  • 1.XLSX格式文件中不能包含超过65530个不同的URL(这个问题让我想到了英国政府因为Excel行数限制漏报一万多个病例的经典故事)。
  • 2.尽管在创建文件的时候没有问题,但是当我打开被创建的文件时,Excel会提示“部分内容有问题”,而在Excel执行自动修复之后,会提示“已删除的记录: /xl/worksheets/sheet1.xml 部分的 公式”。

发现问题与解决问题

其实一开始我只碰到了上面的第二个问题,而为了解决这个问题我尝试在Google和Stackoverflow输入了多种不同组合的关键字,可能是因为搜索内容不得法,我并没有找到正确的解决方法。当时的我只怀疑这是函数内参数设置不正确所引发的问题,于是我决定使用了不同的engine去生成XLSX文件。

然后,我同时拥有了上面说的第一个和第二个,一共两个问题。

显然我反向修bug了,于是我决定把参数再设置回去,不过这并没有解决第一个问题。相反,即使是设置回去以后,我生成的每个文件都会同时产生两个问题。

好在第一个问题在Stackoverflow上有解决方案,既然XLSX格式不允许文件内存在超过65530个URL,那么我们可以在写入时将这些URL视作是字符串,而非URL,这样就可以规避掉对URL数目的限制,对应的代价则是生成的XLSX文件中的“链接”不再能够跳转。

对应的代码很简单,只要在函数内添加以下的options参数就可以了(如果只看文档的话,是意识不到这里还有options参数的,文档根本没提还有这个参数)。

writer = pd.ExcelWriter(path+filename,options={'strings_to_urls': False})

在解决第一个问题之后,换了一个思路去搜索第二个问题的解决方案,成功在枪版Stackoverflow上找到了解决第二个问题的方法,修复的方法与解决第二个问题的方法是类似的。

顺便提一句,尽管没有报错,但是我意识到Excel可能会将我写入文件中的诸如“0004”之类的文本自动转换为“4”这样的数字,所以我顺手多加了另外一个options参数。

实现代码

说实话这些bug一点都不困难,在找到问题的根源之后,修改代码去解决这些问题是不需要几秒钟的,这也是我在标题里说修复的是“愚蠢的BUG”的原因。

import numpy as np
import pandas as pd
import csv

def create_xlsx_file(data,path,filename):
    writer = pd.ExcelWriter(path+filename,options={'strings_to_urls': False,"strings_to_formulas" : False,"strings_to_numbers":False})
    data.to_excel(writer,'Sheet1')
    writer.save()
def create_many_xlsx_file(loc,data,path,filename_tail):
    for i in range(loc):
        filename=str(i)+filename_tail
        create_xlsx_file(data.loc[i],path,filename)
create_many_xlsx_file(N,dnew_data_merge,path,".xlsx")

脱离时代的我

产生这两个bug的原因其实主要在我身上,我自己代码写得不够好,而Excel又太智能了。我以为我创建的输入就会是最终的输出,然而Excel的智能让我的想法是非真的,它对输入的自动转化导致了输入与输出的不等价,进而引发了bug。

我真正想聊的东西其实是从这里才刚刚开始的。

其实我总是时不时怀疑自己是个脱离时代的人,帮别人改过简历,看到技能那一栏写着“熟练使用MS Office套件”的时候我总是心里有点波澜,因为我是真的不会用Excel和Word的,我到现在也没明白怎么设置段落缩进,怎么用Excel公式做运算。如果不是要打开别人发给我的文件,我一年也开不了这两个软件几次。现在大家听音乐用的要么是网易云,要么是QQ音乐,这两个软件我都没有在用。还有好多朋友在写公众号,其实我开过公众号想写些东西,但是后台设置太复杂、加上也不懂文章的排版,后来我就把公众号关掉了,直到关掉之前都没在公众号上写任何东西。

更不必说抖音、微博这些软体,腾讯视频、爱奇艺这些视频网站我也很多年没有看了,所以要是和我聊些明星之类的话,大概我是谁也不知道(杨超越、蔡徐坤我还是认识的,其他人是真的不知道)。

就连我平常玩的游戏也是,我现在玩的游戏和我刚进大学时玩的一模一样,星际2和围棋,围棋的生命力还很长,我应该能下一辈子,但是星际2好像是离它生命终点不远的样子了,那时候我下棋累了的时候去玩什么呢?

都有点不敢想。

我喜欢用的东西、看的东西、玩的东西,都没有那么智能,或者说,都很简单。

Excel对我来说是个很复杂的东西,比如它的自动格式转换和填充功能就让我觉得很难使用,它的公式也没有我想的那么直观。实际上,当我收到一份需要进行处理和运算操作的文档的时候,我宁愿用python对它做处理操作,也不愿意用Excel内置的功能去处理它。当我自己在python里写代码的时候,我是清楚的知道自己在做什么的,但是我搞不懂Excel会用什么办法去做我以为它在做的事情。我觉得我输入的是什么,Excel内存储和计算的就应该是什么,但事情并不总是这样的。

Word也是同样如此,应该是因为我使用技巧的问题,我用word排版出来的文章总是不美观,还很难从整体上调整全局的排版设置,而且经常会有差半个字符位置的情况出现。为了避免这种问题,我现在编辑纯文字的时候会去用notepad++或者visual studio code,写文档或者作业的时候用LaTeX(overleaf),这让我觉得省心多了。实际上我在中山大学的时候就是用的LaTeX写的毕业论文,前段时间申请时用到的CV和Research Proposal我也是用LaTeX排的。且不论内容怎么样,我总觉得自己用LaTeX排出来的内容,自己看着都信心多一些。

网易云对我来说也太过于复杂了,现在的网易云不仅能听音乐,还有“视频”、“云村”这些东西,搞得我都不太明白了。一个听音乐用的软件为什么需要社交功能呢?一开始我还能忍受很复杂的页面,但到后来我就接受不了这些对我来说过于臃肿的功能了。最后,到李志的歌因为政治原因从网易云下架的时候,我就开始慢慢切换到用Youtube Music了,没有社交功能,没有横幅广告,甚至连评论功能都没有,我很喜欢这种软件。顺便提一句,我觉得支付宝也过于臃肿了,在健康码推行之前我只用它来收钱付钱和还信用卡,我不觉得它需要提供养鸡、浇水之类的农场游戏,如果可以的话,我想下载一个只有精简功能的支付宝版本。

我没有太多资格讲公众号怎么怎么样,因为我只是看过后台几次,觉得太麻烦就关掉了公众号。我建一个自己的博客是因为想有些东西写,但又不想遵守微信定下来的各种各样的规矩,“这是我的文字,我应当对它具有完全的权利,别人没资格删除我的文字,或者对里面的内容做出各种各样的要求”,我的想法就是这么简单和单纯。建一个像这样的博客一点也不麻烦,半天就能搞定,上传一篇新的文章也很方便,考虑公众号的各种条条框框(评论区啦、文章的修改啦),我不觉得公众号是博客的进化形式,我觉得这更像是一种倒退。

尽管我更喜欢用这些工具和软件,但是这些东西好像一点也不流行。互联网应该是前进的吧,那这样的话,落伍的应该是我才对。

其实我很希望现在还是十年以前的那种状态,翻看上古时代论坛留下来的帖子,那时交流讨论的环境要比现在更好,从前软件的功能也很简单,我总觉得现在的软件都太智能、太复杂了,我开始有点抗拒它们了,如果不回到十年以前的话,回到五六年前也好。

差不多就这样吧,以前讨论过其他的问题,单神说了句话让我记到现在:

我:“有句话说父母并不是怀旧,只是一如既往喜欢二十岁时喜欢的东西。”

单神:“对呀,喜欢就好了,为什么一定要跟上时代呢?”