热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

多线程将excel数据写入mysql

1.总计有27个excel表的数据,


1.总计有27个excel表的数据,

多线程将excel数据写入mysql - 文章图片

将sheet2的前两列的数据写入mysql

多线程将excel数据写入mysql - 文章图片

2.查看有多少条数据,总计22245条

# -*- coding: utf-8 -*-
# @Time : 2020/3/10 11:09
# @Author : 结尾!!
# @FileName: 统计原始数据总计有多少.py
# @Software: PyCharm
import os
import pandas as pd
excel_list=os.listdir('./日本站分类树/')
print(len(excel_list))
count_row=0
for file_one in excel_list:
print(file_one)
# 打开第二个sheet表
df1 = pd.read_excel(f'./日本站分类树/{file_one}', encOnding='utf-8', sheet_name=1)
print(df1.shape)
count_row+=df1.shape[0]
print("总计有%d条数据"%count_row)

多线程将excel数据写入mysql - 文章图片

3.新建数据库以及表,这里我使用的是,Navicat建的表。数据库就是create database classify ;

多线程将excel数据写入mysql - 文章图片

表的结构如下。

多线程将excel数据写入mysql - 文章图片

4.写入数据库,我开了两个线程。代码如下;

# -*- coding: utf-8 -*-
# @Time : 2020/3/10 10:48
# @Author : 结尾!!
# @FileName: 02-写入日本站分类树.py
# @Software: PyCharm
import pandas as pd
import os
import pymysql
def query_data(sql_str):
# 连接数据库
cOnn= pymysql.connect(
host='127.0.0.1',
user='root',
port=3306,
password='1234',
db='classify', #类目的数据库
charset='utf8'
)
# 创建游标
cursor = conn.cursor()
# 书写sql语句
# #执行sql语句
try:
cursor.execute(sql_str)
# 提交连接
conn.commit()
except:
conn.rollback()
# 关闭游标,关闭连接
cursor.close()
conn.close()
def task1(excel_list):
for file_one in excel_list:
print(file_one)
# 打开第二个sheet表
df1 = pd.read_excel(f'./日本站分类树/{file_one}', encOnding='utf-8', sheet_name=1)
print(df1.head())
for index,each in df1.iterrows(): #读取dataframe的每一行的值
try:sql_str= "INSERT INTO Japan (node_id, node_path) VALUES ( '%s' ,' %s');"%(str(each.iloc[0]),each.iloc[1])print(sql_str)query_data(sql_str) #执行sql语句
except Exception as e:print(e)
def task2(excel_list):
for file_one in excel_list:
print(file_one)
# 打开第二个sheet表
df1 = pd.read_excel(f'./日本站分类树/{file_one}', encOnding='utf-8', sheet_name=1)
print(df1.head())
for index,each in df1.iterrows(): #读取dataframe的每一行的值
try:sql_str= "INSERT INTO Japan (node_id, node_path) VALUES ( '%s' ,' %s');"%(str(each.iloc[0]),each.iloc[1])print(sql_str)query_data(sql_str) #执行sql语句
except Exception as e:print(e)
#使用多线程进行
import threading
excel_list=os.listdir('./日本站分类树/')
print(len(excel_list))
#线程执行的函数名不能一样。
t1 = threading.Thread(target=task1,args=(excel_list[:12],) )# 线程一,Thread函数有两个参数,第一个是要调用的线程函数,第二个是要给所调用的线程函数所传的参数,以元组的形式传入,如果只有一个参数,则必须在后面加上一个',’ ,要不会报错。
t2 = threading.Thread(target=task2, args=(excel_list[12:],))# 线程二
t1.start()# 开始线程一
#  t1.join()
t2.start() # 开始线程二

运行如下:

多线程将excel数据写入mysql - 文章图片

最后插入了21728条数据。

多线程将excel数据写入mysql - 文章图片

4.数据少了517条。

查找什么原因,看一下少的是哪些数据。


import os
import pandas as pd
excel_list=os.listdir('./日本站分类树/')
print(len(excel_list))
import pymysql
def query_data(sql_str):
# 连接数据库
cOnn= pymysql.connect(
host='127.0.0.1',
user='root',
port=3306,
password='1234',
db='classify', #类目的数据库
charset='utf8'
)
# 创建游标
cursor = conn.cursor()
# 书写sql语句
# #执行sql语句
try:
cursor.execute(sql_str)
# 提交连接
conn.commit()
data = cursor.fetchall()
except:
conn.rollback()
# 关闭游标,关闭连接
finally:
cursor.close()
conn.close()
return data
for file_one in excel_list:
print(file_one)
# 打开第二个sheet表
df1 = pd.read_excel(f'./日本站分类树/{file_one}', encOnding='utf-8', sheet_name=1)
print(df1.shape)
for index, each in df1.iterrows(): # 读取dataframe的每一行的值
try:
sql_str = "SELECT * FROM Japan WHERE Node_id=%s ;" %(str(each.iloc[0]))
# print(sql_str)
res=query_data(sql_str) # 执行sql语句
# print(res)
if len(res)==0:print(sql_str)
except Exception as e:
print('错误',e)

对数据库数据进行查找,发现是下面的excel中的数据没有。

jp_books-gurupa-us-subtier_browse_tree_guide.TTH.xls ,少了数据

多线程将excel数据写入mysql - 文章图片

进检测,就是少了这一个表格中的数据。

多线程将excel数据写入mysql - 文章图片

6.下面进行重新写入。

并将异常跑出查看,,由于字符的引号导致的。

多线程将excel数据写入mysql - 文章图片

多线程将excel数据写入mysql - 文章图片

将代码重新修改了,之后正常写入了。

import pandas as pd
import os
import pymysql
def query_data(sql_str):
# 连接数据库
cOnn= pymysql.connect(
host='127.0.0.1',
user='root',
port=3306,
password='1234',
db='classify', #类目的数据库
charset='utf8'
)
# 创建游标
cursor = conn.cursor()
# 书写sql语句
# #执行sql语句
try:
cursor.execute(sql_str)
# 提交连接
conn.commit()
data = cursor.fetchall()
except:
conn.rollback()
# 关闭游标,关闭连接
finally:
cursor.close()
conn.close()
return data
def increase_data(file_name):
df1 = pd.read_excel(f'./日本站分类树/{file_name}', encOnding='utf-8', sheet_name=1)
print(df1.shape)
for index, each in df1.iterrows(): # 读取dataframe的每一行的值
try:
sql_str_1 = "SELECT * FROM Japan WHERE Node_id=%s ;" % (str(each.iloc[0]))
res = query_data(sql_str_1) # 执行sql语句
# print(res)
if len(res) == 0:sql_str = 'INSERT INTO Japan (Node_id, Node_path) VALUES ( "%s" ,"%s");' % (str(each.iloc[0]), each.iloc[1])print(sql_str)query_data(sql_str)
except Exception as e:
print('错误', e)
file_name='jp_books-gurupa-us-subtier_browse_tree_guide._TTH_.xls'
increase_data(file_name)


推荐阅读
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • Java 类成员初始化顺序与数组创建
    本文探讨了Java中类成员的初始化顺序、静态引入、可变参数以及finalize方法的应用。通过具体的代码示例,详细解释了这些概念及其在实际编程中的使用。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
author-avatar
loto1115丨
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有