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

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

相关推荐
数据智能老司机2 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机3 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机3 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机3 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i3 小时前
drf初步梳理
python·django
每日AI新事件3 小时前
python的异步函数
python
这里有鱼汤4 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python
databook13 小时前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室13 小时前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python
倔强青铜三15 小时前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试