关于python向mysql插入数据和缺失的字段的一种方法

本文讲述了作者在爬虫工作中遇到的问题,包括如何处理两个txt文件中的四个字段,以及如何将这些数据插入到MySQL数据库,涉及数据清洗、SQL操作和自增主键的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       虽然有点跳脱,从Aconda直接跳到爬虫,但是作者目前从事爬虫工作(非大学专业,属自学,基础相当不扎实),在将已经爬取好的txt文件导入到mysql时遇到了以下的问题:

1、首先我已经爬取了需要的四个字段,但是分别存放在两个txt文件中,因为爬取的时候,这四个字段分别在根页面和子页面中,所以使用了两个txt分别进行存储,如图:

 图1:四个字段在两个txt文件里面的分布

2、然后接下来,我需要将这个四个字段全部塞进一个表中,这个表长这样:

图2:表的结构

从左到右分别是自增的主键col_id,col_name(名称字段),col_address(地址字段),col_city(城市字段),col_countrys(国家字段)。

3、我第一时间是使用insert方法先将只有单独一个字段的名称字段先塞进去,但是首先要将名称字段塞进咱们的python中,使用的代码是这样:

import os#两个可能需要的相关库
import sys
file_coltd=open(r'txt文件路径','r',encoding='utf-8')#三个属性分别是,路径,读写模式和编码格式,一个都别少!!
lines_coltd=file_coltd.readlines()#将txt文件按照行进行读入

图3:读取文件,按行读取

 4、由于txt文件内我的数据存储格式是一行然后回车然后又一行,那实际写出去的时候也会是这样的,其中"\n"就是回车的符号:

 图4:读入的数据有“\n”这样的制表符

这种制表符吧,出现在这个地方还是很不舒服的,所以之后要想办法去掉,同时这个地方还有个忠告,就是每次做类似于这样的数据清洗的时候,每个文件存放的数据方式是不一样的,不能完全照抄这个文章,如果说这后面跟着的不是“\n”而是逗号呢?这就要我们具体问题具体分析,接下来提供一个可行的框架。代码如下:

for i in lines_coltd:
    sql_insert="insert into coltd(col_name) values (%s)"
    #%s为占位符,它的作用就是你在exexute这个命令中的变量会出现在这里,比如这里,就是下一句的i变量
    #代入到这个%s,而且是按照顺序的,不一定只有一个%s,出现两个则execute中就要有两个对应的变量。
    cursor.execute(sql_insert,i)
    #其中第一个变量一定是sql语句,不然后面的变量是不知道要占据哪一个语句中的占位符的
    conn.commit()
    #提交,完成一次数据的插入,conn是数据库链接变量啊,不是cursor

5、执行完上述代码之后,数据库就完成了对名称字段的插入就会变成这个样子:

图5:完成名称字段插入后

由于col_id是自增的,所以每插入一条数据,就会自动补齐,然后现在就是重头戏,如何对后面三个字段进行插入呢?不能直接使用insert这个语句了,需要使用一些判断语句了我是用的sql语句是update,也就是更新,代码公式是这样的:“update ‘数据表名’ set ‘字段名’ where ‘主键’=?”使用的代码如下:

insert=[]#在提取数据的时候发现,如果使用lines按行提取,一行的数据就会被作为一个元素输出
#这样不符合需求,所以先将其输出到一个变量中,然后使用数组承接,然后再使用split进行分割,从而
#获得单个的数据。
id=1
for i in range(len(lines)):#按照txt文本的行数,按行读取数据,这里就是读取第一个元素,
    #(这个元素里有我需要的三个字段)
    str=lines[i]
    insert=str.split(',')#split按照“,”将元素切分,塞进这个队列中
    a=insert[0]#这个就是地址字段
    b=insert[1]#这个就是城市字段
    c=insert[2]#这个就是国家字段
    sql_address='update coltd set col_address="%s" where col_id="%s"'
    #插入地址字段需要的sql,其中通过for循环插入时,以主键作为插入关键词
    sql_city='update coltd set col_city="%s" where col_id="%s"'
    #插入城市字段需要的sql,update后面的coltd是表名,set后面是字段名
    sql_countrys='update coltd set col_countrys="%s" where col_id="%s"'
    #插入国家字段需要的sql
    param_address=(a,id)#将需要的数据塞进元组,元组会按顺序被读入
    param_city=(b,id)
    param_countrys=(c,id)
    id=id+1#col_id+1,也就是跳到下一行写
    cursor.execute(sql_address,param_address)#执行sql语句
    cursor.execute(sql_city,param_city)
    cursor.execute(sql_countrys,param_countrys)
    conn.commit()#提交
    insert.clear()#每完成一行数据的插入就要清空一次,不然就会重复写入数据
id=1

 如果执行的很快,说明上面的file读入被不知名原因关闭了,需要再执行以下,以上代码不能直接粘贴使用,需要仔细阅读备注,修改变量为所需写入的变量才能成功,所以写代码还是要多思考。

6、执行完成第五点的代码之后,数据库就写入完成了,如图:

图6:完成空缺字段的写入,数据库完整


这些问题都是作者在发布的时候遇到的问题,搞了两个小时才明白其中缘由,所以,代码要多想多练。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值