Python文件和数据处理:CSV文件操作①

1,378 阅读7分钟

2024-07-09_175549.png

CSV(Comma-Separated Values,逗号分隔值)文件是一种常见的数据文件格式,用于存储表格数据。Python 提供了强大的 csv 模块,用于读写 CSV 文件。此外,Python 中的 pandas 库也提供了丰富的功能来处理 CSV 文件。本博文将详细介绍如何使用 Python 处理 CSV 文件,并附上一个综合详细的例子。

1. CSV 文件基础知识

CSV 文件是一种简单的纯文本格式,用于存储表格数据。每一行代表一条记录,记录中的字段用逗号分隔。例如:

name,age,city
Alice,30,New York
Bob,25,Los Angeles
Charlie,35,Chicago

2. 使用 Python 内置的 csv 模块

Python 的 csv 模块提供了读取和写入 CSV 文件的功能。我们将介绍如何使用该模块读取和写入 CSV 文件。

2.1 读取 CSV 文件

使用 csv.reader 函数可以读取 CSV 文件。以下是一个简单的示例:

import csv

# 打开 CSV 文件
with open('example.csv', 'r', newline='') as csvfile:
    csv_reader = csv.reader(csvfile)
    
    # 读取文件内容
    for row in csv_reader:
        print(row)

2.2 写入 CSV 文件

使用 csv.writer 函数可以将数据写入 CSV 文件。以下是一个简单的示例:

import csv

# 数据
data = [
    ['name', 'age', 'city'],
    ['Alice', 30, 'New York'],
    ['Bob', 25, 'Los Angeles'],
    ['Charlie', 35, 'Chicago']
]

# 打开 CSV 文件
with open('example.csv', 'w', newline='') as csvfile:
    csv_writer = csv.writer(csvfile)
    
    # 写入数据
    csv_writer.writerows(data)

2.3 使用字典读写 CSV 文件

csv.DictReadercsv.DictWriter 类允许使用字典读取和写入 CSV 文件。这在处理包含标题行的 CSV 文件时特别有用。

读取 CSV 文件

import csv

# 打开 CSV 文件
with open('example.csv', 'r', newline='') as csvfile:
    csv_reader = csv.DictReader(csvfile)
    
    # 读取文件内容
    for row in csv_reader:
        print(row)

写入 CSV 文件

import csv

# 数据
data = [
    {'name': 'Alice', 'age': 30, 'city': 'New York'},
    {'name': 'Bob', 'age': 25, 'city': 'Los Angeles'},
    {'name': 'Charlie', 'age': 35, 'city': 'Chicago'}
]

# 打开 CSV 文件
with open('example.csv', 'w', newline='') as csvfile:
    fieldnames = ['name', 'age', 'city']
    csv_writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    
    # 写入标题行
    csv_writer.writeheader()
    
    # 写入数据
    csv_writer.writerows(data)

3. 使用 pandas 处理 CSV 文件

pandas 是一个强大的数据分析库,提供了丰富的功能来处理 CSV 文件。以下是如何使用 pandas 读写 CSV 文件的示例。

3.1 安装 pandas

首先,确保你已经安装了 pandas 库。可以使用以下命令进行安装:

pip install pandas

3.2 读取 CSV 文件

使用 pandas.read_csv 函数可以读取 CSV 文件:

import pandas as pd

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

# 打印数据框
print(df)

3.3 写入 CSV 文件

使用 pandas.DataFrame.to_csv 方法可以将数据写入 CSV 文件:

import pandas as pd

# 数据
data = {
    'name': ['Alice', 'Bob', 'Charlie'],
    'age': [30, 25, 35],
    'city': ['New York', 'Los Angeles', 'Chicago']
}

# 创建数据框
df = pd.DataFrame(data)

# 写入 CSV 文件
df.to_csv('example.csv', index=False)

4. 综合详细的例子

为了展示如何使用 Python 处理 CSV 文件,我们将构建一个学生管理系统。该系统将允许用户添加、删除和查找学生信息,并将数据存储在 CSV 文件中。

4.1 学生管理系统

student.py

class Student:
    def __init__(self, id, name, age):
        self.id = id
        self.name = name
        self.age = age

    def __str__(self):
        return f'ID: {self.id}, Name: {self.name}, Age: {self.age}'

student_manager.py

import csv
from student import Student

class StudentManager:
    def __init__(self, filename):
        self.filename = filename
        self.students = self.load_students()

    def load_students(self):
        students = []
        try:
            with open(self.filename, 'r', newline='') as csvfile:
                csv_reader = csv.DictReader(csvfile)
                for row in csv_reader:
                    student = Student(row['id'], row['name'], row['age'])
                    students.append(student)
        except FileNotFoundError:
            pass
        return students

    def save_students(self):
        with open(self.filename, 'w', newline='') as csvfile:
            fieldnames = ['id', 'name', 'age']
            csv_writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
            csv_writer.writeheader()
            for student in self.students:
                csv_writer.writerow({'id': student.id, 'name': student.name, 'age': student.age})

    def add_student(self, id, name, age):
        student = Student(id, name, age)
        self.students.append(student)
        self.save_students()

    def remove_student(self, id):
        self.students = [s for s in self.students if s.id != id]
        self.save_students()

    def find_student(self, id):
        for student in self.students:
            if student.id == id:
                return student
        return None

    def __str__(self):
        return '\n'.join([str(student) for student in self.students])

4.2 测试学生管理系统

我们将通过一个简单的测试来展示学生管理系统的功能。

test_student_manager.py

from student_manager import StudentManager

def main():
    manager = StudentManager('students.csv')

    # 添加学生
    manager.add_student('1', 'Alice', 20)
    manager.add_student('2', 'Bob', 22)
    manager.add_student('3', 'Charlie', 21)

    print('所有学生:')
    print(manager)

    # 查找学生
    print('\n查找学生ID为2的学生:')
    print(manager.find_student('2'))

    # 移除学生
    print('\n移除学生ID为1的学生:')
    manager.remove_student('1')

    print('\n所有学生:')
    print(manager)

if __name__ == '__main__':
    main()

4.3 运行结果

所有学生:
ID: 1, Name: Alice, Age: 20
ID: 2, Name: Bob, Age: 22
ID: 3, Name: Charlie, Age: 21

查找学生ID为2的学生:
ID: 2, Name: Bob, Age: 22

移除学生ID为1的学生:

所有学生:
ID: 2, Name: Bob, Age: 22
ID: 3, Name: Charlie, Age: 21

4.4 代码解析

在本节中,我们将详细解析学生管理系统代码中的各个部分,以帮助你更好地理解和掌握代码的实现。

student.py

student.py 定义了一个简单的 Student 类,用于表示学生信息。每个学生对象包含三个属性:idnameage__str__ 方法用于返回学生信息的字符串表示。

class Student:
    def __init__(self, id, name, age):
        self.id = id
        self.name = name
        self.age = age

    def __str__(self):
        return f'ID: {self.id}, Name: {self.name}, Age: {self.age}'

student_manager.py

student_manager.py 定义了 StudentManager 类,用于管理学生信息。该类包括以下主要功能:

  1. 加载学生信息:从 CSV 文件中读取学生信息并创建 Student 对象。
  2. 保存学生信息:将学生信息写入 CSV 文件。
  3. 添加学生:向学生列表中添加新的学生对象并保存。
  4. 移除学生:从学生列表中移除指定 ID 的学生并保存。
  5. 查找学生:根据学生 ID 查找学生对象。
  6. 打印所有学生:返回所有学生的字符串表示。

load_students 方法

该方法从 CSV 文件中读取学生信息,并创建 Student 对象列表。如果文件不存在,则返回一个空列表。

def load_students(self):
    students = []
    try:
        with open(self.filename, 'r', newline='') as csvfile:
            csv_reader = csv.DictReader(csvfile)
            for row in csv_reader:
                student = Student(row['id'], row['name'], row['age'])
                students.append(student)
    except FileNotFoundError:
        pass
    return students

save_students 方法

该方法将学生信息写入 CSV 文件。首先,它会写入文件的标题行,然后写入每个学生的信息。

def save_students(self):
    with open(self.filename, 'w', newline='') as csvfile:
        fieldnames = ['id', 'name', 'age']
        csv_writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        csv_writer.writeheader()
        for student in self.students:
            csv_writer.writerow({'id': student.id, 'name': student.name, 'age': student.age})

add_student 方法

该方法创建一个新的 Student 对象并将其添加到学生列表中,然后调用 save_students 方法将更改保存到 CSV 文件中。

def add_student(self, id, name, age):
    student = Student(id, name, age)
    self.students.append(student)
    self.save_students()

remove_student 方法

该方法从学生列表中移除指定 ID 的学生对象,然后调用 save_students 方法将更改保存到 CSV 文件中。

def remove_student(self, id):
    self.students = [s for s in self.students if s.id != id]
    self.save_students()

find_student 方法

该方法根据学生 ID 查找并返回学生对象。如果未找到学生,则返回 None

def find_student(self, id):
    for student in self.students:
        if student.id == id:
            return student
    return None

__str__ 方法

该方法返回所有学生的字符串表示。

def __str__(self):
    return '\n'.join([str(student) for student in self.students])

test_student_manager.py

该文件包含一个简单的测试程序,用于展示学生管理系统的功能。通过调用 StudentManager 类的方法,测试程序可以添加、删除和查找学生信息,并打印学生列表。

from student_manager import StudentManager

def main():
    manager = StudentManager('students.csv')

    # 添加学生
    manager.add_student('1', 'Alice', 20)
    manager.add_student('2', 'Bob', 22)
    manager.add_student('3', 'Charlie', 21)

    print('所有学生:')
    print(manager)

    # 查找学生
    print('\n查找学生ID为2的学生:')
    print(manager.find_student('2'))

    # 移除学生
    print('\n移除学生ID为1的学生:')
    manager.remove_student('1')

    print('\n所有学生:')
    print(manager)

if __name__ == '__main__':
    main()

运行测试

当我们运行 test_student_manager.py 文件时,将会看到以下输出结果:

所有学生:
ID: 1, Name: Alice, Age: 20
ID: 2, Name: Bob, Age: 22
ID: 3, Name: Charlie, Age: 21

查找学生ID为2的学生:
ID: 2, Name: Bob, Age: 22

移除学生ID为1的学生:

所有学生:
ID: 2, Name: Bob, Age: 22
ID: 3, Name: Charlie, Age: 21

5. 代码总结

在这篇博文中,我们详细介绍了如何使用 Python 处理 CSV 文件,包括使用内置的 csv 模块和 pandas 库。我们还构建了一个综合详细的学生管理系统,展示了如何读写 CSV 文件,并通过一个完整的示例程序展示了系统的功能。希望通过本文的学习,你能够更加熟练地使用 Python 处理 CSV 文件,并将这些知识应用到实际项目中。

如果你有任何疑问或建议,欢迎在评论区留言。


欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力