我们的目标是:通过这一套资料学习下来,可以熟练掌握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
今天先写学习到这里了,每天进步一点点。明天也要加油啊!