目录

  • 1 前言
    • 1.1  Python解释器安装
    • 1.2  PyCharm开发环境
  • 2 Python程序设计实验
    • 2.1  实验1 基本输入输出
    • 2.2  实验2 基本运算
    • 2.3  实验3 字符串处理
    • 2.4  实验4 列表与元组应用
    • 2.5  实验5 列表与元组应用
    • 2.6  实验6 字典与集合应用
    • 2.7  实验7 函数应用1
    • 2.8  实验8 函数应用2
    • 2.9  实验9 类的创建与应用
    • 2.10  实验10 模块应用
    • 2.11  实验11 文件操作
    • 2.12  实验12 异常处理
    • 2.13  实验13 使用正则表达式
    • 2.14  实验14 tkinter基础应用
  • 3 学习参考
    • 3.1  1 Python及其IDLE环境
    • 3.2  2 Python代码规范
    • 3.3  3 使用变量
    • 3.4  4 输入输出
    • 3.5  5 运算符
    • 3.6  6 字符串
    • 3.7  7 条件语句
    • 3.8  8 循环语句
    • 3.9  9 列表
    • 3.10  10 元组
    • 3.11  11 字典
    • 3.12  12 集合
    • 3.13  13 自定义函数
    • 3.14  14 内置函数
    • 3.15  15 类的创建和使用
    • 3.16  16 类的继承与多态
    • 3.17  17 time模块
    • 3.18  18 os模块
    • 3.19  19 random模块
    • 3.20  20 文件
    • 3.21  21 错误与异常处理
 实验11 文件操作

任务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:(     ⑧    )     #终止循环。 需补充代码