数据分析之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中文编码就可以

参数字段还有很多。。。这里只列举一些可能比较常用的,用的时候选几个需要的即可。	 
)

Standard Encoding官方文档

写入

方法一
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形式写。

上面那个CSDN链接可以点进去看看,写的很好!

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字段改一下)

SQLAlchemy连接各种数据库

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 详细参数

pandas.read_sql_query()官方文档

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方法 --> 写入你需要的地方,即可~
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值