190 likes | 324 Views
计算机编程导论. 课程建设组 编著. 2012.9. 第 6 章 文件的使用. 为了长期保存数据,方便修改和 共享 ,就必须将数据以文件的形式存储到外部存储介质 ( 如磁盘 ) 中。 MIS 是使用数据库来存储数据的,而应用程序的配置信息是使用文件来存储的;图形、图像通常也是用文件来存储的。文件在软件开发中占有重要的地位,程序设计者应该掌握文件的基本原理和基本操作。. 第 6 章 文件的使用. 6.1 与文件有关的问题 6.2 文件基础知识 6.2.1 文件的打开或创建 6.2.2 字符编码 6.2.3 文本文件的写入
E N D
计算机编程导论 课程建设组 编著 2012.9
第6章 文件的使用 为了长期保存数据,方便修改和共享,就必须将数据以文件的形式存储到外部存储介质(如磁盘)中。MIS是使用数据库来存储数据的,而应用程序的配置信息是使用文件来存储的;图形、图像通常也是用文件来存储的。文件在软件开发中占有重要的地位,程序设计者应该掌握文件的基本原理和基本操作。
第6章 文件的使用 • 6.1 与文件有关的问题 • 6.2 文件基础知识 6.2.1 文件的打开或创建 6.2.2 字符编码 6.2.3 文本文件的写入 6.2.4 文件文件的读取 • 6.2.5 文件指针的移动 • 6.2.6 二进制文件的写入 • 6.2.7 二进制文件的读取 • 6.3 文件基础知识的应用
6.1 与文件有关的问题 【问题6-1】输入几名学生的通讯录,保存到文件中以备将来使用。 分析:通讯录包括姓名,性别,电话,地址,从键盘输入之后,只有存入文件中才能在关机之后仍能保存数据。 需要以写方式打开文件(新建文件),然后用write方法把数据写入文件中。
开始 打开文件 把表头写入文件 flag=='y' False True 输入数据 数据写入文件 向flag输入y或n 结束 图6-1 输入通讯录并存入文件
函数定义格式如下: def 函数名(参数): ……(函数体) #Ques6_1.py f=open('Q6_1.txt', 'w') f.write('姓 名 '+'性别 '+'电话'+' '*11+'地址'+''*18+'\n') flag='y' while flag=='y': name=input('请输入姓名:') sex=input('请输入性别:') phone=input('请输入电话:') address=input('请输入住址:') f.write(name+''*(6-len(name))) f.write(sex+''* 2) f.write(phone+''*(13-len(phone))) f.write(address+''* (20-len(address))+'\n') flag=input('是否继续输入y/n?') f.close( )
输入及程序运行结果: 请输入姓名:王小明 请输入性别:男 请输入电话:13888996322 请输入住址:云南省昆明市 是否继续输入y/n?y 请输入姓名:刘洋 请输入性别:女 请输入电话:15912180999 请输入住址:河北省石家庄 是否继续输入y/n?y 请输入姓名:赵阳 请输入性别:男 请输入电话:13199887052 请输入住址:北京市王府井6号 是否继续输入y/n?n 记事本打开文件看一下内容
开始 打开文件 读1行内容 True 到达文件尾 False 显示1行内容 结束 图6-2 读出并显示文件 【问题6-2】 把上例中存入文件的通讯录显示出来。 分析:数据一旦存入文件中,就可以在任何需要的时候把文件中的数据读出来使用。需要用读方式打开文件,然后用read( )方法读出数据。 #Ques6_2.pyf=open('Q6_1.txt', 'r') while True: line=f.readline( ) if line=='': break print(line, end='') f.close( )
6.2 文件基础知识 文件所含的字节,从文件头到文件结束,有1个默认的位置,位置从0开始。如A4SSSS3GGG 按文件中数据的组织形式把文件分为文本文件和二进制文件两类。 (1)文本文件 文本文件存储的是常规字符串,由文本行组成,通常以换行符'\n'结尾,只能读写常规字符串。文本文件可以用字处理软件如gedit、记事本进行编辑。 常规字符串是指文本编辑器能正常显示、编辑的字符串。如,英文字母串,汉字串,数字串(不是数字)。 (2)二进制文件 二进制文件把对象在内存中的内容以字节串(bytes)进行存储。不能用字处理软件进行编辑。
6.2.1 文件的打开或创建 • 文件变量名=open(文件名[, 打开方式[, 缓冲区[, encoding=字符编码]]]) (1)文件名指定了被打开的文件名称。 (2)打开模式指定了打开文件后的处理方式,见表6-1。 (3)缓冲区指定了读写文件的缓存模式。0表示不缓存, 1表示缓存,如大于1则表示缓冲区的大小。默认值是缓存模式。 (4)字符编码指定了文件中字符的编码标准。仅文本文件可指定编码。 (5)open( )函数返回1个文件对象,该对象可以对文件进行各种操作。 例如:f1 = open( 'file1.txt', 'r' ) • f2=open( 'file2.txt', 'w', encoding='UTF-8' )
文件对象建立之后,就可以使用其属性和方法。文件对象的常用属性见表6-2,文件对象的常用方法见表6-3。文件对象建立之后,就可以使用其属性和方法。文件对象的常用属性见表6-2,文件对象的常用方法见表6-3。
6.2.2 字符编码 最早的编号是美因标准信息交换码ASCII,仅对10个数字、26个大写字英文字母、26个小写字英文字母及一些其它符号进行了编码。ASCII采用8位即1个字节,因此最多只能对256个字符进行编码。随着信息技术的发展,各国的文字都需要进行编码。 常见的编码有UTF-8,GB2312,GBK,CP936。 采用不同的编码意味着把同一字符存入文件时,写入的内容可能不同。 UTF-8编码是国际通用的编码,以8位,即1字节表示英语(兼容ASCII),以24位即3字节表示中文及其它语言,UTF-8对全世界所有国家需要用到的字符进行了编码。
【例6-1】把字符串‘a1@中国’写入文件F6_1.txt中,采用UTF-8编码。显示文件的长度(总字节)。【例6-1】把字符串‘a1@中国’写入文件F6_1.txt中,采用UTF-8编码。显示文件的长度(总字节)。 程序: #Exp6_1.py f=open( 'F6_1.txt', 'w', encoding='UTF-8') f.write( 'a1@中国') length=f.seek(0, 2) #把文件指针移到文件尾,会返回文件尾的位置,其值刚好等于文件长度 f.close( ) print('文件长度=', length) 程序运行结果: 文件长度= 9
程序: • 程序: • 输入及程序运行结果: x1,y1=1, 2 x2,y2=5, 3.4 d= 4.237924020083418 6.2.3 文本文件的写入 #Exp1_1.py import math x1, y1=eval(input('x1, y1=')) x2, y2=eval(input('x2, y2=')) d=math.sqrt((x2-x1)**2+(y2-y1)**2) print('d=', d) #Exp1_1.py import math x1, y1=eval(input('x1, y1=')) x2, y2=eval(input('x2, y2=')) d=math.sqrt((x2-x1)**2+(y2-y1)**2) print('d=', d) 【例6-2】 把列表中的元素写入到文件F6_2.txt中。 程序: #Exp6_2.py f=open('F6_2.txt', 'w') li=['文本文件\n', '二进制文件\n', 'seek(0)\n', 'seek(0, 2)\n'] f.writelines(li) f.close( )
程序: • 程序: • 输入及程序运行结果: x1,y1=1, 2 x2,y2=5, 3.4 d= 4.237924020083418 6.2.3 文本文件的写入 #Exp1_1.py import math x1, y1=eval(input('x1, y1=')) x2, y2=eval(input('x2, y2=')) d=math.sqrt((x2-x1)**2+(y2-y1)**2) print('d=', d) #Exp1_1.py import math x1, y1=eval(input('x1, y1=')) x2, y2=eval(input('x2, y2=')) d=math.sqrt((x2-x1)**2+(y2-y1)**2) print('d=', d) 【例6-3】 在文件F6_2.txt末尾追加两行内容。 分析:要在1个已存在的文件末尾追加新内容,打开文件时需要'a+'模式,或'r+' 模式。 程序: #Exp6_3.py f=open('F6_2.txt', 'a+') s= '文本文件的读取方法\n文本文件的写入方法\n' f.write(s) f.close( ) 思考题:用'r+'模式时,需不需要把文件指针移到文件末尾?如果不移动将产生什么结果?
程序: • 程序: • 输入及程序运行结果: x1,y1=1, 2 x2,y2=5, 3.4 d= 4.237924020083418 6.2.4 文本文件的读取 #Exp1_1.py import math x1, y1=eval(input('x1, y1=')) x2, y2=eval(input('x2, y2=')) d=math.sqrt((x2-x1)**2+(y2-y1)**2) print('d=', d) #Exp1_1.py import math x1, y1=eval(input('x1, y1=')) x2, y2=eval(input('x2, y2=')) d=math.sqrt((x2-x1)**2+(y2-y1)**2) print('d=', d) 有三个方法可以进行文本文件的读取,read( )、readline( )和readlines( ),下面示范read( )方法的使用。 【例6-4】 读取文件F6_1.txt的前4个字符,并显示。 程序: #Exp6_4.py f=open( 'F6_1.txt', 'r', encoding='UTF-8') s=f.read(4) #读取文件的前4个字符 f.close( ) print('s=',s) print('字符串s的长度(字符个数)=', len(s)) 程序运行结果: s= a1@中 字符串s的长度(字符个数)= 4 思考题:文件的字符数与字节数否则相同?
程序: • 程序: • 输入及程序运行结果: x1,y1=1, 2 x2,y2=5, 3.4 d= 4.237924020083418 6.2.5 文件指针的移动 #Exp1_1.py import math x1, y1=eval(input('x1, y1=')) x2, y2=eval(input('x2, y2=')) d=math.sqrt((x2-x1)**2+(y2-y1)**2) print('d=', d) #Exp1_1.py import math x1, y1=eval(input('x1, y1=')) x2, y2=eval(input('x2, y2=')) d=math.sqrt((x2-x1)**2+(y2-y1)**2) print('d=', d) 为了能做到在文件的任何位置读写内容,需要用seek( )方法移动文件指针。 (1)seek(n) ,其中n>=0,seek(0)表示文件指针移到文件头;n>0时,表示移动到文件头之后的位置。从任意位置读取内容时或从任意位置覆盖内容时需要这样做。 (2)seek(0, 2)表示把文件指针移到文件尾。在追加新内容时需要这样做。 注意:不论是二进制文件还是文本文件,指针的相对位置的计算都是以字节为单位。
程序: • 程序: • 输入及程序运行结果: x1,y1=1, 2 x2,y2=5, 3.4 d= 4.237924020083418 6.2.5 文件指针的移动 #Exp1_1.py import math x1, y1=eval(input('x1, y1=')) x2, y2=eval(input('x2, y2=')) d=math.sqrt((x2-x1)**2+(y2-y1)**2) print('d=', d) #Exp1_1.py import math x1, y1=eval(input('x1, y1=')) x2, y2=eval(input('x2, y2=')) d=math.sqrt((x2-x1)**2+(y2-y1)**2) print('d=', d) 【例6-8】 把文件F6_1.txt中的“国”替换为“央”,再把“1”替换为“9”,最后在文件末尾增加“人民政府”。 分析:F6_1.txt的内容: a1@中国 • 程序: #Exp6_8.py f=open('F6_1.txt', 'r+', encoding='UTF-8') f.seek(6) #文件指针移到'国'的首字节上 f.write('央') #用'央'覆盖'国' f.seek(1) #文件指针移到'1'的上 f.write('9') #用'9'覆盖'1' f.seek(0, 2) #文件批针移到文件尾 f.write('人民政府') #增加新内容 f.close( )
练习:试验、理解本次课的所有例子 第11次上机作业: 6.1 6.2 补充1:建立一个文本文件,由键盘输入3行内容,关闭文件。再次打开文件,从键盘输入一行内容,追加到文件尾。 补充2:建立一个文本文件,由键盘输入4行内容,关闭文件。再次打开文件,从键盘输入一行内容,插入到第2行之后。