当前课程知识点:Python 交互式程序设计导论 > 第7周 > A 课程视频(类进阶及文件操作) > 文件操作
返回《Python 交互式程序设计导论》慕课在线视频课程列表
我们本周的项目三字经游戏,三字经的内容是保存在一个文本文件中
为了完成游戏,必须将这个文本文件中的内容读取到你的程序中,才能进行其它的一些操作
那我们今天课程的主要内容就是给大家讲解下,有关文本操作相关的方法
下面开始今天的课程,我的程序文件中有两个函数一个是读文件
就是把文件中的内容读出来,一个是写文件,就是往文件里写入内容
当然这两个函数当前都没有实现,没有函数体
那我们现在先来完成下读文件
在读文件之前我们一定要知道读的是哪一个文件
所以一定要有个文件名,文件名,比如说我定义一个变量filename
当前我们我这块读一个dizigui.txt,这个地方的文件名给大家讲一下一定要包括三部分的内容
一个是文件路径,就是你的这个文件是在你电脑上的哪一个部分
或者是说在网络中的哪一个部分,文件路径加文件名在加文件后缀
文件名就是我这块的dizigui了,文件后缀就是文件格式txt
有了文件名之后,我们现在就要打开这个文件才能进行对它读的操作
打开的时候我们用open这个函数,大家看open这个函数有几个参数,第一个参当然是我们的文件名
第二个参数是我们对文件操作的一种模式,就是说你要读文件还是写文件,默认是读
二就是r(read),我就写个r(read)的吧,其它的都可以不写
那打开文件之后呢,我把它复制给一个变量infile作为我的文件对象,用它来对文件进行操作
那我现在就要读了,现在呢我们是第一个方式,我先写上infile.read,我们要给它定义一个变量
file_text我把读出来的内容保存在file_text里面,那我打印一下看它能不能读出文件
打印一下,对文件读操作完了之后就说你一个文件你读完了,
你把它打开了,你一定要记得把它关闭,这个地方大家一定要注意
关闭的时候呢是通过文件对象点(.)打开用open,关闭我们用close
现在我们把文件关闭了,这个函数是完整的,我运行一下
运行之后,大家看有一个错误,错误内容fileNotFoundError四个单词组成的是吧
文件没有找到的错误,后面继续在看,没有这样一个文件或者路径叫做dizigui.txt
我们来检查一下,我说我的文件名必须包括三部分:文件路径,文件名,文件后缀
大家看我这个里面没有文件路径对吧,当我没有写明全路径的时候,它是相对路径
给大家说这是相对路径,它表示我当前的这个文件和我的这个程序文件是在同一个目录下面
那我们来检查一下看在不在,这个里面我们找一下,这个文件在,然后呢有没有一个txt文件
叫dizigui.txt
没有,说明这个文件不存在,很正常,它又给我报错了,PyCharm它理解的一点都没有问题
那我现在呢,我给它拷一份放在这儿,我在桌面上有这个文件,这有一个拷贝一下
我放到我的这个里面去,粘贴,现在有了,现在有了之后呢我在回来运行程序
读出来了,看,内容已经读出来了,我们比较一下看它读的对不对
我们在这个地方就可以把它打开,打开,看它读的是对的是吧
第一行,第二行,内容都没有问题,那这是第一种读文件的方式
这个呢要提醒大家注意,一定要保证你的文件是存在的,若果不存在它会提示文件不存在它的错误
第一种读文件的方式呢,它是一次性将文件内容全部读出,这是第一种
那我们现在看第二种,我先把第一种给它注释掉
第二种,第二种怎么读呢,同样我也把读出的内容放在file_tex里面,
然后同样也是用infile这个对象来读,然后读的时候不在用read,我用readline()这个函数
用这个函数来读大家看一下,首先两个单词,一个是read一个是line就是读行
那按照我们的理解,它应该是读一行,我把它复制下来
复制下来,我打印一下看它的,如果它读一行,它是读出的哪一行呢,我运行一下
第一行,看是不是第一行,字模糊是吧,第一行,好,看来呢,它是一次性只读一行的内容
只读一行,而且它是从第一行开始读的是吧,那既然这样,我在读一遍,我复制了
我读一行,一定要注意缩进,我再运行下看看会怎么样,两行,就是说我用了一次这个函数的时候,它会读一行
在用一次的时候,在读一次它会读第二行的内容,那看它每次读的时候它都会记住上一次读到哪了
然后下一次接着在读,这是我们第二种读文件的方式,就是一次读一行内容,一次读一行内容
同样,我也把它先注释掉,我们在看还有第三种读文件的方式
file_text保存读出来的文件内容,然后等于infile点readlines,现在很明显line是复数了是吧
同样我也要打印一下,我就把它打印一下,我看它这一次读出来的是什么内容,运行
大家看,大家注意,看现在读出来的内容,打印出来之后它是在一对方括号里面,后面有方括号我就不看了
一对方括号里表明它是一个列表,那这块是个逗号说明前面是一个列表的元素,那我们对应一下发现
一行内容它是作为列表的一个元素存在的,那就是说这种读的方式,它是把文件中的内容全部读出来
文件中的内容全部独处保存在一个列表中,而且每一行内容作为列表的一个元素,
这是我们第三种读文件的方式,那就给大家介绍到这
还有我们在回来,我说过这是相对路径,那我不是说也可以用全路径,那我把它写全了
那我们来看一下,就换一个了,当前桌面上的一个文件,右键显示简介,我们看下这个文件是放在哪里的
它的位置,这是我们Mac系统上是这样做的,在我们的Windows上,
大家可以右键属性,然后就可以看到文件的路径
这次我就把它全路径写完,它是我在桌面上放的这样的一个文件,这是全路径
我在读一下看它能不能把文件内容读出来,运行,没问题
同样的它也是把这个文件的内容读出来跟上次的结果是一样的
那这是我们的全路径,前面我已经讲过我们的文件呢还可以放在网络中去
就是说你可以读网络上的文件,那我这块有个文件,给大家演示下
打开我的浏览器,大家看,这儿呢同样也放的是我的dizigui
然后它呢是在这个路径下面,我就把这个路径复制一下,把它粘贴在这
此时我的文件变了,好了粘贴上了,这个我删掉,现在不是相对路径了,它是网络路径
那我在读一下,看它能不能正常打印出这些信息,我来右键运行
报错了,程序报错了,看一下错误信息,大家一看就发现,同样的错误,说这个文件不存在
但是呢,文件存不存在?我已经能够正常的打开这个文件看到文件的内容,说明这个文件是存在的
它却提示我文件不存在,那这个主要是因为,读取网络文件的时候和我们读取本地文件是有区别的
就是说你不能以这种方式来读取网络文件
怎么读呢?来讲一下这个是读本地文件
我先把它注释掉
我们来读网络文件
同样我也有一个文件对象,读的对象infile
然后打开的时候就不能直接用open函数了
应该用urllib.request.urlopen()用这个函数
用这个函数里面的参数放的是文件名
大家看这个地方有一个红色的波浪线,pycharm提示了一个错误
这个错误主要是因为我们没有导入这个库
就是说你要用里面的这个方法,但是你没有导入相应的模块
当然用不了了,我们大家都清楚
好,我来导入一下,导入应该用import,是吧?
urllib.request,好,一旦写入导入文件之后错误就没有了
错误没有了,那我们看这个方式行不行
可不可以读出来呢?我再运行一下
虽然错误已经不再提示了,不再说文件找不到了
但是它读出的文件内容我们认不认识?
不认识,那这里一行内容到底是什么呢?
我们根本就不认识是吧,不是我们想要的这种内容
而且我们看它也是保存在一个列表里面的对吧?保存在一个list里面
那我就这样,保存在一个list里面我就可以用for循环了
这个我就删掉了
既然它不能这么打印
for循环看它是什么格式,for line in
我打印一下看我每一行都是什么类型呢
看每一行都是什么类型,运行
类型是二进制类型
难怪我们不认识
那他既然是二进制类型的话,我们不认识就要进行转码
就是说我要把它转成utf-8,我们能认识的数据类型,对吧?
好,这个我也同样不要了
转码怎么转?line_text等于line.decode方法就是解码的意思,utf-8
好,我这句话的意思是说,我要把这一行的内容
通过decode方法解码成utf-8这种格式,然后保存在line_text里面
这是解码,那我来打印一下,看它能不能变成utf-8
能不能变成我们认识的数据类型
运行,转过来了,说明这个解码是成功的,已经把内容都读出来了
其实这样我们已经把网络内容读的方式给大家介绍完了
第一个要注意的是读的时候打开的时候应该用urlopen,而不是这个
同时要导入相应的模块
其次,把网络文件读出来后一定要进行转码操作
就是解码的操作把它转化成utf-8
好了,我们再观察一下这个文件
它的第一行是拼音,第三行拼音,第五行拼音
说明它的奇数行都是拼音,偶数行都是汉字
那如果我想挑着做,我就想把所有的偶数行,所有的汉字给他取出来,不要拼音
该怎么做呢?该怎么做?
我定义一个行号
因为我要从第一行开始读
如果说是偶数行我就解码打印,如果说是奇数行我是不是就不做操作
那我就用if来判断,如果它是偶数行line_num
怎么判断一个数十偶数呢?
对2取余数,如果余数是0,就是可以被2整除说明它是偶数行
当它是偶数行时我就转码打印
如果它是奇数行我就不进行这样的操作
第一行读完了,第二行要读,所以我这个行号要加1,是吧?
我就这么写了
行号读完了之后每次都加1,你看我读第一行
然后我在加上一个1变成第二行,然后依次读到最后一行为止
行,我现在打印一下看它能不能按照我们想要的把汉字部分全部都读出来
大家看,有没有拼音?没有
说明它已经按照我们的操作把汉字部分全部都取出来了,没有拼音部分
那我还有一个要求,你看这是一行,对不对?
这是一句,三个字是一句,四句诗一行,对吧?它是一行一行存在的
我想把这些所有一句一句的话全部保存在一个列表中,每一句作为列表的一个元素
就是说这些全部都保存到一个列表里面,那我该怎么做呢?
继续,我定义一个列表file_list,定义一个空列表
定义一个空列表之后,这个打印我就先不打印了,删掉
解码了之后它是偶数行,解码了之后呢?我们看一下
这一句我想把它分隔开变成一个小列表,就是变成一个一个的元素
应该怎么做?就这么写了,text等于内容
因为line_text它是一个字符串,字符串里面有一个方法叫split方法
它是对字符串进行分割,就是如果我括号里面什么也没有,就是说没有带参数的时候
它是按空白字符来分割
空白字符包括哪些呢?包括空格
当然也包括多个空格,包括换行,还包括键盘上的tab键,他们表示空白字符
当然你也可以加入参数,比如说你的字符串是逗号来分割的
你想用这个来分割也可以
现在我们就用空白字符来分割就可以了
好,分割完了之后他就会变成一个list
我打印验证一下我说的对不对,type它是一个list,
看看是不是list
list是吧?我说的没错
字符串通过split是按照这种方式把字符串分割成一个列表
分割完了之后,既然它是一个列表那我就这样了for
每一句在列表里面去当时我们说过要怎么样?
要把所有的内容保存到一个列表里面去,那就是file_list.append(sentence)了
好,保存完了是吧?调整一下
这样我就把每一句内容当符合我的要求的时候保存到这个file_list里面
最后,我打印一下file_list,看一下保存的对不对file_list
大家看,我犯了一个错误,什么错误呢?
我打印应该是在我的for循环结束再打印
犯了一个错误,然后我再运行一下
大家看,没问题,方括号然后逗号分隔
第一个元素父母呼,第二个元素应勿缓,没问题
这是我把汉字部分全部读出来了
那如果想把拼音部分读出来,
当然也就是这个地方不等于0,也就是奇数部分了,对吧
对2取余不等于0就是我的拼音部分,验证一下
好,没问题
那这个也就是我给大家介绍了几种读文件的方式
包括读本地文件和读网络文件的区别也给大家讲了
好,读文件这个函数就先介绍到这里,下面我们看写文件
那写文件我们同样也要知道写哪个文件,文件名
然后假设新疆.txt我要写这样一个文件
那我肯定要把文件打开后才可以开始写
有这样一个变量叫outfile打开文件,同时我使用的是open这个函数,大家已经清楚
filename,大家注意,现在我是要写文件不再是读了
所有我第二个参数mode,这个模式一定要变成写w,就是write,w是write的第一个字母
好写文件
打开了之后我就可以往文件里面写内容了,outfile.write
我先用write方法,write是每次往文件里面写一行内容
看我写了“新疆好地方”加!
写完了之后
我们说打开文件一定要关闭,写文件同样也是要用close方法把它给关掉
那我们看我们能不能写这样一个文件
首先我们验证一下,当这个地方我没有写路径的时候说明它是相对路径
那就在这个地方打开一下看,有没有新疆.txt?没有
说明不存在这样的文件,运行一下
我先把这个注释掉,先不让它去调用写文件这个函数,运行
没报错,首先它是没报错,那我们既然写文件我看一下这个文件有没有了
大家发现这都来一个文件新疆.txt
点开,新疆好地方,它已经写到这了
它已经把这个文件写到这了
看来写文件成功了,再写,复制,复制,复制
写三遍是吧,运行,没问题,打开
写了三遍,没有换行,连着写的是吧
每写一句,后面紧更着写的,那如果要换行呢怎么做?
\n,\n表示换行,加上换行,换两行就行了
好,再运行
打开验证,换行成功
这个一次往文件里面写一行内容
你可能觉得这种写法太慢了,是吧,
一次写一行,我可以一次写多行内容
写多行的时候我要把我写的内容先保存到一个列表里面去
text列表,我也写新疆好地方,多行写,逗号
复制吧,大家看我复制了
写三句就好了,然后呢?
这是我要写的文件列表outfile.writelines()一次可以写多行内容
写的是什么呢?text
好,运行,看它能不能写进去
写进去了吧,新疆好地方,而且都是连着的
同样也没有换行,我们知道换行要加入反斜杠n,加一下
运行
成功,是吧,没问题
这是我们写相对路径文件,两种方式,一种是一次写一行,一种是一次写多行
你要把你的文件内容保存到一个列表里面
然后还有一个问题
我们当然也可以写全路径,就是你可以把这个文件放在任何一个地方
然后去写它,但我们不能写网络文件
就是说你不能修改网络文件的内容,当然是出于网络安全的考虑
没有什么可怀疑的
好,关于文件的读写,就给大家介绍到这里,我们下次课再见
-课程简介
--课程简介
-A 课程视频(算数操作符及表达式)
--绪论
-B 课程视频(变量及赋值)
--变量
--项目提交
-C 辅助视频(计算机结构、Python开发环境安装)
-D 辅助视频(如何提交项目)
--项目提交
-第0周--小测验
-本周项目:"我喜欢Python"
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
--项目提交
-A 课程视频(函数)
--函数
--其它操作符
--随机函数
-B 课程视频(逻辑及表达式)
--逻辑值和比较
--条件
--编程技巧
-第1周--小测验
-本周项目:“老虎杠子鸡虫”游戏
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(Python交互式应用)
--事件驱动编程
--按钮
-B 课程视频(输入框、全局变量)
--输入框
--编程技巧
-第2周--小测验A
-第2周--小测验B
-本周项目:猫咪藏在哪个房间
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(画布绘图)
--画布和图形绘制
--字符串处理
--图片和音效
-B 课程视频(计时器)
--计时器
--交互式绘图
--“神奇时钟”游戏
--编程技巧
-第3周--小测验A
-第3周--小测验B
-本周项目:“神奇时钟”
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(列表)
--列表
--键盘输入
--碰撞和反射
-B 课程视频(键盘控制)
--速度控制
--运动
--编程技巧
--“桌上冰球”游戏
-第4周--小测验A
-第4周--小测验B
-本周项目:“桌上冰球”游戏
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(鼠标输入、列表进阶)
--鼠标输入
--Video
--Video
--Video
-B 课程视频(字典和图片)
--Video
--Video
--Video
--Video
-第5周--小测验A
-第5周--小测验B
-本周项目:“世界杯八强连连看”
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(类)
--华容道中的类
-B 课程视频(平铺图片)
--平铺图片
--理解对象
--编程技巧
--“华容道”游戏
-第6周--小测验A
-第6周--小测验B
-本周项目:“华容道”游戏
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(类进阶及文件操作)
--集合
--文件操作
--文字块类
--处理停止的文字块
-B 课程视频(游戏状态控制)
--游戏记分规则
--编程技巧
-第7周--小测验A
-第7周--小测验B
-本周项目:决战三字经
--游戏说明
--程序说明
--编程步骤
--评分标准
--项目模板
-A、课程视屏(精灵集合)
--Video
--精灵类
--战士类
--编程技巧
-B、课程视屏(动画)
--精灵碰撞
--精灵动画
--编程技巧
--保卫家园游戏
-第8周--小测验
-本周项目:守卫家园
--游戏说明
--程序说明
--编程步骤
--评分标准
--项目模板