资源简介 (共40张PPT)第7章 文件Chap7 FilesThere is a road in the mountains of books, and diligence is the path程序中的数据2ora 23 D文件基本概念7.13文件基本概念文件:存储在某种介质上的信息集合存储:外部介质识别:文件名分类存取方式:顺序存取,随机存取文件内容表示方式:二进制文件,文本文件47.1.1 python文件系统5二进制文件与文本文件二进制文件与文本文件文本形式输出时一个字节与一个字符一一对应便于对字符进行逐个处理,也便于输出字符;占存储空间较多;要花费转换时间。用二进制形式输出时可节省外存空间和转换时间一个字节并不对应一个字符,不能直接输出字符形式。可读性差,常用于保存中间结果数据和运行程序。二进制文件与文本文件Python中可以处理二进制文件以及文本文件,对二进制文件的操作可以选择是否使用缓冲区缓冲区是内存中的区域,当程序中需要进行频繁的文件读写操作时,使用缓冲区可以减少I/O操作从而提高效率,也方便管理文本文件均使用缓冲区处理87.1.2 文件的使用过程9文件的使用过程文件读写打开文件open关闭文件closeread/write文件的打开和关闭7.2117.2.1 文件的打开12文件的打开13>>> f1 = open('d:\\infile.txt')>>> f2 = open('d:/outfile.txt', 'w')>>> f3 = open('frecord.csv', 'ab', 0)Sourcefile_obj = open(filename, mode='r', buffering=-1)mode为可选参数,默认值为rbuffering也为可选参数,默认值为-1(0代表不缓冲,1或大于1的值表示缓冲一行或指定缓冲区大小)其他常用参数:encoding(指定编码字符集)open()函数返回一个文件(file)对象open()函数-mode模式 功能Functionr 以读模式打开,文件必须存在w 以写模式打开,若文件不存在则新建文件,否则清空原内容x 以写模式打开,若文件已经存在则失败a 以追加模式打开,若文件存在则向结尾追加内容,否则新建文件r+ 以读写模式打开w+ 以读写模式打开(清空原内容)a+ 以读和追加模式打开rb 以二进制读模式打开wb 以二进制写模式打开(参见w)ab 以二进制追加模式打开(参见a)rb+ 以二进制读写模式打开(参见r+)wb+ 以二进制读写模式打开(参见w+)ab+ 以二进制读写模式打开(参见a+)14标准文件当程序启动后,以下三种标准文件有效stdin标准输入stdout标准输出123stderr标准错误15>>> newcName = input('Enter the name of new company: ')Enter the name of new company: Chaolihai>>> print(newcName)ChaolihaiSource7.2.2 文件的关闭16关闭文件fp.close()fp为文件对象切断文件对象与外存储器中文件之间的联系17>>> fp = open(r'd:\nfile.txt', 'r')>>> type(fp)>>> fp.name'd:\\nfile.txt'>>> fp.mode'r'>>> fp.closedFalse>>> fp.close()>>> fp.closedTrueSource关闭文件文件使用完后如果不关闭,则当程序运行结束时由系统自动关闭不建议使用系统自动关闭的原因操作系统允许程序同时打开的文件个数是有限的写入内容已处理完若缓冲区还未满,缓冲区的内容要等到程序运行结束时由系统自动关闭该文件后才能写出,此时若系统发生非正常情况当前缓冲区中的未写到外存储上的内容就可能丢失掉18文件的基本操作7.319文件的基本操作返回值和基本操作open()函数返回一个文件(file)对象文件对象可迭代有许多读写相关的方法/函数f.read(), f.write(), f.readline(), f.readlines(), f.writelines()f.seek()207.3.1 文件的读写21读文件-read()方法s = fp.read(size)从文件当前位置读取size字节数据,若size为负数或空,则读取到文件结束返回一个字符串(文本文件)或字节流(二进制文件)22>>> fp = open(r'd:\firstpro.txt')>>> s = fp.read(5)#读取5字节>>> print(s)Hello>>> s = fp.read()#将文件中余下的数据读出>>> s', World!\nHello, Python!'>>> fp.close()Source在π(前10000位)中寻找自己的生日23# Filename: find_birth.pyfp = open('pi.txt')pi = fp.read()if '1111' in pi:print('66666')else:print('55555')File在网络上搜索π的前10000位数据放到文件中读文件-readline()方法24s = fp.readline(size=-1)从文件当前位置读取本行内size字节数据,若size为默认值或大小超过当前位置到行尾字符长度,则读取到本行结束(包含换行符)返回读取到的字符串内容>>> fp = open(r'd:\firstpro.txt')>>> s = fp.readline(20)>>> s'Hello, World!\n'>>> s = fp.readline(2)>>> s'He'>>> s = fp.readline()>>> s'llo, Python!'>>> fp.close()Sourcefirstpro.txt :Hello, World!Hello, Python!读文件-readlines()方法25lines = fp.readlines(hint=-1)从文件当前读写位置开始读取需要的字节数,至少为一行;若hint为默认值或负数,则读取从当前位置到文件末尾的所有行(包含换行符)返回从文件中读出的行组成的列表>>> fp = open(r'd:\companies.txt')>>> lines = fp.readlines(2)>>> lines['NIKE Inc.\n']>>> lines = fp.readlines()>>> lines['Microsoft Corporation\n', 'Apple Inc.\n', ' Visa Inc.']>>> fp.close()Source写文件-write()方法fp.write(s)向文件中写入数据(字符串或字节流)返回写入的字符数或字节数26>>> fp = open(r'd:\firstpro.txt', 'w')>>> fp.write("Hello, World!\n")14>>> fp.write("Hello, Python!")14>>> fp.close()Source>>> f = open(r'd:\firstpro.dat', 'wb')>>> x = bytes([3, 4, 5])>>> f.write(x)>>> f.close()Source写文件-writelines()方法fp.writelines(lines)向文件中写入列表数据,多用于文本文件27>>> fp = open(r'd:\companies1.txt', 'w')>>> lines = ['NIKE Inc.\n', 'Microsoft Corporation\n', 'Apple Inc.\n', 'Visa Inc.\n']>>> fp.writelines(lines)>>> fp.close()Source文件读写例子7.1# Filename: prog7-1.pyf1= open('d:\companies.txt')lines = f1.readlines()f1.close()for i in range(len(lines)):lines[i] = str(i+1) + ' ' + lines[i]f2 = open('d:\scompanies.txt', 'w')f2.writelines(lines)f2.close()FileOutput:1 GOOGLE Inc.2 Microsoft Corporation3 Apple Inc.4 Facebook, Inc.将文件companies.txt 的字符串前加上序号1、2、3、…后写到另一个文件scompanies.txt中。?287.3.2 文件的定位29文件的定位-seek()方法fp.seek(offset , whence=0)fp打开的文件必须允许随机访问在文件中移动文件指针,从whence(0表示文件头部,1表示当前位置,2表示文件尾部)偏移offset个字节whence参数可选,默认值为0返回当前的读写位置30文件的定位-seek()方法31>>> sb'word!'>>> fp.seek(3, 0)3>>> fp.read(3)b'lo,'>>> fp.seek(2, 1)8>>> fp.read(3)b'rd!'Source>>> fp = open('testseek.dat', 'wb+')>>> fp.write(b'Hello,word!')11>>> fp.seek(0)0>>> s = fp.read(5)>>> sb'Hello'>>> fp.seek(-5, 2)6>>> s = fp.read()Source文件读写例子改写# Filename: prog7-2.pyf= open('companies.txt', 'r+')lines = f.readlines()for i in range(len(lines)):lines[i] = str(i+1) + ' ' + lines[i]f.seek(0)f.writelines(lines)f.close()FileOutput:1 GOOGLE Inc.2 Microsoft Corporation3 Apple Inc.4 Facebook, Inc.将文件companies.txt 的字符串前加上序号1、2、3、…。?32文件的定位-tell()方法fp.tell()返回文件的当前读写位置33>>> fp = open('testseek.dat', 'rb+')>>> fp.tell()0>>> fp.read(5)b'Hello'>>> fp.tell()5>>> fp.close()Source7.3.3 文件的其他操作34文件的其他方法及属性35方法 功能f.flush() 将写缓冲区的数据写入文件f.truncate(size=None) 将文件截取为给定大小的字节(如果未指定大小,则为当前文件读写位置)。当前文件读写位置没有改变f.closed 文件关闭属性,当文件关闭时为True,否则为Falsef.fileno() 返回文件描述符(整数)f.readable() 判断文件是否可读,是返回True,否返回Falsef.writable() 判断文件是否可写,是返回True,否返回Falsef.seekable() 判断文件是否支持随机访问,是返回True,否返回Falsef.isatty() 判断文件是否交互(如连接到一个终端设备),是返回True,否返回False文件异常处理36with open('companies.txt', 'r+') as f:lines = f.readlines()for i in range(len(lines)):lines[i] = str(i+1) + ' ' + lines[i]f.seek(0)f.writelines(lines)Source文件综合例读取成绩文件score.txt,分别计算语文、数学、英语的最高分、最低分、平均分并输出到显示终端上,同时在score.txt添加一列计算出每位同学的总成绩。?37姓名,语文,数学,英语陈纯,88,87,85方小磊,93,88,90王妤,82,99,96彭子晖,97,94,84丁海斌,97,94,76姓名,语文,数学,英语,总分陈纯,88,87,85,260方小磊,93,88,90,271王妤,82,99,96,277彭子晖,97,94,84,275丁海斌,97,94,76,267文件综合例38# Filename: prog7-3.pydef f(listdata, n, flag = 'max'):m = listdata[0][n]if flag == 'max':for item in listdata:if item[n] > m:m = item[n]elif flag == 'min':for item in listdata:if item[n] < m:m = item[n]elif flag == 'ave':m = 0for item in listdata:m += item[n]m /= len(listdata)return mFiledef stas(x, field):print(' {:5s}{:5s}{:5s}'.format(field[1],field[2],field[3]))print('最高分:{:5d}{:5d}{:5d}'.format(f(x, 1), f(x, 2), f(x, 3)))print('最低分:{:5d}{:5d}{:5d}'.format(f(x, 1, 'min'), f(x, 2, 'min'), f(x, 3, 'min')))print('平均分:{:5.1f}{:5.1f}{:5.1f}'.format(f(x, 1, 'ave'), f(x, 2,'ave'),f(x, 3, 'ave')))File文件综合例39if __name__ == "__main__":with open("score.txt", 'r+') as fp:lines = fp.readlines()field = lines.pop(0).split(',')x = []for eachline in lines:t = eachline.split(',')for j in range(1, len(t)):t[j] = int(t[j])x.append(t)stas(x, field)for i in range(len(x)):lines[i] = lines[i].strip() + ',' + str(x[i][1] + x[i][2] + x[i][3]) + '\n'field[-1] = field[-1].strip()field.append('总分\n')lines.insert(0, ','.join(field))print(lines)fp.seek(0)fp.writelines(lines)File小结文件的打开文件打开模式与文件类型文件的关闭文件的读写文件定位40 展开更多...... 收起↑ 资源预览