python之csv、openpyxl/pandas
一、csv 模块
1、写csv的基本流程
打开文件
使用 open()
函数以写模式('w'
)打开 CSV 文件。
创建 CSV 写入器
使用 csv.writer()
或 csv.DictWriter()
创建一个写入器对象。
写入表头(可选)
使用 writeheader()
方法写入表头,如果使用的是 DictWriter
。
写入数据行
使用 writerow()
或 writerows()
方法写入单行或多行数据。
关闭文件
关闭文件以确保数据被写入。
2、写csv案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | def main(): all_sql_info = parse_slow_log(log_file_path) # 按照 Query_time 排序,降序 sorted_all_sql_info = sorted (all_sql_info, key = lambda x: x.get( 'query_time' , 0 ), reverse = True ) # 将结果输出到csv文件 with open (output_file_path, 'w' , newline = ' ', encoding=' utf - 8 ') as csvfile: fieldnames = [ '开始时间' , '登录信息' , '查询耗时/s' , '锁表耗时/s' , '返回行数' , '扫描行数' , 'SQL' ] writer = csv.DictWriter(csvfile, fieldnames = fieldnames) writer.writeheader() for q in sorted_all_sql_info: writer.writerow({ '开始时间' : q.get( 'time' , 'N/A' ), '登录信息' : q.get( 'user_host' , 'N/A' ), '查询耗时/s' : q.get( 'query_time' , 'N/A' ), '锁表耗时/s' : q.get( 'lock_time' , 'N/A' ), '返回行数' : q.get( 'rows_sent' , 'N/A' ), '扫描行数' : q.get( 'rows_examined' , 'N/A' ), 'SQL' : q.get( 'exec_sql' , 'N/A' ) }) print (f '结果成功保存到: {output_file_path}' ) |
注意:
1、表头的内容在 fieldnames 列名中,调用 writeheader()
方法会使用 fieldnames
中的列名,向 CSV 文件写入表头。
fieldnames
确立了写入 CSV 文件的列名,它对于后续多个字典形式的数据写入是非常重要的,确保了数据的结构一致性。
2、写入器的补充:
一般使用 csv.writer 和
csv.DictWriter
csv.writer
- 功能:用于将行写入 CSV 文件,默认以逗号作为分隔符。
- 使用场景:适用于简单的数据写入,不需要指定列名的情况,通常用于已知列顺序的元组或列表的写入。
csv.DictWriter
- 功能:用于以字典的形式写入行,允许通过列名来指定每列的内容。
- 使用场景:适用于数据来源为字典的情况,方便管理列名及其对应的数据,常用于复杂的数据结构。
3、读csv的基本流程
打开文件
使用 open()
函数以读模式('r'
)打开 CSV 文件。
创建 CSV 读取器
使用 csv.reader()
或 csv.DictReader()
创建一个读取器对象。
读取数据行
使用 reader()
方法读取所有行,或使用迭代遍历逐行读取。
关闭文件
关闭文件(如果不使用 with
语句,建议手动关闭)。
4、读csv案例
1 2 3 4 5 6 7 8 | import csv # 打开文件,设置读模式 with open ( 'output.csv' , 'r' , encoding = 'utf-8' ) as csvfile: reader = csv.DictReader(csvfile) # 创建 DictReader 对象 for row in reader: # 逐行遍历 print (row) # 每行数据以字典形式输出 |
二、openpyxl 和 pandas模块
1、openpyxl和pandas的使用场景
openpyxl
openpyxl
是一个用于读写 Excel 文件(特别是 .xlsx 格式)的库。它允许用户通过 Python 程序创建、修改和提取 Excel 文件的内容,支持各种 Excel 功能,如设置单元格格式、操作图表等。下面是一些 openpyxl
的主要功能:
- 读取和写入 Excel 文件:能够加载已存在的 Excel 文件,并新建 Excel 文件。
- 单元格操作:可以读取和设置单元格的值、格式、样式等。
- 工作表操作:能够创建、删除和重命名工作表。
- 公式支持:可以在单元格中添加 Excel 的公式。
- 图表生成:支持在工作簿中添加图表。
pandas
pandas
是一个强大的数据分析和数据处理库,它不仅能处理 Excel 文件,还能处理 CSV、SQL 数据库等多种数据格式。pandas
的数据结构(如 DataFrame 和 Series)非常适合用于数据分析。它的主要功能包括:
- 数据结构:提供 DataFrame 和 Series 两种主要数据结构,可以方便地处理和操作数据。
- 数据读取与写入:支持从多种文件格式读取数据(如 CSV、Excel、JSON、SQL 等)以及将数据写入这些格式。
- 数据处理和清洗:提供丰富的方法来处理缺失值、过滤数据、合并和连接数据。
- 数据分析:可以快速进行聚合和分组操作、数据透视表等。
- 时间序列处理:对时间序列数据提供强大的支持,方便进行时间序列分析。
总结
- 如果你的工作主要涉及 Excel 文件的读写和格式处理,使用
openpyxl
会比较合适。 - 如果你的任务包括数据分析、处理和可视化,并且可能需要处理多种文件格式,
pandas
是一个更全面的选择。
2、openpyxl 的使用
1、安装
1 | pip install openpyxl |
2、创建工作簿
1 2 3 4 5 6 7 8 9 10 | from openpyxl import Workbook, load_workbook # 创建一个新的工作簿 wb = Workbook() # 选择当前活动工作表 ws = wb.active # 可以为工作表重命名 ws.title = "Sheet1" |
3、写入数据、保存
1 2 3 4 5 6 7 8 9 10 | # 向单元格写入数据 ws[ 'A1' ] = "Hello" ws[ 'B1' ] = "World" # 使用循环写入多行数据 for i in range ( 2 , 10 ): ws.append([f "Data {i}" , i]) # 保存工作簿到文件 wb.save( "my_workbook.xlsx" ) |
4、读取 Excel 文件
1 2 3 4 5 6 7 8 9 10 11 12 | # 加载已存在的工作簿 wb = load_workbook( "my_workbook.xlsx" ) # 选择工作表 ws = wb.active # 或者 ws = wb['Sheet1'] # 读取单元格的值 print (ws[ 'A1' ].value) # 输出: Hello # 遍历工作表中的所有单元格 for row in ws.iter_rows(values_only = True ): print (row) # 每一行以元组形式输出 |
5、修改单元格内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # 修改单元格的内容 ws[ 'A1' ] = "Hello, OpenPyXL" # 保存更改 wb.save( "my_workbook.xlsx" ) # 删除工作表 ws_to_delete = wb[ "Sheet1" ] wb.remove(ws_to_delete) # 保存更改 wb.save( "my_workbook.xlsx" ) # 合并单元格 ws.merge_cells( 'A1:B1' ) # 合并 A1 和 B1 ws[ 'A1' ] = "Merged Cell" # 设置合并后的单元格值 from openpyxl.styles import Font # 设置字体样式 font = Font(bold = True , color = "FF0000" ) # 红色加粗 ws[ 'A1' ].font = font |
6、案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | def save_to_excel(data, file_path): # 创建一个工作簿 wb = Workbook() ws = wb.active ws.title = "Slow Log Analysis" # 添加表头 headers = [ '开始时间' , '登录信息' , '查询耗时/s' , '锁表耗时/s' , '返回行数' , '扫描行数' , 'SQL' ] ws.append(headers) # 添加数据 for item in data: ws.append([ item.get( 'time' ), item.get( 'user_host' ), item.get( 'query_time' ), item.get( 'lock_time' ), item.get( 'rows_sent' ), item.get( 'rows_examined' ), item.get( 'exec_sql' ) ]) # 保存工作簿 wb.save(file_path) def main(): all_sql_info = parse_slow_log(log_file_path) # 按照 Query_time 排序,降序 sorted_all_sql_info = sorted (all_sql_info, key = lambda x: x.get( 'query_time' , 0 ), reverse = True ) # 将结果输出到 Excel 文件 save_to_excel(sorted_all_sql_info, output_file_path) print (f '结果成功保存到: {output_file_path}' ) if __name__ = = "__main__" : main() |
3、pandas的使用
1、pandas的基本使用流程
1 2 3 4 5 6 7 8 9 10 11 12 13 | import pandas as pd # 从字典创建 DataFrame data = { 'Name' : [ 'Alice' , 'Bob' , 'Charlie' ], 'Age' : [ 24 , 30 , 22 ], 'City' : [ 'New York' , 'Los Angeles' , 'Chicago' ] } df = pd.DataFrame(data) # 从列表创建 DataFrame data = [[ 'Alice' , 24 , 'New York' ], [ 'Bob' , 30 , 'Los Angeles' ], [ 'Charlie' , 22 , 'Chicago' ]] df = pd.DataFrame(data, columns = [ 'Name' , 'Age' , 'City' ]) |
pd.DataFrame
是 pandas
库中的一个核心数据结构,类似于电子表格或 SQL 表。它提供了一种方便的方法来存储和操作表格型数据。以下是 pd.DataFrame
的详细介绍,包括其特性、常用操作和示例。
特性
-
二维数据结构:
DataFrame
是一个带有行和列的数据表,可以看作是一个字典的字典或一个二维数组。 -
灵活的行列索引:每一列可以有不同的数据类型(整数、浮点数、字符串等),并可以通过标签或数值索引来访问数据。
-
自动对齐:在合并或拼接多个
DataFrame
时,pandas
会根据它们的索引对齐数据。 -
多种输入、输出格式:可以从多种文件格式(CSV、Excel、SQL 等)读取数据,也可以输出为不同格式的文件。
-
强大的数据操作功能:支持数据选择、过滤、计算、分组和合并等多种操作。
2、创建、读取、修改和写入数据的基本流程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | import pandas as pd # 创建 DataFrame data = { 'Name' : [ 'Alice' , 'Bob' , 'Charlie' ], 'Age' : [ 24 , 30 , 22 ], 'City' : [ 'New York' , 'Los Angeles' , 'Chicago' ] } df = pd.DataFrame(data) # 查看数据 print (df.head()) # 过滤出年龄大于25的人 filtered_df = df[df[ 'Age' ] > 25 ] print (filtered_df) # 添加新列 df[ 'Salary' ] = [ 50000 , 60000 , 55000 ] # 修改年龄列 df[ 'Age' ] = df[ 'Age' ] + 1 # 排序 sorted_df = df.sort_values(by = 'Age' , ascending = False ) # 保存到 CSV 文件 sorted_df.to_csv( 'output.csv' , index = False ) |
3、写一个excel文件案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | def main(): all_sql_info = parse_slow_log(log_file_path) # 按照 Query_time 排序,降序 sorted_all_sql_info = sorted (all_sql_info, key = lambda x: x.get( 'query_time' , 0 ), reverse = True ) # 使用 pandas 创建 DataFrame df = pd.DataFrame(sorted_all_sql_info) # 将结果输出到 Excel 文件 df.to_excel(output_file_path, index = False , header = [ '开始时间' , '登录信息' , '查询耗时/s' , '锁表耗时/s' , '返回行数' , '扫描行数' , 'SQL' ]) print (f '结果成功保存到: {output_file_path}' ) |