资源简介 (共47张PPT)Python少儿编程第八章 永久存储的文件目录1.1打开和关闭文件1.2读写文件1.3定位文件1.4高大上的文件系统PART 01打开和关闭文件打开文件1.1Python使用内置函数open()即可按照指定模式打开指定文件,并创建文件对象,其语法格式如下。open(filename[, mode])其中,filename表示文件名称;mode表示文件的读写模式,缺省时为只读模式。该函数返回一个文件对象。例如,以只读模式打开一个名为“1.txt”的文件,可以用下面代码实现。file = open('1.txt')其中,file为打开的文件对象,通过它可以对文件进行读写操作。如果想要写入文件,就需要在打开文件时指明文件的打开模式。Python中文件的打开模式有多种,具体表示方式如表8-1所示。打开文件1.1表8-1 文件打开模式打开文件1.1(1)以只读模式“r”打开文件时,该文件必须已经存在,否则抛出异常,且只能进行读取操作,打开时文件位置指针在文件的开头。(2)以只写模式“w”打开文件时,如文件不存在,则以指定的文件名新建文件。若打开的文件已经存在,则新数据覆盖原文件中的已有数据,且只能进行写操作。(3)以追加模式“a”打开文件时,如果文件已存在,打开时文件位置指针在文件的末尾,也就是说,新数据将写入到已有数据之后,如果文件不存在,则新建文件进行写入。(4)“r+”“w+”“a+”模式都是既可读也可写,只是“r+”与“r”一样,文件必须已经存在。(5)打开模式带上“b”表示以二进制文件格式进行操作。关闭文件1.2在Python中,虽然文件会在程序退出后自动关闭,但考虑到数据的安全性,每次使用完文件后,都应使用close()方法关闭文件,其语法格式如下。file.close()其中,file为文件对象。例如,以只写模式打开一个名为“test.txt”的文件,然后关闭文件,可以用下面代码实现。file = open('test.txt', 'w') #以只写方式打开名为“test.txt”的文件file.close() #关闭文件with语句1.3Python中的with语句(上下文管理语句)用于对资源进行访问,保证不管处理过程中是否发生错误或异常,都会调用__exit__()方法,执行规定的清理操作,释放访问的资源。它常用于文件操作、数据库连接、网络通信连接、多线程与多进程同步时的锁对象管理等场合,其语法格式如下。with context_expression [as target(s)]:with_body #执行代码其中,context_expression是一个需要执行的表达式,返回一个对象;target(s)用于保存context_expression返回的对象,可以是一个或多个。例如,读写文件时,with语句的用法如下。with open(filename[, mode]) as file:with_body #通过文件对象读写文件的语句PART 02读写文件写入文件2.1write()方法用于向文件中写入指定字符串,其语法格式如下。file.write(str)其中,file表示文件对象,str表示要写入文件的字符串。【例8-1】 生日备忘录。【问题分析】 首先,以只写模式打开文件(当文件不存在时会创建文件);然后,向文件中写入数据,这里需要注意的是write()方法不会自动在字符串的末尾添加换行符,因此,当输入多行时,需要在write()语句中包含换行符;最后,关闭文件。1. write()方法写入文件2.1【参考代码】#以只写模式打开名为“birthday.txt”的文件file = open('birthday.txt', 'w')#向文件中写入字符串file.write('小蓝 2011.01.01\n')file.write('小舞 2010.08.15\n')file.write('小明 2011.05.01\n')file.write('小红 2010.12.24\n')file.close() #关闭文件1. write()方法写入文件2.1【运行结果】 程序运行后,会在当前工作目录下生成一个名为“birthday.txt”的文件,打开该文件,可以看到数据成功写入到了文件中,如图8-1所示。图8-1 “birthday.txt”文件的内容1. write()方法写入文件2.1writelines()方法用于向文件中写入字符串序列,如一个字符串列表,其语法格式如下。file.writelines(sequence)其中,file表示文件对象,sequence表示写入文件的字符串序列。【例8-2】 向生日备忘录中追加生日信息。【问题分析】 要向文件中追加数据,须使用追加模式“a”打开文件。使用writelines()方法写入数据时,同样不会自动在列表后添加换行符,须手动加入。这里使用with语句进行文件操作。2. writelines()方法写入文件2.12. writelines()方法【参考代码】#定义列表并赋值birthday = ['小果 2010.10.01\n', '小玉 2010.09.09']#以追加模式打开“birthday.txt”的文件with open('birthday.txt', 'a') as file:file.writelines(birthday) #向文件中追加字符串列表写入文件2.12. writelines()方法【运行结果】 程序运行后,会将数据追加到“birthday.txt”文件中,打开该文件,可以看到数据成功追加到了文件中,如图8-2所示。图8-2 追加数据后“birthday.txt”文件的内容读取文件2.2read()方法用于从文件中读取指定的字节数,其语法格式如下。file.read([size])其中,file表示文件对象;size表示从文件中读取的字节数,如果缺省或为负,则读取整个文件内容。该方法以字符串形式返回从文件中读取的内容。1. read()方法读取文件2.2【例8-3】 按字节读取生日备忘录。1. read()方法【参考代码】#以只读模式打开“birthday.txt”文件with open('birthday.txt', 'r') as file:line = file.read(14) #读取前14个字节print(line) #输出前14个字节print('*' * 20) #输出20个*用于分隔content = file.read() #读取文件中剩余的所有内容print(content) #输出文件中剩余的所有内容读取文件2.2【运行结果】 程序运行结果如图8-3所示。1. read()方法图8-3 例8-3程序运行结果【程序说明】 打开文件时,文件位置指针在文件的开头,运行“line = file.read(14)”语句,就会从文件的开头读取14个字节,由于第14个字节是一个换行符,而print()函数也会默认换行,所以输出“小蓝 2011.01.01”和一个空行。当执行“content = file.read()”语句时,文件位置指针已经在第14个字节处,因此,读取了文件中剩余的所有内容(不包括前14个字节)。读取文件2.2readline()方法用于从文件中读取一行,包括换行符,其语法格式如下。file.readline([size])其中,file表示文件对象,size表示从文件中读取的字节数,如果缺省,则读取整行。2. readline()方法读取文件2.22. readline()方法【例8-4】 按行读取生日备忘录。【参考代码】#以只读模式打开“birthday.txt”文件with open('birthday.txt', 'r') as file:while True:line = file.readline() #读取一行if line: #如果读取的内容不为空print(line, end='') #输出一行else: #如果读取的内容为空break #退出循环读取文件2.22. readline()方法【运行结果】 程序运行结果如图8-4所示。图8-4 例8-4程序运行结果【程序说明】 上述代码中,循环按行读取文件中的内容,如果读取的内容为空,则说明文件位置指针已经在文件的末尾了,此时退出循环。读取文件2.2readlines()方法用于读取所有行(直到结束符EOF)并返回列表,列表中每个元素为文件中的一行数据,其语法格式如下。file.readlines()3. readlines()方法读取文件2.23. readlines()方法【例8-5】 一次性读取生日备忘录。【参考代码】#以只读模式打开“birthday.txt”文件with open('birthday.txt', 'r') as file:content = file.readlines() #读取所有行并返回列表print(content) #输出列表for line in content: #遍历列表print(line, end='') #输出列表中的每个元素读取文件2.23. readlines()方法【运行结果】 程序运行结果如图8-5所示。图8-5 例8-5程序运行结果读取文件2.23. readlines()方法当读取的文件非常大时,一次性将内容读取到列表中会占用很大内存,影响程序执行速度。因此,可以将文件本身作为一个行序列进行读取,遍历文件的所有行可直接用下面代码实现。#以只读模式打开“birthday.txt”文件with open('birthday.txt', 'r') as file:for line in file: #遍历文件的所有行print(line, end='') #输出每行读取文件2.23. readlines()方法【例8-6】 统计2021年《政府工作报告》全文中出现次数前15的词语。【问题分析】 词语出现次数统计涉及对词汇的统计(即词频统计),从思路上看,词频统计只是累加问题,即对文档中每个词语设计一个计数器,每出现一次,相关计数器加1。可以采用字典来解决词频统计问题,以“词语”为键,“计数器”为值。中文字符之间没有天然的分隔符,在进行词频统计之前,需要对中文文本进行分词,此时,可使用jieba库解决这个问题。【参考代码】import jieba #导入jieba库#以只读模式打开文件并读取文件内容with open('2021年《政府工作报告》全文.txt', 'r') as file:content = file.read()读取文件2.23. readlines()方法【参考代码】(续)words = jieba.lcut(content) #进行分词,将结果放入words列表中counts = {} #定义字典用于存储词语和计数器for word in words: #遍历wordsif len(word) == 1: #排除单个字符的分词结果continueelse:counts[word] = counts.get(word, 0) + 1 #计数器累加items = list(counts.items()) #将字典元素转换为列表items.sort(key=lambda x:x[1], reverse=True) #根据计数降序排序for i in range(15): #输出前15项word, count = items[i]print('{0:<10}{1:>5}'.format(word, count))读取文件2.23. readlines()方法【运行结果】 程序运行结果如图8-8所示。图8-8 例8-6程序运行结果PART 03定位文件获取当前读写位置3.1在读写文件的过程中,如果想知道当前文件位置指针的位置,可通过tell()方法来获取,其语法格式如下。file.tell()该方法返回文件的当前位置,即文件位置指针当前位置,它是从文件头开始的字节数。定位到指定位置3.2如果在读写文件的过程中,需要从指定位置开始读写操作,就可以使用seek()方法移动文件位置指针到指定位置,其语法格式如下。file.seek(offset[, from])其中,file表示文件对象;offset表示偏移量,即偏移的字节数;from表示起始点,即偏移的参考点。from有3种取值:0代表“文件开始位置”,1代表“当前位置”,2代表“文件末尾位置”。缺省时取0,当取2时,offset为负值,表示文件位置指针从文件末尾向前移动。定位到指定位置3.2【例8-7】 读取文件,统计并输出文件内容。【参考代码】filename = input('请输入文件名:') #输入文件名#以只读模式打开文件,并设置编码方式为UTF-8with open(filename, 'r', encoding='UTF-8') as file:file.seek(0, 2) #指针移到文件末尾pos = file.tell() #获取指针位置并赋给posfile.seek(0, 0) #指针移到文件开头content = file.read(pos) #读取pos个字节的内容#输出字节数和内容print('共{}个字节,内容如下。\n{}'.format(pos, content))【问题分析】 首先,打开指定的文件,文件名由键盘输入;接着,使用seek()方法定位到文件末尾;然后,使用tell()方法返回文件位置指针当前位置,即文件包含的字节数;最后,使用seek()方法定位到文件开头后,使用read()方法读取文件内容,并输出字节数和文件内容。定位到指定位置3.2【运行结果】 程序运行结果如图8-9所示。图8-9 例8-7程序运行结果PART 04高大上的文件系统os模块4.1Python标准库的os模块除了提供使用操作系统功能和访问文件系统的简便方法外,还提供了大量文件操作的方法,常用的方法如表8-2所示。表8-2 os模块的常用方法os模块4.1表8-2 os模块的常用方法(续)os模块4.1【例8-8】 创建文件夹,批量处理文件。【问题分析】 首先,使用mkdir()方法在当前工作目录下创建“语文”文件夹,并使用chdir()方法将工作目录切换到“语文”文件夹中;接着,在该目录下使用for循环以只写模式打开文件方式批量生成文件;然后,删除其中一个文件后,生成一个同名文件夹;最后,使用listdir()方法返回“语文”文件夹下的文件列表,并使用for循环遍历文件列表,使用rename()方法重命名每个文件。其中,每次操作“语文”文件夹时,可通过输出该文件夹下文件列表查看是否操作成功。os模块4.1【参考代码】import os #导入os模块os.mkdir('语文') #创建“语文”文件夹os.chdir('语文') #将当前目录切换到“语文”文件夹中#创建文件名列表data_list = ['语法', '诗词', '古文', '写作', '外国文学']for data in data_list: #遍历文件名列表filename = data + '.txt' #设置文件为txt文件file = open(filename, 'w') #创建文件file.close() #关闭文件path = os.getcwd() #获取当前目录print(os.listdir(path)) #输出文件列表os模块4.1【参考代码】(续)os.remove(path + '\\外国文学.txt') #删除“外国文学”文件os.mkdir('外国文学') #创建“外国文学”文件夹file_name = os.listdir(path) #获取当前目录下的文件和文件夹列表print(file_name) #输出文件和文件夹列表i = 1for name in file_name: #遍历列表if '.txt' in name: #如果为txt文件new_name = str(i) + name #在原文件名前加上数字进行编号os.rename(name, new_name) #重命名文件i += 1 #i加1print(os.listdir(path)) #输出文件和文件夹列表os模块4.1【运行结果】 运行程序,“语文”文件夹下文件列表的变化如图8-10所示。重命名后的文件视图如图8-11所示。图8-10 “语文”文件夹下文件列表的变化os模块4.1图8-11 重命名后的文件视图os.path模块4.2os.path模块提供了大量用于判断路径、获取文件属性的方法,常用的方法如表8-3所示。表8-2 os模块的常用方法os.path模块4.2例如:#导入os.path模块import os.path#输出绝对路径,结果为“D:\PycharmProjects\第8章\语文”print(os.path.abspath('语文'))#查看文件是否存在,结果为Trueprint(os.path.exists('语文'))#分割目录和文件名,结果为('D:\\PycharmProjects\\第8章', '语文')print(os.path.split('D:\\PycharmProjects\\第8章\\语文'))#分割文件名和扩展名,结果为('例8-8', '.py')print(os.path.splitext('例8-8.py'))#查看文件大小,结果为1107print(os.path.getsize('例8-8.py'))shutil模块4.3shutil模块也提供了大量支持文件和文件夹操作的方法,常用的方法如表8-4所示。表8-4 shutil模块的常用方法shutil模块4.3【例8-9】 备份生日备忘录。【问题分析】 使用copy()方法将生日备忘录“birthday.txt”中的内容复制到另一个文件“birthday_copy.txt”中。【参考代码】import shutil #导入shutil模块#复制文件内容及权限shutil.copy('birthday.txt', 'birthday_copy.txt')shutil模块4.3【运行结果】 程序运行后,“birthday_copy.txt”文件的内容如图8-12所示。图8-12 “birthday_copy.txt”文件的内容感谢观看 展开更多...... 收起↑ 资源预览