如何用Python对一个文件写一个循环

在实际开发中,我们经常需要处理文件,并对文件中的数据进行循环操作。本文将介绍如何使用Python对一个文件写一个循环,并提供一个具体的问题来解决。

问题描述

假设我们有一个文本文件,文件中每一行都包含一个学生的姓名和成绩,格式如下:

张三 90
李四 80
王五 95
...

我们需要读取这个文件,并计算所有学生的平均成绩。

解决方案

1. 打开文件

首先,我们需要打开文件,并创建一个文件对象来操作文件。Python提供了内置的open()函数来打开文件,可以指定文件路径和打开模式。在本例中,我们使用只读模式('r')打开文件。

filename = 'data.txt'
file = open(filename, 'r')

2. 读取文件内容

接下来,我们需要读取文件的内容。Python的文件对象提供了多个方法来读取文件,其中最常用的是readlines()方法,它会一次性读取文件的所有行,并返回一个包含所有行的列表。

lines = file.readlines()

3. 关闭文件

在读取完文件内容后,我们应该立即关闭文件,以释放系统资源。

file.close()

4. 处理文件内容

现在,我们可以对文件内容进行处理。根据问题描述,每一行包含一个学生的姓名和成绩,我们可以使用字符串的split()方法将每一行分割成姓名和成绩两个部分。

scores = []
for line in lines:
    parts = line.strip().split()
    name = parts[0]
    score = int(parts[1])
    scores.append(score)

在上述代码中,我们使用strip()方法去除字符串两端的空白字符,并使用split()方法将字符串分割成多个部分,返回一个由分割后的部分组成的列表。然后,我们可以通过索引访问列表中的各个部分。

在这个例子中,我们将成绩转换成整数,并将其添加到一个列表中。

5. 计算平均成绩

最后,我们可以计算平均成绩。Python提供了内置的sum()函数可以计算列表中所有元素的和,以及len()函数可以计算列表中元素的个数。

average = sum(scores) / len(scores)

完整代码

下面是完整的代码示例:

filename = 'data.txt'
file = open(filename, 'r')
lines = file.readlines()
file.close()

scores = []
for line in lines:
    parts = line.strip().split()
    name = parts[0]
    score = int(parts[1])
    scores.append(score)

average = sum(scores) / len(scores)
print('Average score:', average)

结果展示

通过运行上述代码,我们可以得到所有学生的平均成绩。为了更直观地展示结果,我们可以使用matplotlib库绘制一个饼状图。

import matplotlib.pyplot as plt

# 数据
labels = ['Above Average', 'Below Average']
sizes = [len([score for score in scores if score >= average]), len([score for score in scores if score < average])]

# 饼状图
plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90)
plt.axis('equal')  # 保证饼状图是圆形
plt.title('Students\' Performance')
plt.show()

通过上述代码,我们可以看到学生成绩的分布情况。

数据存储与关系图

如果我们希望将学生的姓名和成绩存储到数据库中,并展示学生之间的关系,我们可以使用关系图来表示学生之间的联系。

下面是使用Python和数据库的示例代码:

import sqlite3

# 连接数据库
conn = sqlite3.connect('students.db')
c = conn.cursor()

# 创建表
c.execute('''CREATE TABLE IF NOT EXISTS students
             (name TEXT, score INTEGER)''')

# 插入数据
for line in lines:
    parts = line.strip().split()
    name = parts[0]
    score = int(parts[1])