python学习-处理csv文档

128 阅读7分钟

python学习-处理csv文档

本文介绍 python 如何处理 CSV 文档,包括 CSV 文件的介绍、安装依赖、创建并写入 CSV 文件、读取 CSV 文件、高级功能、Pandas 库处理 CSV、性能优化等。

供自己以后查漏补缺,也欢迎同道朋友交流学习。

引言

上面几篇文章,主要介绍了 Python 处理 wordPDFexcel 的文档,在处理大量数据和数据库文件时,需要使用 CSV 文件。

因此,本章主要介绍 Python 如何处理 CSV 文档,包括 CSV 文件的介绍、安装依赖、创建并写入 CSV 文件、读取 CSV 文件、高级功能、Pandas 库处理 CSV、性能优化等。

CSV文件介绍

CSV文件及其结构

CSVComma-Separated Values,逗号分隔值)文件是一种简单的文本格式,用于存储表格数据,如电子表格数据库

CSV 文件由纯文本组成,其中的数据通常是以逗号分隔的值。每一行代表数据表中的一行,而每一行中的数据项则由逗号分隔。

CSV 文件的结构简单,易于阅读编写,同时也易于被各种程序处理

一个典型的 CSV 文件结构如下所示:

姓名,年龄,城市
张三,30,南京
李四,25,北京
王五,35,上海

CSV常见用途

CSV 文件因其简单性和灵活性而被广泛使用。以下是一些常见的用途:

  • 数据交换:常用于不同程序或系统之间的数据交换,因为它可以被大多数电子表格软件和数据库系统轻松读取和写入。
  • 数据备份:可以作为数据库或电子表格数据的备份格式,方便数据的存储和传输。
  • 数据分析:数据分析工具和编程语言(如Python、R)可以轻松读取,进行数据分析和处理
  • 报告生成:可以作为报告的一部分,提供数据的快照,方便用户查看和分析。

安装依赖

csv 是 python 的内置模块,不需要额外安装,但我们处理数据,经常要用到 pandas 库:

pip install pandas
# or
pip3 install pandas

创建并写入CSV文件

csv 模块提供了 csv.writer 类,允许将数据写入 CSV 文件:

  • 打开文件:使用 open() 函数以写入模式打开一个文件。
  • 创建csv.writer对象:使用 csv.writer() 创建一个写入器对象。
  • 写入数据:使用 writerow() 方法写入单行数据,或使用 writerows() 方法写入多行数据。
import csv

# 表头数据
headers = ['姓名', '年龄', '城市']
# 数据
rows = [
  ['张三', 25, '北京'],
  ['李四', 30, '上海'],
  ['王五', 28, '广州']
]

# 写入CSV文件
with open('csv-1.csv', 'w', newline='', encoding='utf-8') as csvfile:
  writer = csv.writer(csvfile)
  # 写入表头
  writer.writerow(headers)
  # 写入数据
  writer.writerows(rows)

读取CSV文件

csv 模块提供了 csv.reader 类,允许逐行读取 CSV 文件中的数据。

import csv

# 写入CSV文件
with open('csv-1.csv', 'r', encoding='utf-8') as csvfile:
  reader = csv.reader(csvfile)
  
  # 读取第一行数据(表头)
  headers = next(reader)
  
  # 读取剩余行数据
  rows = [row for row in reader]

# 打印表头和数据
print(headers)
# 输出:['姓名', '年龄', '城市']
print(rows)
# 输出:[['张三', '25', '北京'], ['李四', '30', '上海'], ['王五', '28', '广州']]

读取CSV文件到字典

将 CSV 文件读取到字典中,可以使用 csv.DictReader 类,将每行数据读取为一个字典,其中键是列名。

import csv

# 写入CSV文件
with open('csv-1.csv', 'r', encoding='utf-8') as csvfile:
  reader = csv.DictReader(csvfile)
  
  #创建一个列表来存储数据
  data = [row for row in reader]
  
# 打印数据
for item in data:
  print(item)
# 输出:
# {'姓名': '张三', '年龄': '25', '城市': '北京'}
# {'姓名': '李四', '年龄': '30', '城市': '上海'}
# {'姓名': '王五', '年龄': '28', '城市': '广州'}

Pandas处理CSV

Pandas库

pandas 是一个强大的数据分析库,提供了丰富的数据处理功能。它提供了DataFrame数据结构,允许以表格形式处理数据,并且提供了许多方便的方法来处理和分析数据。

pandas 库的主要优势包括:

  • 高性能:内部使用 C 语言和 NumPy 库,这使得它在处理大型数据集时非常快速。
  • 易用性:提供了直观的 API,使得数据操作变得简单。
  • 自动对齐:在处理数据时,pandas自动对齐数据,这使得数据合并连接等操作变得容易。
  • 丰富的数据操作功能:提供了大量的数据操作功能,包括数据筛选排序分组聚合等。
  • 灵活的数据合并:支持多种数据合并方式,如 mergejoinconcat
  • 时间序列功能:提供了强大的时间序列功能,包括时间序列索引日期范围生成器
  • 数据可视化:可以与 matplotlib 等可视化库集成,方便地进行数据可视化。

使用pandas

  • 读取CSV文件: 使用 pandas.read_csv() 读取 CSV 文件
  • 写入CSV文件: 使用 pandas.DataFrame.to_csv() 写入 CSV 文件
import pandas
# 使用pandas读取CSV文件
df = pandas.read_csv('csv-1.csv')

# 显示DataFrame
print(df)
# 输出:
#    姓名  年龄  城市
# 0  张三  25  北京
# 1  李四  30  上海
# 2  王五  28  广州

# 使用pandas写入CSV文件
df.to_csv('csv-2.csv', index=False)

高级CSV处理技巧

使用csv.DictWriter写入CSV

import csv

# 要写入的数据
data = [
  {'姓名': '张三', '年龄': '25', '城市': '北京'},
  {'姓名': '李四', '年龄': '30', '城市': '上海'},
  {'姓名': '王五', '年龄': '28', '城市': '广州'}
]

# 写入CSV文件
with open('csv-3.csv', 'w', encoding='utf-8', newline='') as csvfile:
  # 获取表头(字典的键)
  headers = list(data[0].keys())
  writer = csv.DictWriter(csvfile, fieldnames=headers)
  # 写入表头
  writer.writeheader()
  # 写入数据行
  writer.writerows(data)

使用pandas进行数据筛选、排序和聚合

pandas 提供了强大的数据操作功能,包括筛选、排序和聚合。

import pandas as pd

# 读取CSV文件
df = pd.read_csv('csv-1.csv')


# 数据筛选
# 筛选年龄大于30的行
filtered_df = df[df['年龄'] > 26]
# 输出筛选结果
print(filtered_df)
# 输出:
#    姓名  年龄  城市
# 1  李四  30  上海
# 2  王五  28  广州


# 数据排序
# 按年龄升序排序
sorted_df = df.sort_values('年龄')
# 输出排序结果
print(sorted_df)
# 输出:
#    姓名  年龄  城市
# 0  张三  25  北京
# 2  王五  28  广州
# 1  李四  30  上海


# 数据分组
# 按城市分组,并计算每个城市的平均年龄
grouped_df = df.groupby('城市')['年龄'].mean()
# 输出分组结果
print(grouped_df)
# 输出:
# 城市
# 北京    25.0
# 上海    30.0
# 广州    28.0
# Name: 年龄, dtype: float64


# 数据统计
# 计算年龄的总和、平均值、最大值和最小值
stats = df['年龄'].agg(['sum', 'mean', 'max', 'min'])
# 输出统计结果
print(stats)
# 输出:
# sum     83.000000
# mean    27.666667
# max     30.000000
# min     25.000000
# Name: 年龄, dtype: float64

性能优化

处理大型 CSV 文件时,性能问题是一个重要的考虑因素:

  • 内存消耗:大型 CSV 文件可能会占用大量内存,特别是当整个文件被一次性读入内存时。
  • 处理时间:文件越大,读取和处理数据所需的时间就越长
  • 磁盘I/O:频繁的磁盘读写操作会显著降低处理速度。
  • 数据过滤和转换:在大型数据集上执行复杂数据过滤和转换操作可能会非常耗时。

为了优化性能,可以采取以下措施:

  • 使用分块处理:使用 chunksize 来将文件分成多个块,逐块处理数据,减少内存消耗。
  • 仅读取必要的列:使用 usecols 读取必要的列,而不是整个文件。
  • 使用合适的数据类型:使用 dtype 选择合适的数据类型,以减少内存占用。
  • 利用向量化操作pandas 提供了向量化操作,这比循环遍历数据行要快得多。
  • 并行处理:对于可以并行处理的任务,使用多线程多进程可以显著提高性能,使用 multiprocessing 库可以轻松实现并行处理。
  • 优化数据存储格式:考虑使用更高效的数据存储格式,如 ParquetHDF5,这些格式在读写时比 CSV 更高效,特别是对于大型数据集

python学习专栏系列

练习代码库地址

python-study