任务1:成绩统计分析
编写程序s11A.py。要求:
1、读取d:/s11Adata.txt文件中的全部数据
2、根据读取的成绩数据按以下格式输出:
最高分=95;最低分=47;平均分=75.19;不及格人数=2
"""
(1)文件的打开与关闭(教材P106)
① 使用open函数打开文件
fileobj=open(filename, mode, encoding=None)
---mode:文件打开的模式。
r:只读方式。文件必须存在
w:只写方式。文件存在则覆盖;文件不存在则创建
a:追加方式(数据只能添加到文件尾),文件不存在则创建
b:二进制形式(缺省时以文本形式)
+:更新方式(可读写)。需与a、r或w结合使用
***以上模式可以结合。
例如:
f=open("d://s11Adata.txt","r")
print(f)
输出:
<_io.TextIOWrapper name='d://s11Adata.txt' mode='r' encoding='cp936'>
cp936指Windows系统中第936号编码格式,即GB2312。
② 使用close方法关闭文件(教材)
文件对象.close( )
该方法没有参数,直接调用即可。
例如:
f=open("d://s11Adata.txt","r")
s=f.read( )
print(s)
f.close( )
输出:
学号,python
20210001,71
......
20210032,94
打开的文件占用系统资源,若打开的文件过多,会降低系统性能。因此,编写程序时应使用close( )方法主动关闭不再使用的文件。
③ 使用with open 方法读写文件(教材P126)
如果文件不存在,open( )函数就会抛出一个异常错误;使用read方法一次读取文件的全部内容,也可能出现异常错误...... 由于文件读写时都有可能产生异常,一旦出错,后面的f.close( )就不会调用。
为了保证无论是否出错,都能正确地关闭文件,可以使用try ... finally来实现(教材第10章)
try:
f=open("d://s11Adata.txt","r")
s = f.read( )
print(s)
finally:
if f:
f.close( )
事实上,with open 方法和try ... finally一样!但代码更加简洁,并且不必调用close方法。
with open("d://s11Adata.txt","r") as f:
s=f.read( )
print(s)
(2)文件的读取(教材P107)
① read( )方法
文件对象.read([size])
不带参数时读取整个文件,将读取内容放到一个字符串变量中,返回str类型。
例如:
f=open("d://s11Adata.txt")
s=f.read( ) #读取全部数据,s为字符串,两行数据之间为"\n"
#s="学号,python\n20210001,71\n20210002,63 ..... \n20210032,94"
s=s.split("\n") #字符串分割,s为列表
#s=["学号,python","20210001,71","20210002,63" ..... ,"20210032,94"]
s=[eval(x) for x in s[1:]] #推导式生成元组s,切片s[1:]不包括第1行(标题)
#s=[(20210001,71),(20210002,63) ..... ,(20210032,94)]
cj=[x[1] for x in s] #推导式生成列表cj,生成表达式为x[1](成绩),不包括第1列x[0](学号)
#cj=[71,63,88,75,......,94] 列表cj存放所有成绩
nopass=[x for x in cj if x<60] #推导式生成列表nopass
#nopass=[47,56] 列表nopass存放不及格成绩
average=sum(cj)/len(cj)
print(f"平均分={ average:.2f }; 不及格人数={ len(nopass) }")
f.close( )
输出:
平均分=75.19; 不及格人数=2
② readline方法( )和readlines( )方法(教材P108)
readline( )方法:每次只读取文件的一行,将读取内容放到的一个字符串变量中,返回str类型。
readlines( )方法:每次按行读取整个文件内容,将读取到的内容放到一个列表中,返回list类型。
例如,readline方法( ):
f=open("d://s11Adata.txt")
txt=""
while True:
line=f.readline( )
if line=="":
break
txt+=line
f.close( )
print(txt)
例如,readlines( )方法:
f=open("c://20218888/s11Adata.txt")
s=f.readlines( ) #读取全部数据,s为列表,每行后面有"\n"
#s=["学号,python\n", "20210001,71\n", "20210002,63\n" ...... "20210032,94\n"]
cj=[ ]
for row in s[1:]: #从第2行开始,不包括标题行 "20210001,71\n"
x=row.replace("\n","") #删除"\n"字符 "20210001,71"
y=x.split(",") #字符串分割 ["20210001","71"]
cj.append(int(y[1])) #y[0]="20210001",y[1]="71"
print(f"最高分={ max(cj) };最低分={ min(cj) }")
f.close( )
任务2:修改文件部分内容
编写程序s11B.py。要求:
1、输入一个文件名(含路径)
2、如果文件不存在,则输出"ERROR"。否则:
(1)以二进制形式打开该文件
(2)将该文件前10个字节的数据逆序
(3)输出"FileReWrited"
"""
(1)向文件写入数据(教材P109)
写文件与读文件相似,都需要先创建文件对象连接。所不同的是,打开文件时是以“w”写模式或“a”添加模式打开。如果文件不存在,则创建该文件。
① write( )方法
文件对象. write(str)
参数str表示要写入的字符串。若字符串写入成功,write( )方法返回本次写入文件的长度。
例如:
f=open("d://a.txt","w")
num=f.write("Hello,world.") #参数为字符串
print(num)
f=open("d://a.txt","r")
s=f.read( )
print(s)
f.close( )
输出:
12
Hello,world.
② writelines( )方法
文件对象. writelines( [str] )
参数[str]表示要写入的字符串序列。
例如:
f=open("d://a.txt","a+")
f.writelines( ["\n"+"python","程序开发"] ) #参数为列表,元素均为字符串
f.seek(0) #文件指针重新定位于文件开头
s=f.read( )
print(s)
f.close( )
输出:
Hello,world.
python程序开发
(2)文件的定位读取(教材P110)
① 文件定位
无论读或写文件,Python都会跟踪文件中的读写位置。在默认情况下,文件的读/写都从文件的开始位置进行。Python提供了控制文件读写起始位置的方法,使得我们可以改变文件读/写操作发生的位置。

例如:
f=open("d://a.txt")
s=f.read(6) #读取6字节,文件指针向后移动6个位置
print(s)
s=f.read( ) #从当前位置读取剩下所有数据
print(s)
f.close( )
输出:
Hello,
world.
python程序开发
② tell( )方法:获取当前文件读写的位置。
文件对象. tell( )
例如:
f=open("d://a.txt")
s=f.read(6)
print(s)
print(f.tell( ))
f.close( )
输出:
Hello,
6
③ seek( )方法:设置当前文件读写位置。
文件对象.seek( offset, [from] )
offset:表示偏移量,即读写位置需要移动的字节数;
from:用于指定文件的读写位置,该参数的取值有:0、1、2,其中0表示在开始位置读写;1表示在当前位置读写;2表示在末尾位置读写。默认值为0。
例如:
f=open("d://a.txt","r+")
s=f.read(12) #读文件后,文件指针指向12
print(s)
f.seek(0) #文件指针重新指向文件开始处
f.write("python程序开发") #写文件后,文件指针指向14
f.seek(0) #文件指针重新指向文件开始处
s=f.read( ) #读取文件所有内容
print(s)
f.close( )
输出:
Hello,world.
python程序开发
(3)判断文件是否存在(参考实验10,s10B.py)
import os
s=input("输入文件名(含路径):")
if os.path.isfile(s):
print("Ok")
else:
print("ERROR")
任务3:通讯录
1、下面代码用于通讯录管理,请将代码补充完整。
2、程序保存到s11C.py。
def show_menu( ): #显示操作菜单
print("欢迎使用[通讯录]")
print("*"*22)
print("1-新建 2-显示 3-退出")
print("*"*22)
def add_info( ): #新建联系人
name=input("\n输入姓名:")
phone=input("输入手机号码:")
qq=input("输入QQ号码:")
#追加方式打开文件(以utf-8编码)。需补充代码
f=open("s11Cdata.txt","( ① )",encoding='utf-8')
f.write(f"{name},{phone},{qq}\n")
( ② ) #关闭文件。需补充代码
print(f"成功添加{name}为联系人")
def show_info( ): #显示联系人信息
#只读方式打开文件(以utf-8编码)。需补充代码
with open("s11Cdata.txt","( ③ )",encoding='utf-8') as f:
s=( ④ ) #读取全部数据。需补充代码
s=s.split('\n')
print("-"*30)
print("姓名\t手机号码\tQQ号码")
for r in s:
if r:
d=r.split(",")
print(( ⑤ ),sep="\t") #输出数据。需补充代码
print("-"*30)
#主程序:
while True:
show_menu( )
s=input("选择操作(1,2或3):")
if s=="1":( ⑥ ) #需补充代码
elif s=="2":( ⑦ ) #需补充代码
else:( ⑧ ) #终止循环。 需补充代码

