涉及到两个包:sqlalchemy 与 pymysql
单用sqlalchemy包中的engine可以快速把当前目录下所有的csv文件导入数据库
import osimport pandas as pdfrom sqlalchemy import create_engine#连接数据库函数def engine(db_name):engine = create_engine('mysql+pymysql://root:lcx121@localhost/{}'.format(db_name), encoding='utf-8')return engine#创建csv文件def readFile_to_sql(db_name):try:#获取当前路径cwd = os.getcwd()#遍历当前路径,路径,文件全部爬去出来for dirpaths, dirnaames,filenames in os.walk(cwd): #dirpaths路径,dirnaames文件夹的名字,filenames所有文件的名字#判断csv文件是否存在for filename in filenames:if filename.endswith(".csv"):#读取文件df = pd.read_csv(filename,encoding="utf8",sep=',',dtype={'code':str})table_name = filename.split('.')[0]#直接写入数据库,'table_name'为表名,会自动创建一个表,不需要自己动手创建#to_sql函数支持两类mysql引擎一个是sqlalchemy,另一个是sqlliet3,在写入库的时候,pymysql(python3),mysqldb(python2)是不能用的,只能使用 sqlalchemy或者sqlliet3.df.to_sql(table_name,con=engine(db_name),if_exists='append',index=True)#第一个参数't_pandasRead'是需要导入的表名#第二个参数数据库引擎#第三个参数if_exists="",引号里面可以跟三个参数,fail(如果表存在,啥也不做),replace(如果表存在,删了表,再建立一个新表,把数据插入),append(如果表存在,把数据插入,如果表不存在创建一个表)#第四个参数是否需要配置索引except Exception as e:#输出报错问题raise e
eg:导入指定的数据库中:
readFile_to_sql('shida_date')
这样子导入数据会缺点,时间列会被变成字符串
避免这个问题,可以先建表,再导入,现在用pymysql包
import pymysql#连接数据库并执行mysql语句def get_to_sql(db_name, sql_list):#连接数据库db = pymysql.connect(host = 'localhost',user = 'root',password = 'lcx121',database = db_name)#创建游标cur = db.cursor()try:for sql in sql_list:cur.execute(sql)except Exception as e:db.rollback()raise e else:mit()print("update ok~")finally:cur.close()db.close()#创建表def get_table(table_name, idx):sql = "create table if not exists {}({})".format(table_name,idx)return sql
(上面try的部分写for语句,是为了以后在有多条sql语句需要运行时,可以并成一个列表,一次性运行)
例子:
#创建表的参数idx = 'id int(5) PRIMARY KEY AUTO_INCREMENT,date datetime,nums int(3) default 0'#创建表get_to_sql('shida_date',[get_table('days_test',idx)])
再用之前的sqlalchemy导入数据:
readFile_to_sql('shida_date')
如果觉得《Python_把csv文件导入数据库》对你有帮助,请点赞、收藏,并留下你的观点哦!