自学内容网 自学内容网

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

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


原文地址:https://blog.csdn.net/weixin_45999406/article/details/143581656

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!