视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Python用Pandas读CSV文件写到MySQL的方法
2020-11-27 14:25:50 责编:小采
文档

汇总一下,自己最近在使用Python读写CSV存数据库中遇到的各种问题。

相关mysql视频教程推荐:《mysql教程》

上代码:

reload(sys)
sys.setdefaultencoding('utf-8')
host = '127.0.0.1'
port = 3306
db = 'world'
user = 'root'
password = '123456'

con = MySQLdb.connect(host=host,charset="utf8",port=port,db=db,user=user,passwd=password)
try:
 df = pd.read_sql(sql=r'select * from city', con=con)
 df.to_sql('test',con=con,flavor='mysql')
except Exception as e:
 print(e.message)

不出意外的话会打印出一句:database flavor MySQL is not supported
在stackoverflow上找到了答案:The flavor ‘mysql’ is deprecated in pandas version 0.19.

我们换一种方式:

reload(sys)
sys.setdefaultencoding('utf-8')
host = '127.0.0.1'
port = 3306
db = 'world'
user = 'root'
password = '123456'

engine = create_engine(str(r"mysql+mysqldb://%s:" + '%s' + "@%s/%s") % (user, password, host, db))

try:
 df = pd.read_sql(sql=r'select * from city', con=engine)
 df.to_sql('test',con=engine,if_exists='append',index=False)
except Exception as e:
 print(e.message)

运行下,ok,可以存入了index参数表示是否把DataFrame的index当成一列来存储,一般来说是不需要的,所以赋值为False

现在看似问题都解决了,但是还有一个小问题。
假如我有一个含有中文的csv文件(本人Window):
name age class
小明 15 一年级
小张 18 三年级

engine = create_engine(str(r"mysql+mysqldb://%s:" + '%s' + "@%s/%s") % (user, password, host, db))

try:
 df = pd.read_csv(r'C:UsersxxDesktopdata.csv')
 print(df)
 df.to_sql('test', con=engine, if_exists='append', index=False)
except Exception as e:
 print(e.message)

打印处理以后乱码了。我们在读csv时候最好指定编码,我的本地GBK:

df = pd.read_csv(r'C:UsersxxDesktopdata.csv',encoding='gbk')

我们可以正常的打印信息了,但是又报错了,错误如下:

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-1: ordinal not in range(256)

还是编码问题,原因呢,我们存到数据库时候没有指定编码。解决这个问题时候也是被坑了一把,网上说什么的都有。过程就不说了,看代码:

engine = create_engine(str(r"mysql+mysqldb://%s:" + '%s' + "@%s/%s?charset=utf8") % (user, password, host, db))

解决了

相关文章:

Python数据分析之真实IP请求Pandas详解

通过Python中的pandas库对cdn日志进行分析详解

用Python的pandas框架操作Excel文件中的数据教程

下载本文
显示全文
专题