python之csv、openpyxl/pandas

一、csv 模块

1、写csv的基本流程

打开文件
  使用 open() 函数以写模式('w')打开 CSV 文件。

创建 CSV 写入器
  使用 csv.writer() 或 csv.DictWriter() 创建一个写入器对象。

写入表头(可选)
  使用 writeheader() 方法写入表头,如果使用的是 DictWriter

写入数据行
  使用 writerow() 或 writerows() 方法写入单行或多行数据。

关闭文件
  关闭文件以确保数据被写入。

2、写csv案例

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案例

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、安装

pip install openpyxl

2、创建工作簿

from openpyxl import Workbook, load_workbook

# 创建一个新的工作簿
wb = Workbook()

# 选择当前活动工作表
ws = wb.active

# 可以为工作表重命名
ws.title = "Sheet1"

3、写入数据、保存

# 向单元格写入数据
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 文件

# 加载已存在的工作簿
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、修改单元格内容

# 修改单元格的内容
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、案例

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的基本使用流程

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 的详细介绍,包括其特性、常用操作和示例。

特性

  1. 二维数据结构DataFrame 是一个带有行和列的数据表,可以看作是一个字典的字典或一个二维数组。

  2. 灵活的行列索引:每一列可以有不同的数据类型(整数、浮点数、字符串等),并可以通过标签或数值索引来访问数据。

  3. 自动对齐:在合并或拼接多个 DataFrame 时,pandas 会根据它们的索引对齐数据。

  4. 多种输入、输出格式:可以从多种文件格式(CSV、Excel、SQL 等)读取数据,也可以输出为不同格式的文件。

  5. 强大的数据操作功能:支持数据选择、过滤、计算、分组和合并等多种操作。

2、创建、读取、修改和写入数据的基本流程

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文件案例

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}')

  

 

posted @ 2024-11-21 15:32  凡人半睁眼  阅读(10)  评论(0编辑  收藏  举报