python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python处理CSV文件方法

Python中处理CSV文件的核心方法详解

作者:李昊哲小课

本文介绍了Python标准库csv模块的基本功能和使用方法,包括读取、写入、处理带标题行的CSV文件,以及自定义分隔符和引用符,通过示例和代码优化建议,帮助读者更好地理解和应用CSV文件处理,需要的朋友可以参考下

1. 模块简介

CSV(Comma-Separated Values,逗号分隔值)是一种常见的文件格式,用于存储表格数据。它使用逗号作为字段分隔符,每行代表一条记录。

Python的csv模块提供了专门用于处理CSV文件的功能,使得读取和写入CSV文件变得简单高效。

主要功能包括:

2. 核心功能详解

2.1 基本CSV读取

使用csv.reader对象可以逐行读取CSV文件内容。

基本用法:

import csv

# 读取CSV文件
with open('employees.csv', 'r', encoding='utf-8') as file:
    reader = csv.reader(file)
    for row_num, row in enumerate(reader, 1):
        print(f"第{row_num}行: {row}")

注意事项:

2.2 CSV写入操作

使用csv.writer对象可以将数据写入CSV文件。

基本用法:

import csv

# 准备数据
sample_data = [
    ['姓名', '年龄', '城市', '职业'],
    ['张三', '25', '北京', '工程师'],
    ['李四', '30', '上海', '设计师'],
    ['王五', '28', '广州', '产品经理']
]

# 写入CSV文件
with open('employees.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerows(sample_data)

print("已创建示例CSV文件 'employees.csv'")

注意事项:

2.3 使用DictReader处理带标题的CSV

csv.DictReader可以将CSV文件的第一行作为字段名,返回的每行数据是一个字典,键为字段名,值为对应的数据。

基本用法:

import csv

with open('employees.csv', 'r', encoding='utf-8') as file:
    dict_reader = csv.DictReader(file)
    for row_num, row in enumerate(dict_reader, 1):
        print(f"员工{row_num}:")
        for key, value in row.items():
            print(f"  {key}: {value}")
        print()

优势:

2.4 使用DictWriter写入数据

csv.DictWriter可以将字典数据写入CSV文件,需要指定字段名。

基本用法:

import csv

# 准备字段名称和数据
fieldnames = ['姓名', '年龄', '城市', '职业']
new_employee = {
    '姓名': '周九',
    '年龄': '29',
    '城市': '武汉',
    '职业': '前端开发'
}

# 追加新员工数据
with open('employees.csv', 'a', newline='', encoding='utf-8') as file:
    dict_writer = csv.DictWriter(file, fieldnames=fieldnames)
    dict_writer.writerow(new_employee)

print("已使用DictWriter添加新员工")

注意事项:

2.5 自定义分隔符和引用符

CSV文件不一定使用逗号作为分隔符,csv模块支持自定义分隔符和引用符。

基本用法:

import csv

# 创建使用分号分隔的CSV文件
custom_data = [
    ['产品名称', '价格', '库存'],
    ['苹果', '5.5', '100'],
    ['香蕉', '3.2', '200'],
    ['橙子', '4.8', '150']
]

with open('products.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file, delimiter=';', quoting=csv.QUOTE_MINIMAL)
    writer.writerows(custom_data)

print("已创建使用分号分隔的CSV文件 'products.csv'")

# 读取自定义分隔符的CSV文件
with open('products.csv', 'r', encoding='utf-8') as file:
    reader = csv.reader(file, delimiter=';')
    for row_num, row in enumerate(reader, 1):
        print(f"第{row_num}行: {row}")

常用引用模式:

2.6 处理CSV中的特殊情况

CSV文件中可能包含特殊字符,如引号、逗号、换行符等,csv模块可以正确处理这些情况。

基本用法:

import csv

# 创建包含特殊字符的CSV数据
special_data = [
    ['姓名', '描述'],
    ['张三', '喜欢"Python"编程'],
    ['李四', '爱好: 读书, 游泳, 旅行'],
    ['王五', '地址: 北京市朝阳区\n邮编: 100000']
]

with open('special.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file, quoting=csv.QUOTE_ALL)
    writer.writerows(special_data)

print("已创建包含特殊字符的CSV文件 'special.csv'")

# 读取包含特殊字符的CSV文件
with open('special.csv', 'r', encoding='utf-8') as file:
    reader = csv.reader(file)
    for row_num, row in enumerate(reader, 1):
        print(f"第{row_num}行: {row}")

注意事项:

3. 实用示例

3.1 CSV数据统计

示例:统计不同城市的员工数量

import csv

def count_employees_by_city(csv_file):
    """统计不同城市的员工数量"""
    city_count = {}
    
    with open(csv_file, 'r', encoding='utf-8') as file:
        dict_reader = csv.DictReader(file)
        for row in dict_reader:
            city = row['城市']
            if city in city_count:
                city_count[city] += 1
            else:
                city_count[city] = 1
    
    return city_count

# 示例使用
if __name__ == "__main__":
    # 假设employees.csv文件已存在
    city_counts = count_employees_by_city('employees.csv')
    print("各城市员工数量统计:")
    for city, count in city_counts.items():
        print(f"  {city}: {count}人")

3.2 CSV数据转换

示例:将CSV数据转换为JSON格式

import csv
import json

def csv_to_json(csv_file, json_file):
    """将CSV文件转换为JSON文件"""
    data = []
    
    with open(csv_file, 'r', encoding='utf-8') as file:
        dict_reader = csv.DictReader(file)
        for row in dict_reader:
            data.append(row)
    
    with open(json_file, 'w', encoding='utf-8') as file:
        json.dump(data, file, ensure_ascii=False, indent=2)
    
    print(f"已将 {csv_file} 转换为 {json_file}")

# 示例使用
if __name__ == "__main__":
    csv_to_json('employees.csv', 'employees.json')

3.3 CSV数据过滤

示例:过滤特定条件的记录

import csv

def filter_employees_by_age(csv_file, min_age):
    """过滤年龄大于等于指定值的员工"""
    filtered_data = []
    
    with open(csv_file, 'r', encoding='utf-8') as file:
        dict_reader = csv.DictReader(file)
        fieldnames = dict_reader.fieldnames
        
        for row in dict_reader:
            if int(row['年龄']) >= min_age:
                filtered_data.append(row)
    
    # 保存过滤结果
    output_file = f'employees_age_{min_age}+.csv'
    with open(output_file, 'w', newline='', encoding='utf-8') as file:
        dict_writer = csv.DictWriter(file, fieldnames=fieldnames)
        dict_writer.writeheader()
        dict_writer.writerows(filtered_data)
    
    print(f"已过滤并保存结果到 {output_file}")
    return filtered_data

# 示例使用
if __name__ == "__main__":
    filtered = filter_employees_by_age('employees.csv', 30)
    print(f"过滤后共有 {len(filtered)} 名员工")

3.4 CSV数据合并

示例:合并多个CSV文件

import csv
import os

def merge_csv_files(input_files, output_file):
    """合并多个CSV文件"""
    if not input_files:
        print("没有输入文件")
        return
    
    # 读取第一个文件的表头
    with open(input_files[0], 'r', encoding='utf-8') as file:
        dict_reader = csv.DictReader(file)
        fieldnames = dict_reader.fieldnames
    
    # 合并数据
    merged_data = []
    for csv_file in input_files:
        with open(csv_file, 'r', encoding='utf-8') as file:
            dict_reader = csv.DictReader(file)
            for row in dict_reader:
                merged_data.append(row)
    
    # 写入合并结果
    with open(output_file, 'w', newline='', encoding='utf-8') as file:
        dict_writer = csv.DictWriter(file, fieldnames=fieldnames)
        dict_writer.writeheader()
        dict_writer.writerows(merged_data)
    
    print(f"已合并 {len(input_files)} 个CSV文件到 {output_file}")
    print(f"总记录数: {len(merged_data)}")

# 示例使用
if __name__ == "__main__":
    input_files = ['employees1.csv', 'employees2.csv', 'employees3.csv']
    # 过滤存在的文件
    input_files = [f for f in input_files if os.path.exists(f)]
    if input_files:
        merge_csv_files(input_files, 'merged_employees.csv')
    else:
        print("没有找到输入文件")

4. 代码优化建议

  1. 使用上下文管理器:始终使用with语句来管理文件操作,确保文件正确关闭。
  2. 指定编码:在打开文件时明确指定encoding='utf-8',确保正确处理中文字符。
  3. 错误处理:添加适当的错误处理,如FileNotFoundErrorPermissionError等。
  4. 选择合适的读写方式
    1. 对于简单的CSV文件,使用csv.readercsv.writer
    2. 对于带标题的CSV文件,使用csv.DictReadercsv.DictWriter
  5. 处理大文件:对于大型CSV文件,考虑使用生成器表达式或分块处理,避免一次性加载所有数据到内存。
  6. 自定义分隔符:当处理非标准CSV文件时,记得指定正确的分隔符。
  7. 引用符设置:根据数据特点选择合适的引用模式,确保特殊字符被正确处理。
  8. 字段名处理:使用DictReader时,注意CSV文件的第一行是否包含字段名。
  9. 数据类型转换:CSV文件中的数据默认都是字符串类型,需要根据需要进行类型转换。
  10. 性能优化:对于大量数据的读写,考虑使用csv模块的快速模式,或使用第三方库如pandas

5. 常见问题与解决方案

5.1 问题:CSV文件中包含中文字符导致乱码

解决方案:在打开文件时明确指定encoding='utf-8',确保中文字符被正确处理。

5.2 问题:CSV文件读取时出现额外的空行

解决方案:在打开文件时设置newline='',避免Python的换行符处理与CSV模块的处理冲突。

5.3 问题:CSV文件中的数字被读取为字符串

解决方案:在读取后手动将需要的字段转换为数字类型,例如:age = int(row['年龄'])

5.4 问题:CSV文件中的字段包含逗号或引号

解决方案:使用适当的引用模式,如quoting=csv.QUOTE_ALL,确保特殊字符被正确处理。

5.5 问题:DictReader读取时字段名包含空格

解决方案:可以在读取后手动处理字段名,去除空格,或者在写入时确保字段名不包含空格。

5.6 问题:大型CSV文件读取内存不足

解决方案:使用迭代器逐行读取,避免一次性加载所有数据到内存。

5.7 问题:写入CSV文件时日期格式不正确

解决方案:在写入前将日期转换为适当的字符串格式,例如:date.strftime('%Y-%m-%d')

6. 总结

CSV文件是一种简单而广泛使用的数据交换格式,Python的csv模块提供了强大的功能来处理CSV文件。通过本教程,你应该已经了解了:

在实际应用中,CSV文件处理是一个常见的任务,无论是数据导入导出、数据清洗还是数据分析,都需要掌握这些基本技能。通过不断练习和实践,你将能够更加高效地处理各种CSV文件操作任务。

对于更复杂的CSV处理需求,你还可以考虑使用第三方库如pandas,它提供了更高级的CSV处理功能,如数据框操作、数据筛选、聚合等。

以上就是Python中处理CSV文件的核心方法详解的详细内容,更多关于Python处理CSV文件方法的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文