python学习-处理csv文档

542 阅读7分钟

python学习-处理csv文档

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

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

引言

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

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

CSV文件介绍

CSV文件及其结构

CSV(Comma-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 会自动对齐数据,这使得数据合并、连接等操作变得容易。
  • 丰富的数据操作功能:提供了大量的数据操作功能,包括数据筛选、排序、分组、聚合等。
  • 灵活的数据合并:支持多种数据合并方式,如 merge、join 和 concat。
  • 时间序列功能:提供了强大的时间序列功能,包括时间序列索引和日期范围生成器。
  • 数据可视化:可以与 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 库可以轻松实现并行处理。
  • 优化数据存储格式:考虑使用更高效的数据存储格式,如 Parquet 或 HDF5,这些格式在读写时比 CSV 更高效,特别是对于大型数据集。

python学习专栏系列

练习代码库地址

python-study