数据分析之Pandas学习笔记(四)(文件读写,数据库读写)
CSV文件(xxx.csv)
读取pd.read_csv()
pandas.read_csv()官方文档
参数详解
有关读取csv文件当中关于header和name表头的处理
当然你也可以用最古老的读取文件的方式
下面介绍用pandas模块读取csv文件
pd.read_csv(
'',
header=None, 什么时候填None什么时候填0看上头链接。
names=[], 一般和header结合使用
index_col='message', 将‘message’列作为行索引
index=[],
columns=[],
usecols=[0], 取第一列 [0,6]取一,七两列
seq=',', 以逗号为分隔‘\S+’通过去空格的正则分隔符
thousands=',', 千位分隔符
nrows=500, 需要读取的行数为500行
skiprows=[0,2,3], 跳过文件的1,3,4行
na_values=[], 一组用于替换NA的值
na_rep='Null', 用Null替换NaN
iterator=, 返回一个TextParser以便逐块读取文件
chunksize=1000, 返回一个TextParser以便逐块读取文件
converters={'foo':f}, 对foo列的所有值应用函数f
squeeze=, 如果解析后只剩一列,返回Series
parse_data=False, 尝试将数据解析为日期,可指定行列
encoding='gbk', 默认读取utf-8编码会报错,改成gbk中文编码就可以
参数字段还有很多。。。这里只列举一些可能比较常用的,用的时候选几个需要的即可。
)
写入
方法一
df.to_csv(’…’)
pandas.to_csv()官方文档
这个真的超级Nice~你要写入的路径的文件如果不存在它也会自动创建,不需要你预先创建
不过直接这样写一个文件路径的参数的话,会把行列索引也一起写进去了。
(真是,直白白的 ,所见即所得= =。。)
不过我才不想把索引写上去呢,我查阅了一下官方文档
我们阔以通过加index=False 这个字段把行索引给去了。
列索引不想写进去的话,加header=None就完事了
思路:DataFrame对象.to_csv('保存路径+文件名')
//index=False ? header=None ?
这个DataFrame对象,就是你设计的'表'
说通俗点,就好比你在pycharm里print看到的那些DataFrame表一样,你将这个表
改成你想要样式和内容,然后.to_csv('...')就完事了~
至于这个表 怎么设计,设计成什么样,写什么内容,取决于你自己的idea了,
等我笔记写完,有空了,再在下面举几个例子好了。。。
方法二
一般文件写入,with open file这样
csv文件写入
首先你要了解csv文件的构造,
它是一行一行的list形式,以逗号分隔
所以你在一般文件写入操作的时候,就要一行一行写,每行以list形式写。
上面那个优快云链接可以点进去看看,写的很好!
import csv
with open('test01.csv','w') as f:
write = csv.writer(f)
write.writerow(['country','language']) #这里要以list形式写入,
#writer会在新建的csv文件中,
#一行一行写入
with open 机制不需要f.save(),它在文件写完自动会关闭,f.save()写不写无所谓。
当然你肯定不想就写一行,想写多行,
可以去上面那个链接去看看写入的样式,然后自己设计。
Excel文件(xxx.xlsx)
其实 Excel文件 和 csv文件 并没啥太大的区别
我记得没错的话 linux系统的的 csv文件 拖到Windows桌面的时候,
直接另存为,把文件格式由.csv改成.xlsx 然后再把编码格式改成utf-8啥的
应该就阔以打开了,无中文乱码
当然pandas针对Excel也有相应的文件读写方法,多学一点总是好的~
下面一起来瞧一瞧..
读取
当然读写都阔以通过最古老的open file来操作,这里不多提了。
下面介绍pandas的读取方法:
pd.read_excel()
pd.read_excel(
'', 文件路径+文件名
sheet_name=0, 工作表名,
就是你下面的那个什么Sheet1 Sheet2啥的
可以通过索引获取
header=None,
names=None,
usecols=[1],
Emmm...好多参数字段应该都和read_csv里面字段差不多,阔以多试试
一般打开的话,我觉得上面几个参数选几个用用够了。
)
写入
df.to_excel()
pandas.to_excel()官方文档
pandas对Excel的写入也类似csv
不过它要额外去下一个包openpyxl -->pip3 install openpyxl
不然你也会和我一样报错!
一开始没仔细看。。。我还以为是NotFound这个文件,还在想。。。Pandas对CSV那么友好对Excel这么烂 = =。还去查了如何代码创建文件。。。兴奋的填完了之后跑了一遍,还是报同样的错了。。。。回过头来仔细一看。。。。Module!模块!= =我沙雕了。。是没这个模块。而不是文件找不到。
不过这样也并无大碍。。多学一点总是好的。。 = =~
下面开始干活!~
import pandas as pd
df = pd.read_csv('C:\\Users\\Administrator\\Desktop\\demo(1).csv',encoding='gbk')
df01 = df.head().copy()
print(df01)
我懒得自己设计表格了,
随便拿个表过来截取里面的一段,当做一个DataFrame对象df01
然后再.to_excel()做演示好了。
f_path = 'C:\\Users\\Administrator\\Desktop\\test01.xlsx'
df01.to_excel(f_path,index=False)
print('OK!{}文件写入成功!'.format(f_path.split('\\')[-1]))
Pycharm中print如下:
看来是写入成功了!去Excel表中看一看结果。
好的!是我想要的格式。。。
唯一有一丢丢小缺憾,。就是它的列索引加粗了= =。算了懒得计较这点点小问题。
当然你连列索引也不想让它写进去,那再在to_excel中添个参数header =None即可。
用代码自动创建文件,文件夹
自从学了python我就变得很懒、懒到文件都不想手动建了。尤其是学习了自动化爬虫,就是那种(selenium+浏览器)自动打开网页去爬数据,就是速度稍稍慢了一点,当然也可以无头浏览器爬网页数据。我希望有一天我上班,不用双手对着键盘敲,直接跑一遍python文件,我坐旁边喝喝茶就行了 = =哇哈哈哈。。不过目前我还没那么厉害。。。
有点扯远了。我网上查了好多资料,看到了最基本的OS命令操作!!
没错!你创目录还是文件都阔以,,下面附上OS操作创建文件的传送门!写的很好
OS模块创建文件,或者文件夹
一般性普通文件的创建和各种OS操作
看完了,我们大致了解到~
emmm创建文件夹倒是阔以用os模块
创建文件,还得用最基础的文件读写,中的‘w’-->以写方式打开,如果不存在则创建
数据库读写(MySQL为例,其他SQL也可以,请往下阅读)
好久没写SQL语句了。。。这里以MySQL为例,简单提几条,回忆一下。。
show databases;
create database mydb default charset=utf8;
use mydb;
create table user(id int primary key auto_increment,name varchar(20) not null ,score int);
insert into user values(1,'张三', 86);
foreignkey(name_id) references user(id);
distinct -->去重
select name,score from user where score>69 order by score desc limit 2;
having 、group by -->语句书写 一般配合使用
having相当于where,在count()这种函数的时候用where会报错,只能用having代替
alter语句
update语句
删除语句
delete
drop table table_name;
有关MySQL数据库的优化...
pd.read_sql_query()从数据库中读数据
MySQL安装教程,这篇写的超级详细,没下载的可以去看看
没下载MySQL数据库的可以参考上面这个链接
下载完了,我一般不用图形化界面操作,而是用黑乎乎的终端界面操作数据库的
下面附上Windows如何打开 MySQL终端的操作链接
如果你是linux的系统就更方便了,直接mysql -u用户名 -p密码
用户名一般是root,密码是你设的密码。
windows和mac都要进入mysql安装的bin目录下才能执行上面的命令,
或者windows直接–开始–搜索:Mysql–点上面那个终端图标的那个–点进去输入密码
在对数据库读取数据之前。。你总得数据库里有东西吧。
先创建一个database然后建个table然后随便插入几条数据,
不然你数据库空空如也,查鸡儿= =、
BB完了,下面开始干活!
干活前,先确保下面4条:
1,保证数据库有东西可以查询
2,下载一个包sqlalchemy用于创建引擎 -->pip3 install sqlalchemy
(windows打开cmd直接敲显示无pip3 命令的话,
自己打开你安装的python环境目录的script目录中按shift+右键打开终端,敲上述命令)
3,还要下一个包pymysql 作为驱动,不然你pycharm连不上数据库了。
4,确保你的’小海豚’(Mysql)服务已经开启!如下图:
如果你懒得下mysql想用你自己的Oracle还是SQLite还是PostgreSQL
请看下面这个链接,(其实都差不多,就前面的mysql、pymysql字段改一下)
import pandas as pd
import sqlalchemy as sqla
import pymysql
db = sqla.create_engine('mysql+pymysql://用户名:密码@localhost:3306/数据库名?charset=utf8')
query = 'select * from user;'
df = pd.read_sql_query(query,db)
print(df)
当然如果你在做Web项目的时候,这样写容易有SQL注入的安全性问题
有兴趣阔以自己去了解下如何防止SQL注入
如果你用的Django还是Flask框架(flask偏前端),
那么可以直接在Pycharm端操作数据库了。
我懒得建Django框架了,后续如果写Djano笔记的话会提一下。。
数据库中数据:(mydb数据库 – user表 – )
执行py文件后,print输出如下:
查询成功!
df.to_sql()将DataFrame表写入数据库
pandas.DataFrame.to_sql()官方文档
参数详解
我随便写了一个DataFrame表df
然后df.to_sql('mydb', 你想存的数据库的表名
db, 你搭建的数据库引擎
index=False 不存储行索引
)
当然还有其他参数字段,你自己看上面的文档链接去= =。我只是写了最基本实用的部分。
import pandas as pd
import sqlalchemy as sqla
import pymysql
db = sqla.create_engine('mysql+pymysql://用户名:密码@localhost:3306/数据库名?charset=utf8')
df = pd.DataFrame({'id':[1,2,3,4],'num':[12,34,56,89]})
#将新建的DataFrame储存为MySQL中的数据表,index=False表示 不储存行索引
df.to_sql('mydf', db, index= False)
当然像下面这样写是最好的了,
(if判断下数据库中是否已存在)
(如果数据库中有这个表的,显示表已存在)
(如果没有这个表,执行写入操作!再次执行查询语句,去查询一下这个表看一看)
import pandas as pd
import sqlalchemy as sqla
import pymysql
db = sqla.create_engine('mysql+pymysql://用户名:密码@localhost:3306/数据库名?charset=utf8')
query_tables = '''
show tables;
'''
tables = pd.read_sql_query(query_tables,db)
print(tables)
if 'mydf' in tables.values:
print('数据库中已有该表')
else:
df = pd.DataFrame({'id':[1,2,3,4],'num':[12,34,56,89]})
#将新建的DataFrame储存为MySQL中的数据表,index=False表示 不储存行索引
df.to_sql('mydf', db, index= False)
print('**********************数据库写入成功!**************************')
query = '''
select * from mydb;
'''
cat = pd.read_sql_query(query,db)
print(cat)
将CSV(Excel)文件写入数据库中(Excel,MySQL为例)
因为我这个Excel文件里的数据量很大,我导进来的时候添加nrows=10,只导了10条数据,
然后我存MySQL的时候就截取了这10条里的后8条存,
也就是数据库里应该有8条数据。
通过这几天对pandas的研究,我自己的理解:
其实存来存去,
不管是Excel存数据库,还是数据库导出Excel,
还是其他存来存去的操作。
最关键的是,中间的DataFrame对象。也就是你要用的表。
打个比方:
你通过pandas从Excel导出数据,此时它为一个DataFrame对象。
这个DataFrame对象(表),改成你想要的样子,或者不改都行,看你的需求。
然后你再将这个DataFrame对象,
导入数据库,还是导到别的Excel?CSV?还是txt?都可以。。
总的来说,就是
通过对应的pandas方法 创建 或者 获取数据--> 把数据变成pandas对象,
然后把这个对象 --> 通过pandas方法 --> 写入你需要的地方,即可~
import pandas as pd
import sqlalchemy as sqla
import numpy as np
db = sqla.create_engine('mysql+pymysql://用户名:密码@localhost:3306/数据库名?charset=utf8')
df = pd.read_excel('C:\\Users\\Administrator\\Desktop\\test01.xlsx',nrows=10,header=None,name=['0','1'])
df01 = df[2:]
query_tables = '''
show tables;
'''
tables = pd.read_sql_query(query_tables,db)
print(tables)
if 'shangpin_info' in tables.values:
print('数据库中已有该表')
else:
df01.to_sql('shangpin_info',db,index=False)
print('**********************数据库写入成功!**************************')
query = '''
select * from shangpin_info;
'''
cat = pd.read_sql_query(query,db)
print(cat)
pycharm中打印如下:
我们再去数据库中瞧一瞧,数据库里存的样子是什么样的:
存的时候,添加了index=False,没有把行索引存进去
嗯~狠好!是我想要的结果!
数据库导出数据到Excel
df = pd.read_sql()
df = pd.read_sql_query()
df = pd.read_sql_table()
上面两个都行,看你喜好。。我用的第二个,里面写sql语句,和引擎就行了
pandas.read_sql()官方文档
pandas.read_sql_table()官方文档
read_sql 和 read_sql_table 详细参数
import pandas as pd
import sqlalchemy as sqla
import numpy as np
db = sqla.create_engine('mysql+pymysql://root:123456@localhost:3306/mydb')
query_tables = '''
show tables;
'''
tables = pd.read_sql_query(query_tables,db)
print(tables)
if 'shangpin_info' not in tables.values:
print('数据库中不存在该表!')
else:
query = '''
select * from shangpin_info;
'''
df = pd.read_sql_query(query,db)
df.to_excel('C:\\Users\\Administrator\\Desktop\\text02.xlsx')
print('**********************Excel写入成功!**************************')
看来数据库拿出来的数据是带行列索引的,
你存Excel时,不想要行列索引的话,在to_excel中加index=False,header=None即可
总结
通过这几天对pandas的研究,我自己的理解:
其实存来存去,
不管是Excel存数据库,还是数据库导出Excel,
还是其他存来存去的操作。
最关键的是,中间的DataFrame对象。也就是你要用的表。
打个比方:
你通过pandas从Excel导出数据,此时它为一个DataFrame对象。
这个DataFrame对象(表),改成你想要的样子,或者不改都行,看你的需求。
然后你再将这个DataFrame对象,
导入数据库,还是导到别的Excel?CSV?还是txt?都可以。。
总的来说,就是
通过对应的pandas方法 创建 或者 获取数据--> 把数据变成pandas对象,
然后把这个对象 --> 通过pandas方法 --> 写入你需要的地方,即可~