Python 从入门到实战44(Pandas读写数据)

我们的目标是:通过这一套资料学习下来,可以熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。

上篇文章我们学习了pandas数据结构操作的相关基础知识。今天学习一下pandas读写数据的相关操作。

1、CSV文件的读写

csv 文件时文本文件的一种,该文件中每一行数据的多个元素之间使用逗号进行分割。

1)读取

pandas 提供了read_csv()函数用于CSV文件的读取,read_csv()函数常用参数如下:

|--------------------|-------------------------------------------|
| 参数名 | 参数含义 |
| filepath_or_buffer | 要读取的文件路径或对象 |
| sep | 是str类型,字段分隔符,默认为"," |
| header | 表示将哪一行数据作为列名,默认为0(第一行),如果没有列名则设为None |
| names | 为读取后的数据设置列名,默认为None |
| index_col | 通过列索引指定列的位置,默认为None |
| skiprows | 需要忽略的行数(从文件开头算起),或需要跳过的行号列表。 |
| nrows | 是int 类型,需要读取的行数(从文件开头算起) |
| skipfooter | 是int 类型,需要跳过的行号,从文件内数据末尾处算起 |
| encoding | 文件编码(如'utf-8','latin-1'等),str类型 |
| na_values | 将指定的设置为NaN |
| squeeze | 设置为True,表示解新的数据只包含一列,则返回一个Series.默认为False |
| engine | 表示数据解新的引擎,可以指定为c或python,默认为c |

举个例子吧:

import pandas as pd #导入pandas 模块

#读取csv文件

data = pd.read_csv(".\\test_data\\test_data.csv")#读CSV数据

print(data) #输出读取csv数据

输出结果:

a b c d e f

0 1 11 21 31 41 51

1 2 12 22 32 42 52

2 3 13 23 33 43 53

3 4 14 24 34 44 54

4 5 15 25 35 45 55

5 6 16 26 36 46 56

可以看到输出结果和csv中内容一致;

另外,假如要取前4行数据:

#读取csv文件

data = pd.read_csv(".\\test_data\\test_data.csv",nrows=4,encoding="UTF-8")#读CSV数据

print(data) #输出读取csv数据

输出结果:

a b c d e f

0 1 11 21 31 41 51

1 2 12 22 32 42 52

2 3 13 23 33 43 53

3 4 14 24 34 44 54

2)写入

可以使用pandas 提供的to_csv()方法,进行写入的操作。

常用参数及其含义:

|--------------------|----------------------------------------|
| 参数名 | 参数含义 |
| filepath_or_buffer | 表示文件路径的字符串 |
| sep | 是str类型,字段分隔符,默认为"," |
| na_rep | 缺失值的表示,默认为空字符串‌"" |
| float_format | str类型,指定浮点数据的格式,例如,'%.2f'表示保留两位小数 |
| columns‌ | 要写入文件的列,默认为None-所有列‌ |
| header | 是否将列名写入文件,默认为True‌ |
| index | 是否将索引写入文件,默认为True‌ |
| mode | 打开文件的模式,包括'w'(覆盖写入)、'a'(追加)和'x'(创建模式)‌ |
| encoding | 文件编码,默认为None,表示使用系统默认编码‌ |
| quoting | 引号的控制方式,默认为引用所有非数字字段,也可以设置为 |

举例说明:

#读取csv文件

data = pd.read_csv(".\\test_data\\test_data.csv",nrows=4,encoding="UTF-8")#读CSV数据

print(data) #输出读取csv数据
#将读取的文件写入到新的数据表,只写入3个列
data.to_csv(".\\test_data\\new_data.csv",columns=["a","b","c"],index=False)

new_data = pd.read_csv(".\\test_data\\new_data.csv",encoding="UTF-8")#读新的CSV数据

print(new_data) #输出新文件数据

执行结果:

a b c d e f

0 1 11 21 31 41 51

1 2 12 22 32 42 52

2 3 13 23 33 43 53

3 4 14 24 34 44 54

a b c

0 1 11 21

1 2 12 22

2 3 13 23

3 4 14 24

Process finished with exit code 0

2、excel 文件的读写

1)读取

可以使用pandas提供的read_excel()函数来读取excel 内容,相关参数说明:

|------------|---------------------------------------------------------------------------|
| 参数名 | 参数含义 |
| io | Excel文件的路径或文件句柄,如果是文件句柄,它必须以'rb'模式打开。 |
| sheet_name | 要读取的工作表名称或编号。如果提供了一个列表,则返回一个DataFrame字典。如果提供了sheetname的索引,则可以选择多个工作表,默认为0 |
| header | 用作列名的行编号。如果没有,列名会被设置为[0, 1, 2, ..., n]。如果给定一个整数列表,则会有多个头文件行。 |
| skiprows | 需要忽略的行数(从文件开头算起),或需要跳过的行号列表 |
| skipfooter | 文件尾部需要忽略的行数。 |
| index_col | 用作索引的列编号或列名。 |
| names | 指定列的名字,用于结果DataFrame |

举例说明:

import pandas as pd #导入pandas 模块

#读取excel文件,忽略前2行

my_data = pd.read_excel(".\\test_data\\my_test_data.xlsx")

print(my_data) #输出读取的数据

小插曲,开始报错了:

pip install openpyxl

Requirement already satisfied: openpyxl in c:\users\dewi\lib\site-packages (3.1.5)

Requirement already satisfied: et-xmlfile in c:\users\dewi\lib\site-packages (from openpyxl) (2.0.0)

安装openpyxl成功后,发现第三方库中没有openpyxl ,可以推测是没有识别到。

增加项目解释器配置后查看,第三方库中看到了openpyxl

再次执行,输出结果:

a b c d e f

0 1 11 21 31 41 51

1 2 12 22 32 42 52

2 3 13 23 33 43 53

3 4 14 24 34 44 54

4 5 15 25 35 45 55

5 6 16 26 36 46 56

Process finished with exit code 0

2)写入

在实现excel文件的写入工作时,需要通过DataFrame 的数据对象调用to_excel()方法。

to_excel()方法的参数含义与to_csv()方法类似。

举例说明:

#读取excel 中内容,写入到写的文件中

my_data = pd.read_excel(".\\test_data\\my_test_data.xlsx") #读取excel内容

print(my_data) #输出读取的数据

#将读取的内容写入到写的excel中,指定对应的列

my_data.to_excel(".\\test_data\\new_test_data.xlsx",columns=["a","b","c"],index=False)

#读取新excel内容

print("写入内容后excel中内容为:")

new_data = pd.read_excel(".\\test_data\\new_test_data.xlsx")

print(new_data)

执行结果:

a b c d e f

0 1 11 21 31 41 51

1 2 12 22 32 42 52

2 3 13 23 33 43 53

3 4 14 24 34 44 54

4 5 15 25 35 45 55

5 6 16 26 36 46 56

写入内容后excel中内容为:

a b c

0 1 11 21

1 2 12 22

2 3 13 23

3 4 14 24

4 5 15 25

5 6 16 26

Process finished with exit code 0

3、数据库数据的读、写

通过pandas实现数据库的读、写操作时先需要数据库连接。以MySQL为例说明:

1)读取数据库信息

我们在第32节的时候已安装了MySQL,对应的用户名和密码:root 、 root

pandas 提供了3个函数用于实现数据库信息的读取操作:

a、read_sql_query()函数:

允许用户直接从数据库执行SQL查询,并将结果作为一个DataFrame对象返回。这种方式对于数据分析和数据科学特别有用,因为它允许快速地从数据库中读取数据并使用Pandas进行进一步的分析和处理‌

read_sql_query(

sql,

con,

index_col: str | list[str] | None = None,

coerce_float: bool = True,

params: list[Any] | Mapping[str, Any] | None = None,

parse_dates: list[str] | dict[str, str] | None = None,

chunksize: int | None = None,

dtype: DtypeArg | None = None,

dtype_backend: DtypeBackend | lib.NoDefault = lib.no_default,

)

b、read_sql_table()函数:

实现读取数据库中的某一个表的数据,且需要在SQLAlchemy模块的支持下才可以使用

read_sql_table(table_name: str,

con: Any,

schema: str | None = None,

index_col: str | list[str] | None = None,

coerce_float: bool = True,

parse_dates: list[str] | dict[str, str] | None = None,

columns: list[str] | None = None,

chunksize: int | None = None,

dtype_backend: Literal["pyarrow", "numpy_nullable"] | _NoDefault = lib.no_default)

c、read_sql()函数:

既可以实现读取数据库中某一个表的数据,也可以实现具体的查询操作。

read_sql(sql: Any,

con: Any,

index_col: str | list[str] | None = None,

coerce_float: bool = True,

params: Any = None,

parse_dates: Any = None,

columns: list[str] | None = None,

chunksize: int | None = None,

dtype_backend: Literal["pyarrow", "numpy_nullable"] | _NoDefault = lib.no_default,

dtype: ExtensionDtype | str | dtype | Type[str] | Type[complex] | Type[bool] | Type[object] | dict[Hashable, ExtensionDtype | str | dtype | Type[str] | Type[complex] | Type[bool] | Type[object]] | None = None)

读取数据库信息函数中常用的参数及含义:

|--------------|-------------------------------------------------------------------|
| 参数名 | 参数含义 |
| ‌sql‌ | str类型,SQL查询字符串或SQLAlchemy Selectable(如SQL Expression Language表达式) |
| table_name | str类型,数据库中表的名称 |
| ‌con‌ | 数据库连接对象,可以是SQLAlchemy连接引擎/连接对象或者SQLite3连接 |
| index_col‌ | str类型或者str类型的列表,用作结果DataFrame的索引列的列名或列的列表 |
| coerce_float | booleean类型,将数值解析为浮点数,默认为True |
| columns | list类型,表示要读取数据的列名 |
| | |

举例说明:

#通过sql查询数据库中表的数据

#使用pymysql 连接数据库
pymysql_db_con = pymysql.connect(host="localhost",
user="root",password="root",db="mysql",port=3306,charset="utf8")

#sql查询语句,查询所有id<10的记录信息

sql_select = "select * from scores where id<10"

#通过read_sql_query()函数读取数据库信息

sql_query_data = pd.read_sql_query(sql=sql_select,con=pymysql_db_con)

print("通过read_sql_query()函数读取的数据:\n",sql_query_data)

执行结果:

可以输出结果,但是有个警告

我们使用sqlalchemy模块来连接,只要改一下连接方式即可:

#使用sqlalchemy连接数据库,

(数据库产品名称+数据库操作模块名://数据库用户名:密码@数据库ip地址:数据库端口号/数据库名称)

sqlalchemy_db = sqlalchemy.create_engine("mysql+pymysql://root:root@localhost:3306/mysql")

#通过read_sql_query()函数读取数据库信息

sql_query_data1 = pd.read_sql_query(sql=sql_select,con=sqlalchemy_db)

print("通过read_sql_query()函数读取的数据:\n",sql_query_data1)

执行结果,输出结果正确且没有对应的警告:

补充另外两个函数的使用:

#通过read_sql_table()函数读取数据库信息

sql_table_data = pd.read_sql_table(table_name="scores",con=sqlalchemy_db)

print("\n通过read_sql_table()函数读取数据库信息长度为:",len(sql_table_data))

#通过read_sql()函数读取数据库信息

sql_read_data = pd.read_sql(sql=sql_select,con=sqlalchemy_db)

print("\n通过read_sql()函数读取数据库表的信息:\n",sql_read_data)

执行结果:

通过read_sql_table()函数读取数据库信息长度为: 6

通过read_sql()函数读取数据库表的信息:

id name English Math Chinese

0 7 xiaoming 100 66 88

1 8 xiaohua 90 76 89

2 9 xiaomi 70 86 80

Process finished with exit code 0

2)写入数据库的操作

pandas 提供了to_sql()方法用于实现数据库数据的写入工作。

to_sql()方法也需要SQLAlchemy模块,语法格式:

to_sql(

self,

name: str,

con,

schema: str | None = None,

if_exists: Literal["fail", "replace", "append"] = "fail",

index: bool_t = True,

index_label: IndexLabel | None = None,

chunksize: int | None = None,

dtype: DtypeArg | None = None,

method: Literal["multi"] | Callable | None = None,

)

to_sql()方法中常用的参数和含义:

|-----------|----------------------------------------------------------------------|
| name | str类型,数据库表的名称 |
| con | 表示数据库的连接 |
| if_exists | 这个参数决定了当表已存在时的行为。可选值为'fail'(引发错误)、'replace'(替换现有表)和'append'(追加到现有表)‌ |
| index | 表示是否将索引写入数据表,默认为True |

举例说明:

#实现数据库的写入和读取

#使用sqlalchemy连接数据库,

(数据库产品名称+数据库操作模块名://数据库用户名:密码@数据库ip地址:数据库端口号/数据库名称)

sqlalchemy_db = sqlalchemy.create_engine("mysql+pymysql://root:root@localhost:3306/mysql")

#sql查询语句,查询所有的记录信息

sql_select = "select * from to_sql_data"

#写入数据库的数据

data = {"id":[20,21],

"name":["xiaoyi","xiaoer"],

"English":[88,99],

"Math":[44,69],

"Chinese":[55,77]

}

data_frame = pd.DataFrame(data) #创建DataFrame对象

#向数据库中写入数据

data_frame.to_sql('to_sql_data',sqlalchemy_db,if_exists="append")

#通过read_sql()函数读取数据库信息

sql_read_data = pd.read_sql(sql=sql_select,con=sqlalchemy_db)

print("\n通过read_sql()函数读取数据库表的信息:\n",sql_read_data)

执行结果:

通过read_sql()函数读取数据库表的信息:

index id name English Math Chinese

0 0 20 xiaoyi 88 44 55

1 1 21 xiaoer 99 69 77

Process finished with exit code 0

今天先写学习到这里了,每天进步一点点。明天也要加油啊!

相关推荐
人机emmo_490372112210 分钟前
第4关 Java分支结构之Switch【Java 分支结构之 Switch:灵活的选择利器】
java·开发语言·python
重生之我是数学王子17 分钟前
QT 实现仿制 网络调试器(未实现连接唯一性) QT5.12.3环境 C++实现
开发语言·c++·qt
cuber膜拜29 分钟前
pip 与当前python环境版本不匹配, pyenv, pipenv, conda
python·conda·pip
枫の准大一43 分钟前
C++从零到满绩——类和对象(中)
开发语言·c++
HEX9CF1 小时前
【数字图像处理+MATLAB】通过 Roberts, Prewitt, Sobel, LoG 等算子实现图像边缘检测:使用 edge 函数
开发语言·matlab·edge
研一计算机小白一枚1 小时前
Which Tasks Should Be Learned Together in Multi-task Learning? 译文
人工智能·python·学习·机器学习
凡人的AI工具箱1 小时前
40分钟学 Go 语言高并发实战:高性能缓存组件开发
开发语言·后端·缓存·架构·golang
大白的编程日记.1 小时前
【C++笔记】数据结构进阶之二叉搜索树(BSTree)
开发语言·数据结构·c++·笔记
Eric.Lee20211 小时前
数据集-目标检测系列- 蘑菇 检测数据集 mushroom >> DataBall
人工智能·python·yolo·目标检测·计算机视觉·蘑菇检测
每天一个秃顶小技巧1 小时前
01.Golang 源码目录结构
开发语言·后端·golang