现在是一个吃快餐的时代,先给出源码,还有执行结果吧,定位过程在下面
源码:
#导入需要使用到的模块 import urllib import urllib.request import re import os import pandas as pd import pymysql ##########################将股票数据存入数据库########################### filepath = 'D:\\data\\python\\test\\stock\\'#定义数据文件保存路径 #数据库名称和密码 name = 'root' password = 'Test_123' #替换为自己的账户名和密码 #建立本地数据库连接(需要先开启数据库服务) db = pymysql.connect('localhost', name, password, charset='utf8') cursor = db.cursor() #创建数据库stockDataBase sqlSentence1 = "create database if not exists stockDataBase" cursor.execute(sqlSentence1)#选择使用当前数据库 sqlSentence2 = "use stockDataBase;" cursor.execute(sqlSentence2) #获取本地文件列表 fileList = os.listdir(filepath) #依次对每个数据文件进行存储 for fileName in fileList: data = pd.read_csv(filepath+fileName, encoding="gbk") #创建数据表,如果数据表已经存在,会跳过继续执行下面的步骤print('创建数据表stock_%s'% fileName[0:6]) sqlSentence3 = "create table if not exists stock_%s" % fileName[0:6] + "(日期 VARCHAR(20), 股票代码 VARCHAR(20), name VARCHAR(40),\ 收盘价 float, 最高价 float, 最低价 float, 开盘价 float, 前收盘 float, 涨跌额 float, \ 涨跌幅 float, 换手率 float, 成交量 bigint, 成交金额 bigint, 总市值 bigint, 流通市值 bigint)" cursor.execute(sqlSentence3) #sqlSentence4 = "alter table stock_%S" % fileName[0:6] + "default character set utf8;" sqlSentence4 = "alter table stock_%s" % fileName[0:6] + " change name name varchar(60) character set utf8;" cursor.execute(sqlSentence4) sqlSentence5 = "delete from stock_%s" % fileName[0:6] + ";" cursor.execute(sqlSentence5) #迭代读取表中每行数据,依次存储(整表存储还没尝试过) print('正在存储stock_%s'% fileName[0:6]) length = len(data) print(length) for i in range(0, length): record = tuple(data.loc[i]) #插入数据语句 try: sqlSentence6 = "insert into stock_%s" % fileName[0:6] + "(日期, 股票代码, name, 收盘价, 最高价, 最低价, 开盘价, 前收盘, 涨跌额, 涨跌幅, 换手率, \ 成交量, 成交金额, 总市值, 流通市值) values ('%s',%s','%s',%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)" % record #获取的表中数据很乱,包含缺失值、Nnone、none等,插入数据库需要处理成空值 sqlSentence6 = sqlSentence6.replace('nan','null').replace('None','null').replace('none','null') cursor.execute(sqlSentence6) except: #如果以上插入过程出错,跳过这条数据记录,继续往下进行 continue #关闭游标,提交,关闭数据库连接 cursor.close() db.commit() db.close()
定位思路也很简单:
1.加入日志,打印出关键信息,这边就是最终sql语句
2.调试代码,加断点,这边没用到
期间要尝试修改,查手册,百度等,不要怕,比core问题好定位多了,试试就好了,实际上我还复习了tuple的用法。。。虽然问题不出在这儿,但是也加深一些知识
这边几张图只是给了点思路,在关键的地方输出日志,43 line 是否能按行读取出数据,50 line 查看最终的sql语句等,53 line看有没有进异常等,上面的几张图,说明日志也是慢慢添加的,慢慢合理的,多尝试即可
后面又加了日志:发现打印出来的最终sql语句是:
insert into stock_600000(日期, 股票代码, 名称, 收盘价, 最高价, 最低价, 开盘价, 前收盘, 涨跌额, 涨跌幅, 换手率, 成交量, 成交金额, 总市值, 流通市值) values ('2019-2-28',600000,'浦发银行',11.74,11.92,11.68,11.83,11.83,-0.09,-0.7608,0.1402,39393414,464139463,345000000000.0,330000000000.0)
然后查询表结构
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| 日期 | varchar(20) | YES | | NULL | |
| 股票代码 | float | YES | | NULL | |
| 名称 | varchar(60) | YES | | NULL | |
| 收盘价 | float | YES | | NULL | |
| 最高价 | float | YES | | NULL | |
| 最低价 | float | YES | | NULL | |
| 开盘价 | float | YES | | NULL | |
| 前收盘 | float | YES | | NULL | |
| 涨跌额 | float | YES | | NULL | |
| 涨跌幅 | float | YES | | NULL | |
| 换手率 | float | YES | | NULL | |
| 成交量 | bigint(20) | YES | | NULL | |
| 成交金额 | bigint(20) | YES | | NULL | |
| 总市值 | bigint(20) | YES | | NULL | |
| 流通市值 | bigint(20) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
15 rows in set (0.01 sec)
发现是对的,单独执行sql语句,就有错误提示了
ERROR 1366 (HY000): Incorrect string value: '\xC6\xD6\xB7\xA2\xD2\xF8...' for column 'name' at row 1
查出来编码格式不对:
mysql> show create table stock_600000;
+--------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| stock_600000 | CREATE TABLE `stock_600000` (
`日期` varchar(20) DEFAULT NULL,
`股票代码` float DEFAULT NULL,
`名称` varchar(60) DEFAULT NULL,
`收盘价` float DEFAULT NULL,
`最高价` float DEFAULT NULL,
`最低价` float DEFAULT NULL,
`开盘价` float DEFAULT NULL,
`前收盘` float DEFAULT NULL,
`涨跌额` float DEFAULT NULL,
`涨跌幅` float DEFAULT NULL,
`换手率` float DEFAULT NULL,
`成交量` bigint(20) DEFAULT NULL,
`成交金额` bigint(20) DEFAULT NULL,
`总市值` bigint(20) DEFAULT NULL,
`流通市值` bigint(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+--------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> alter table stock_600000 default character set utf8;
改了表的编码格式:
mysql> show create table stock_600000;
+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| stock_600000 | CREATE TABLE `stock_600000` (
`日期` varchar(20) CHARACTER SET latin1 DEFAULT NULL,
`股票代码` float DEFAULT NULL,
`名称` varchar(60) CHARACTER SET latin1 DEFAULT NULL,
`收盘价` float DEFAULT NULL,
`最高价` float DEFAULT NULL,
`最低价` float DEFAULT NULL,
`开盘价` float DEFAULT NULL,
`前收盘` float DEFAULT NULL,
`涨跌额` float DEFAULT NULL,
`涨跌幅` float DEFAULT NULL,
`换手率` float DEFAULT NULL,
`成交量` bigint(20) DEFAULT NULL,
`成交金额` bigint(20) DEFAULT NULL,
`总市值` bigint(20) DEFAULT NULL,
`流通市值` bigint(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
执行还是报错,再查看具体的字段的编码格式
mysql> SHOW FULL COLUMNS FROM stock_600000;
+-----------+-------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+-----------+-------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
| dateday | varchar(20) | latin1_swedish_ci | YES | | NULL | | select,insert,update,references | |
| stockcode | float | NULL | YES | | NULL | | select,insert,update,references | |
| name | varchar(60) | latin1_swedish_ci | YES | | NULL | | select,insert,update,references | |
| price1 | float | NULL | YES | | NULL | | select,insert,update,references | |
| price2 | float | NULL | YES | | NULL | | select,insert,update,references | |
| price3 | float | NULL | YES | | NULL | | select,insert,update,references | |
| price4 | float | NULL | YES | | NULL | | select,insert,update,references | |
| price5 | float | NULL | YES | | NULL | | select,insert,update,references | |
| price6 | float | NULL | YES | | NULL | | select,insert,update,references | |
| price7 | float | NULL | YES | | NULL | | select,insert,update,references | |
| price8 | float | NULL | YES | | NULL | | select,insert,update,references | |
| price9 | bigint(20) | NULL | YES | | NULL | | select,insert,update,references | |
| price10 | bigint(20) | NULL | YES | | NULL | | select,insert,update,references | |
| price11 | bigint(20) | NULL | YES | | NULL | | select,insert,update,references | |
| price12 | bigint(20) | NULL | YES | | NULL | | select,insert,update,references | |
+-----------+-------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
15 rows in set (0.01 sec)
表列名字被我换成中文了,为了解决上面的问题,然而并没用,主要 是name的格式:latin1_swedish_ci,插入的字段值有中文编码格式与其不一致,因此改了
mysql> alter table stock_600000 change name name varchar(60) character set utf8;
mysql> show full columns from stock_600000
-> ;
+-----------+-------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+-----------+-------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
| dateday | varchar(20) | latin1_swedish_ci | YES | | NULL | | select,insert,update,references | |
| stockcode | float | NULL | YES | | NULL | | select,insert,update,references | |
| name | varchar(60) | utf8_general_ci | YES | | NULL | | select,insert,update,references | |
| price1 | float | NULL | YES | | NULL | | select,insert,update,references | |
| price2 | float | NULL | YES | | NULL | | select,insert,update,references | |
| price3 | float | NULL | YES | | NULL | | select,insert,update,references | |
| price4 | float | NULL | YES | | NULL | | select,insert,update,references | |
| price5 | float | NULL | YES | | NULL | | select,insert,update,references | |
| price6 | float | NULL | YES | | NULL | | select,insert,update,references | |
| price7 | float | NULL | YES | | NULL | | select,insert,update,references | |
| price8 | float | NULL | YES | | NULL | | select,insert,update,references | |
| price9 | bigint(20) | NULL | YES | | NULL | | select,insert,update,references | |
| price10 | bigint(20) | NULL | YES | | NULL | | select,insert,update,references | |
| price11 | bigint(20) | NULL | YES | | NULL | | select,insert,update,references | |
| price12 | bigint(20) | NULL | YES | | NULL | | select,insert,update,references | |
+-----------+-------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
15 rows in set (0.02 sec)
再插入就成功了,最终效果见上面
写代码的小熊猫~ :)