当前位置: 首页 > 科技观察

我用Python处理30000多条数据,只用了几秒钟..._0

时间:2023-03-21 12:20:35 科技观察

应用场景:工作中经常遇到大量数据需要整合、去重、导出以特定格式。如果用Excel来操作,不仅费时费力,而且不准确。有没有更有效的解决方案?本文以17条txt文本,3万多条数据为例,使用Python连接MySQL数据库实现快速操作。别人加班,我的Python小助手几秒搞定!本文主要包括以下三个方面:数据写入数据去重数据导出写入数据到MySQL数据库下图所示的文件是本文的数据源:我们的思路是:写一个小程序,丢到这个文件夹里,双击后,可以自动读取每个txt文件中的数据,写入数据库。代码如下:importpymysqlimportosconn=pymysql.connect(host='localhost',user='root',password='123456',db='qq',charset='utf8')cur=conn.cursor()cur.execute("CREATETABLEqq(idint(5)NOTNULLauto_increment,qqvarchar(20)NOTNULL,PRIMARYKEY(id));")conn.commit()path=os.getcwd()files=os.listdir(path)i=0forfileinfiles:f=open(file,'r',encoding='UTF-8')next(f)forlineinf:i+=1#print(line)sql="insertintoqq(qq)values(%s);"cur.execute(sql,line)print("Insertthefirst",i,"data!")conn.commit()f.close()cur.close()conn.close()运行效果:关键代码解释:这段代码使用pymysql和os两个库。pymysql:用于操作MySQL数据库;os:用于遍历文件夹中的所有文件。主要代码解释如下:1、遍历任意文件夹下的所有文件名程序写好后,用pyinstaller打包成exe程序,放在要操作的文件夹下。通过path=os.getcwd()命令获取exe文件所在目录。通过files=os.listdir(path)命令,获取exe文件所在目录下的所有文件名,存入files列表中。这样我们就得到了所有的txt文件的名字,你可以任意命名你的txt文件,程序就可以读出来了。2.向数据库写入数据(1)连接数据库,在数据库中新建表A。连接我的qq数据库conn=pymysql.connect(host='localhost',user='root',password='123456',db='qq',charset='utf8')B.新建一张表qq在qq数据库新建一张表,表名为qq,包含2个字段:id字段为主键,自动递增;qq字段是一种用于存储数据的字符类型。cur.execute("CREATETABLEqq(idint(5)NOTNULLauto_increment,qqvarchar(20)NOTNULL,PRIMARYKEY(id))")(2)向数据库写入数据这里使用了两层循环:forfileinfiles:f=open(file,'r',encoding='UTF-8')next(f)forlineinf:i+=1#print(line)sql="insertintoqq(qq)values(%s);"当前。执行(sql,line)print("Insert",i,"data!")conn.commit()f.close()第一层循环用于依次打开以上17个txt文件。第二层循环依次读取每个txt文件的每一行,将换行数据插入到数据库表qq的qq字段中。至此数据导入完成,共计32073条数据。数据清洗这里我们以去除重复值为例简单介绍一下数据清洗。1、新建一张表,用来存放清洗后的数据。可以在cmd窗口登录MySQL,打开qq数据库,执行如下操作:CREATETABLEqq_dist(idint(5)NOTNULLauto_increment,qqvarchar(20)NOTNULL,PRIMARYKEY(id));这样就新建了一张表qq_dist,用来存放清洗后的数据,以备后面调用。2、清理数据并登录MySQL后,进行如下操作:insertintoqq_dis(qq)selectdistinctqqfromqq;将从qq表中找到的唯一qq字段内容插入到qq_dist表中的qq字段中。以特定格式导出数据:将清洗后的数据第101-200行导出为新的txt文本。代码如下:importpymysqlconn=pymysql.connect(host='localhost',user='root',password='123456',db='wxid',charset='utf8')print("写入中,请等待...")cur=conn.cursor()sql="selectwxidfromwd_dislimit100,100;"cur.execute(sql)conn.commit()alldata=cur.fetchall()f=open('data101-200.txt','a')i=0fordatainalldata:i+=1f.write(data[0])f.flush()f.closecur.close()conn.close()print("写入完成,共{}块ofdatahavebeenwritten!".format(i))关键代码解释:1、limitMySQL中limitm,n函数的含义是:从m+1行开始读取n行。因此,本例读取101-200行,限制100、1002,必须加上flush()函数,可以将缓冲区中的数据写入文件。否则会出现生成的txt文档为空白的错误。