Python高效拆分CSV文件:方法、技巧及性能优化150
CSV (Comma Separated Values) 文件是一种简单且广泛使用的文本数据格式,用于存储表格数据。在数据处理过程中,我们经常会遇到需要处理大型 CSV 文件的情况。由于文件过大,直接处理可能导致内存溢出或处理速度过慢。这时,就需要将大型 CSV 文件拆分成多个较小的文件进行处理,以提高效率和可管理性。本文将详细介绍使用 Python 分离 CSV 文件的多种方法,并探讨如何优化代码性能,以处理海量数据。
方法一:基于行数分割
这是最简单直接的方法,根据预设的行数将 CSV 文件分割成多个文件。 以下代码实现将 CSV 文件按每 1000 行分割成一个新文件:```python
import csv
def split_csv_by_rows(input_file, output_prefix, rows_per_file=1000):
"""
根据行数分割CSV文件。
Args:
input_file: 输入CSV文件的路径。
output_prefix: 输出文件的名前缀。
rows_per_file: 每文件包含的行数。
"""
with open(input_file, 'r', encoding='utf-8') as infile:
reader = (infile)
header = next(reader) # 获取表头
file_num = 1
current_file = open(f"{output_prefix}_{file_num}.csv", 'w', newline='', encoding='utf-8')
writer = (current_file)
(header) # 写入表头到每个文件
row_count = 0
for row in reader:
(row)
row_count += 1
if row_count >= rows_per_file:
()
file_num += 1
current_file = open(f"{output_prefix}_{file_num}.csv", 'w', newline='', encoding='utf-8')
writer = (current_file)
(header) # 写入表头到每个文件
row_count = 0
()
# 示例用法
input_file = ""
output_prefix = "output"
split_csv_by_rows(input_file, output_prefix)
```
这段代码使用了 `csv` 模块,高效地读取和写入 CSV 数据。 `encoding='utf-8'` 参数确保能够正确处理各种字符编码。 它会创建一系列以 ``, `` 等命名的文件。
方法二:基于大小分割
此方法根据文件大小分割 CSV 文件,更适合处理行数不一致或行长度差异较大的文件。 这需要我们逐行读取并跟踪文件大小:```python
import csv
import os
def split_csv_by_size(input_file, output_prefix, file_size_mb=10):
"""
根据文件大小分割CSV文件。
Args:
input_file: 输入CSV文件的路径。
output_prefix: 输出文件的名前缀。
file_size_mb: 每个文件的大小(以MB为单位)。
"""
file_size_bytes = file_size_mb * 1024 * 1024
with open(input_file, 'r', encoding='utf-8') as infile:
reader = (infile)
header = next(reader)
file_num = 1
current_file = open(f"{output_prefix}_{file_num}.csv", 'w', newline='', encoding='utf-8')
writer = (current_file)
(header)
current_file_size = 0
for row in reader:
row_bytes = len(str(row).encode('utf-8')) #估算行大小
if current_file_size + row_bytes > file_size_bytes:
()
file_num += 1
current_file = open(f"{output_prefix}_{file_num}.csv", 'w', newline='', encoding='utf-8')
writer = (current_file)
(header)
current_file_size = 0
(row)
current_file_size += row_bytes
()
# 示例用法
input_file = ""
output_prefix = "output_size"
split_csv_by_size(input_file, output_prefix, file_size_mb=5) # 每个文件5MB
```
此方法通过估算每行的字节数来控制文件大小。 需要注意的是,这只是一个近似值,实际文件大小可能略有偏差。
性能优化
对于极大的 CSV 文件,即使是上述方法也可能需要较长时间。以下是一些性能优化建议:
使用 `()`: 一次写入多行数据,而不是一行一行地写入,可以显著提高写入速度。
缓冲写入: 使用 `` 创建一个内存缓冲区,批量写入数据后再写入文件,减少磁盘 I/O 操作。
多进程或多线程: 对于超大型文件,可以考虑使用多进程或多线程技术,并行处理不同的文件片段。
选择合适的编码: 确保使用正确的编码,避免不必要的编码转换开销。
总结
本文介绍了使用 Python 分割 CSV 文件的两种常用方法,并提供了性能优化建议。选择哪种方法取决于具体的应用场景和文件特性。 对于行数相对均匀的文件,基于行数分割更简单直接;对于行长差异较大的文件,基于大小分割更稳妥。 通过合理的代码设计和性能优化,我们可以高效地处理海量 CSV 数据。
注意: 以上代码示例假设 CSV 文件包含表头。如果你的 CSV 文件没有表头,需要修改代码以去除获取表头的部分。
2025-06-09

C语言图形化编程入门:详解图案输出方法与技巧
https://www.shuihudhg.cn/119753.html

Java类数据复制的多种方法及性能比较
https://www.shuihudhg.cn/119752.html

Python数据归类统计:从基础到进阶应用详解
https://www.shuihudhg.cn/119751.html

深入浅出Python Qt函数:从入门到进阶
https://www.shuihudhg.cn/119750.html

Python文件操作:创建、打开和最佳实践
https://www.shuihudhg.cn/119749.html
热门文章

Python 格式化字符串
https://www.shuihudhg.cn/1272.html

Python 函数库:强大的工具箱,提升编程效率
https://www.shuihudhg.cn/3366.html

Python向CSV文件写入数据
https://www.shuihudhg.cn/372.html

Python 静态代码分析:提升代码质量的利器
https://www.shuihudhg.cn/4753.html

Python 文件名命名规范:最佳实践
https://www.shuihudhg.cn/5836.html