,给大家分享了SQL和EXCEL效率提升的小窍门。链接在文章末尾。今天给大家分享一下用了很多年的python提高效率的方法。此法是某位古神教我师父,师父教我的。我们平时运行数据的时候,可能会将数据结果存储在txt文件中。不知道大家平时是怎么处理txt文件里面的数据的。我相信所有的学生都有自己的方法。使用python的pandas包或者把数据塞入数据库,然后使用sql等。无论使用哪种方法,在处理数据的时候都有很多常用的方法,比如where、join等,可以先把这些常用的方法写成python脚本,需要处理的时候直接用脚本处理txt文件txt文件文档的数据。好处是节省了在txt和数据库之间来回折腾数据的时间,也节省了使用pandas读取数据和编写脚本的时间,可以快速方便的验证和处理数据。在举例子之前,首先要介绍一下linux中“管道”的概念。熟悉linux的人应该对这个概念不陌生。符号是“|”。管道的作用是连接多个命令,比如命令:catdata.txt|wc-l的意思是查看data中的数据个数,其中“|”是管道,catdata.txt的输出作为wc-l的输入。综上所述,只要第一个命令写入标准输出,第二个命令从标准输入读取,那么这两个命令就可以形成一个管道。同样,我们可以将输出传递给带有.了解了管道的概念之后,我们就开始吧。案例数据如下:data1.txt记录了用户的id和年龄,data2.txt记录了用户的消费信息。首先,我们编写一个实现where函数的python脚本。脚本如下:where.py#!/usr/bin/envpython#-*-encoding:utf-8-*-importsysimportreimportcutmodedefwhere(col,cmpexpr,val,cmptype):sw={'>':lambday,x:y>x,'>=':lambday,x:y>=x,'<':lambday,x:y,>=,<,<=,=,!=)val表示要比较的数字cmptype表示数据类型。我们过滤24岁以上的用户。指令和结果如下:catdata.txt|pythonwhere.py1'>='25intjoin.py#!/usr/bin/envpython#-*-encoding:utf-8-*-importsysimportredefmakeJoin(joinfields,file_list=[]):dict={}file_last=open(file_list[-1])k,v=joinfields[-1].split(':')k,v=int(k),int(v)forlineinfile_last:sps=re.split('\s+',line)iflen(sps)>=max(k,v):val=sps[v]ifv>=0else''dict.setdefault(sps[k],val)file_last.close()foriinxrange(len(file_list)-1):fd=open(file_list[i],'r')field=joinfields[i].split(':')[0]fordatainfd.readlines():attr=re.split('\t',data.strip())iflen(attr)<=int(field):continuejoinid=attr[int(field)]appendix=dict[joinid]ifjoinidindictelse'noright'printdata.strip()+'\t'+appendixfd.close()if__name__=='__main__':joinfields=sys.argv[1].split(',')file_list=sys.argv[2:]makeJoin(joinfields,file_list)加入下面两个数据,计算每个用户的年龄和对应的费用指令如下:pythonjoin.py'0:1,0:1''data1.txt''data2.txt'第一个0:1表示data1.txt的链接主键是第0列,后面的value是第1列,第二个0:1表示data2.txt的链接主键是第0列,value是第1列,data1.txt和data2.txt分别是要链接的文件。select.py#!/usr/bin/envpython#-*-encoding:utf-8-*-importsysimportredefcut(files,col1,col2):col1=int(col1)col2=int(col2)f=openforlineinsys.stdin:line_list=line.split()if(len(line_list)>=max(col1,col2)):ifcol1>=0andcol2>=0andcol1<=col2:print("\t".join(line_list[col1:col2]))else:print("参数输入错误")else:print("参数超出范围")if__name__=="__main__":col1=sys.argv[1]col2=sys.argv[2]cut(col1,col2)取出带cost的用户id,指令如下:col1:起始列col2:结束列pythonselect.py01data2.txt综合使用选择data1中支付过且年龄大于35的用户idpythonjoin.py'0:1,0:1''data1.txt''data2.txt'|pythonwhere。py2'!='nullstring|pythonwhere.py1'>'35int|pythonselect.py011215917473