(本科)第7章 文件ppt课件.pptx
课程主讲人:(本科)第7章 文件ppt课件Chap7 FilesDepartment of Computer Science and TechnologyDepartment of University Basic Computer TeachingNanjing UniversityNanjing University程序中的数据3ora 23 DNanjing University文件基本概念4Nanjing University文件基本概念 文件:存储在某种介质上的信息集合 存储:外部存储介质(硬盘) 识别:文件名 分类 存取方式:顺序存取,随机存取 文件内容表示方式:二进制文件,文本文件5Nanjing University7.1.1 Python文件系统6Nanjing University二进制文件与文本文件Nanjing University二进制文件与文本文件 文本形式输出时 一个字节与一个字符一一对应 便于对字符进行逐个处理,也便于输出字符; 占存储空间较多; 要花费转换时间。 用二进制形式输出时 可节省外存空间和转换时间 一个字节并不对应一个字符,不能直接输出字符形式。 可读性差,常用于保存中间结果数据和运行程序。Nanjing University二进制文件与文本文件Python中可以处理二进制文件以及文本文件对二进制文件的操作可以选择是否使用缓冲区文本文件均使用缓冲区处理缓冲区是内存中的区域,由于内存与内存之间的数据交换比内存与外存储器之间的数据交换速度快,因此当程序中需要进行频繁的文件读写操作时,使用缓冲区可以减少I/O操作从而提高效率,也方便管理9Nanjing University7.1.2 文件的使用过程10Nanjing University文件的使用过程文件读写文件读写打开文件打开文件open关闭文件关闭文件closeread/writeNanjing University文件的打开和关闭12Nanjing University7.2.1 文件的打开13Nanjing University文件的打开 文件名的路径: DOS和Windows下,路径分隔符用“”或用“r”指明为原始字符串,如“d:f.txt”或“rd:f.txt” Linux和Mac系统中,路径用“/”分隔,如“/User/DZ/data” “/”也可以在Windows中作为路径分隔符用14fp = open(file, mode=r, buffering=-1)Nanjing University文件的打开15 root_dir = rd:pyprogs fp = open(root_dir + ra.txt)Source f1 = open(a.txt) f2 = open(pics/tfile.txt) f3 = open(./a.txt)Source绝对路径相对路径fp = open(file, mode=r, buffering=-1)Nanjing Universityopen()函数-mode参数ModeFunctionr 以读模式打开,文件必须存在w 以写模式打开,若文件不存在则新建文件,否则清空原内容x 以写模式打开,若文件已经存在则失败a 以追加模式打开,若文件存在则向结尾追加内容,否则新建文件b 以二进制模式打开,可添加到其他模式中使用t 以文本模式打开(默认),可添加到其他模式中使用+ 以读/写模式打开,可添加到其他模式中使用16Nanjing University文件的打开 mode为可选参数,默认值为“r” buffering也为可选参数,默认值为-1,用于设置缓冲策略的可选整数 其他常用参数:encoding(指定编码字符集)17fp = open(file, mode=r, buffering=-1)Nanjing University文件的打开 open()函数返回一个文件(file)对象 默认状态是以r与t模式打开18 fp = open(a.txt) fp = open(record.data , wb)SourceNanjing University文件打开模式19ModeFunctionr+ 以读写模式打开,必须打开已经存在的文件,读写从头部开始w+ 以读写模式打开,新建或是清空原内容,读的内容为新写入内容a+ 以读和追加模式打开,若打开已经存在的文件,读写从尾部开始wb 以二进制写模式打开(参见w)rb+ 以二进制读写模式打开(参见r+),可写成rb+、r+b、+rbwb+ 以二进制读写模式打开(参见w+)Nanjing University标准文件 当程序启动后,以下三种标准文件有效20标准文件文件对象对应的设备标准输入stdin键盘标准输出stdout显示器标准错误stderr显示器Nanjing University7.2.2 文件的关闭21Nanjing University关闭文件 fp为文件对象 关闭文件是打开文件的逆操作,切断文件对象与外存储器中文件之间的联系22 fp = open(rd:nfile.txt, r) type(fp) fp.named:nfile.txt fp.moder fp.closedFalse fp.close() fp.closedTrueSourcefp.close()Nanjing University关闭文件 文件使用完后如果不关闭,则当程序运行结束时由系统自动关闭 不建议使用系统自动关闭的原因 操作系统允许程序同时打开的文件个数是有限的 写入内容已处理完若缓冲区还未满,缓冲区的内容要等到程序运行结束时由系统自动关闭该文件后才能写出,此时若系统发生非正常情况当前缓冲区中的未写到外存储上的内容就可能丢失掉23Nanjing University文件的基本操作24Nanjing University文件的基本操作 根据打开文件模式对文件进行 读/写 操作 常见文件操作函数 read(), readline(), readlines(), write(), writelines() seek()25Nanjing University7.3.1 文件的读写26Nanjing University文件的读写 open()函数返回一个文件(file)对象 文件对象可迭代,是一个迭代器27for line in fp: 对line进行处理Nanjing University读文件-read()方法 fp为读模式打开的文件对象,文本文件或二进制文件均可 size为从文件当前位置读取的字节数,若size为负数或空,则读取到文件结束 返回一个字符串(文本文件)或字节流(二进制文件)28s = fp.read(size)Nanjing University读文件-read()方法29 fp = open(firstpro.txt) s = fp.read(5) print(s)Hello s = fp.read() s, World!nHello, Python! fp.close()SourceNanjing University读文件-readline()方法30 size为从文件当前位置读取本行内的字节数,若size为默认值或大小超过当前位置到行尾字符长度,则读取到本行结束(包含换行符) 返回读取到的字符串内容 fp = open(firstpro.txt) s = fp.readline(20) sHello, World!n s = fp.readline(2) sHe s = fp.readline() sllo, Python! fp.close()Sourcefirstpro.txt :Hello, World!Hello, Python!s = fp.readline(size=-1)Nanjing University读文件-readlines()方法31 hint为从文件当前读写位置开始读取需要的字节数,至少为一行;若hint为默认值或负数,则读取从当前位置到文件末尾的所有行(包含换行符) 返回从文件中读出的行组成的列表 fp = open(companies.txt) lines = fp.readlines(2) linesNIKE Inc.n lines = fp.readlines() linesMicrosoft Corporationn, Apple Inc.n, Visa Inc. fp.close()Sourcelines = fp.readlines(hint=-1)Nanjing University写文件-write()方法 向文件中写入数据(字符串或字节流) 返回写入的字符数或字节数32 fp = open(firstpro.txt, w) fp.write(Hello, World!n)14 fp.write(Hello, Python!)14 fp.close()Sourcefp.write(s)Nanjing University写文件-write()方法 向文件中写入数据(字符串或字节流) 返回写入的字符数或字节数33 f = open(firstpro.dat, wb) x = bytes(3, 4, 5) f.write(x) f.close()Sourcefp.write(s)Nanjing University写文件-writelines()方法 向文件中写入列表数据,多用于文本文件34 fp = open(companies1.txt, w) lines = NIKE Inc.n, Microsoft Corporationn, Apple Inc.n, Visa Inc.n fp.writelines(lines) fp.close()Sourcefp.writelines(lines)Nanjing University例7.1 文件读写例子# prog7-1.pyf1= open(companies.txt)lines = f1.readlines()f1.close()for i in range(len(lines): linesi = str(i+1) + + linesif2 = open(scompanies.txt, w)f2.writelines(lines)f2.close()FileOutput:1 NIKE Inc.2 Microsoft Corporation3 Apple Inc.4 VISA Inc.将文件companies.txt 的字符串前加上序号1、2、3、后写到另一个文件scompanies.txt中。35Nanjing University7.3.2 文件的定位36Nanjing University文件的定位-seek()方法 fp打开的文件必须允许随机访问 在文件中移动文件指针,从whence(0表示文件头部,1表示当前位置,2表示文件尾部)偏移offset个字节 whence参数可选,默认值为0 返回当前的读写位置37fp.seek(offset , whence=0)Nanjing University文件的定位-seek()方法38 sbword! fp.seek(3, 0)3 fp.read(3)blo, fp.seek(2, 1)8 fp.read(3)brd! fp.close()Source fp = open(testseek.dat, wb+) fp.write(bHello,word!)11 fp.seek(0)0 s = fp.read(5) sbHello fp.seek(-5, 2)6 s = fp.read()SourceNanjing University例7.2 文件读写例子改写# prog7-2.pyf= open(companies.txt, r+)lines = f.readlines()for i in range(0, len(lines): linesi = str(i+1) + + linesif.seek(0)f.writelines(lines)f.close()File将文件companies.txt 的字符串前加上序号1、2、3、。39Output:1 NIKE Inc.2 Microsoft Corporation3 Apple Inc.4 VISA Inc.Nanjing University文件中头部插入一个新行f= open(companies.txt, r+)lines = f.readlines()f.seek(0)f.write(Informationn)f.close()File40覆盖模式Nanjing University文件中头部插入一个新行41f= open(companies.txt, r+)lines = f.readlines()for i in range(0, len(lines): linesi = str(i+1) + + linesilines.insert(0, Informationn)f.seek(0)f.writelines(lines)f.close()FileNanjing University文件的定位-tell()方法 返回文件的当前读写位置42 fp = open(testseek.dat, rb+) fp.tell()0 fp.read(5)bHello fp.tell()5 fp.close()Sourcefp.tell()Nanjing University7.3.3 文件的其他操作43Nanjing University文件的其他方法及属性44方法方法功能功能f.flush()将写缓冲区的数据写入文件f.truncate(size=None)将文件截取为给定大小的字节(如果未指定大小,则为当前文件读写位置)。当前文件读写位置没有改变f.closed文件关闭属性,当文件关闭时为True,否则为Falsef.fileno()返回文件描述符(整数)f.readable()判断文件是否可读,是返回True,否返回Falsef.writable()判断文件是否可写,是返回True,否返回Falsef.seekable()判断文件是否支持随机访问,是返回True,否返回Falsef.isatty()判断文件是否交互(如连接到一个终端设备),是返回True,否返回FalseNanjing UniversityWith语句文件异常处理45with open(companies.txt, r+) as f: lines = f.readlines() for i in range(len(lines): linesi = str(i+1) + + linesi f.seek(0) f.writelines(lines)SourceNanjing University例7.3 文件综合例请用随机函数产生500行1-100之间的随机整数存入文件random.txt中,编程寻找这些整数的众数并输出,众数即为一组数中出现最多的数。46利用列表将对应数字出现的次数记录下来,假设数字45出现了5次,则列表lst45的值即为5,结果也有可能不止一个。本例也可以使用字典解决。Nanjing University文件综合例47# prog7_3.pyimport randomwith open(random.txt, w+) as fp: for i in range(500): fp.write(str(random.randint(1, 100) fp.write(n) fp.seek(0) nums = fp.readlines()nums = num.strip() for num in numssetNums = set(nums)lst = 0 * 101for num in setNums: c = nums.count(num) lstint(num) = cfor i in range(len(lst): if lsti = max(lst): print(i)FileNanjing University小结 文件的打开 文件打开模式与文件类型 文件的关闭 文件的读写 文件定位48