Python_文件操作

1. 文件操作套路以及Python中的对应函数和方法

Python中针对文件的基本操作.

首先介绍一下在计算机中操作文件的一个固定套路,在计算机中啊,无论是否编写程序,只要是操作文件都需要按照这个套路中三个步骤来进行.

第1步打开文件,第2步读写文件内容,第3步关闭文件,其中读,就是把文件在磁盘中的数据加载到内存,而且呢,再把内存中的内容再重新写回到磁盘的文件.

现在桌面上有个hello.txt,

有个宠物.jpg,

如果想要操作这个文本文件,第1步应该双击打开,双击之后,

getid这个软件把文本文件打开了,并且把文件的内容加载到内存,如果想要编辑文件应该怎么做呢?只需要按下回车, 再写个hello world就可以,

现在新增加的hello world, 还没有被写入到磁盘上, 因为啊标题栏上有一个小小的*,这个*就提示当前内存中的内容还没有被写回到文件,

按一下CTRL S,标题栏中的*不见了,说明这个文件内容已经被写入到了磁盘.

那现在当把文件操作完成,第3步应该关闭文件,

要想操作文件,第1步打开,然后呢是读写操作完成之后, 关闭掉.

接下来再来看一下图片文件,还是双击打开,

打开之后可以看到一个小狗,一个小猫被加载到内存,

那现在如果想要修改这张图片呢,就可以点击下方的旋转按钮,点击一下,旋转90度, 再点击呢,又旋转90度, 如果现在针对这个文件操作完成,

第三步应该关闭文件,点击叉叉,

之后会提示当前这个图片的修改还没有保存,

因为刚刚使用旋转图片已经修改了图片的内容,内存中的数据发生了变化,所以在关闭的时候会提示是否把变化的数据重新再写回到图片.图片文件又关掉了.

文本文件也好,图片文件也好,要操作都是三个步骤,打开, 读写和关闭.

接下来看一下在python中要想操作文件,需要记住的一个函数和三个方法,

首先来看第1个函数open,open有打开的意思,使用open这个函数啊,

就可以打开一个指定的文件,打开之后, open函数会返回一个文件操作对象,在python 中一切皆对象,当拿到了这个文件操作对象之后,就可以让这个对象啊来调用下面的三个方法,

第1个方法read, read有读的意思,使用这个方法就可以把文件的内容读取到内存中.

而第2个方法write, write有写入的意思,利用这个方法就可以把指定的内容写入到文件中,当针对一个文件操作完成, 文件的操作要么是读,要么是写. 当文件的操作完成,就可以让文件对象来调用一下close方法,把当前正在操作的文件关闭掉, 对文件的操作结束.


 

2. 读取文件内容

使用一个read方法来读取一个文本文件的完整内容,在开始动手之前,先介绍一下open函数以及read方法和close方法的基本使用.

在开发时,如果想要操作某一个文件,第1步应该使用open函数并且传入要操作的文件名,如果指定的文件存在,就会返回一个文件的操作对象,那如果指定的文件不存在呢,如果指定的文件名不存在,就会抛出异常.

不过在使用open函数时,有一点是需要注意,指定的文件名是区分大小写的,因此在课下练习时,一定要注意一下自己指定的文件名,大小写拼写是否正确,这个就是open 函数的作用.

一句话讲, 传入要打开的文件名, 返回文件的操作对象,当拿到了这个对象之后,就可以使用对象来调用read方法,在Python中read方法默认情况下,会一次性的把文件的所有内容读入并且返回,这个就是read方法的作用. 那么当针对某一个文件操作完成,千万不要忘记第3步,第3步啊,就是让文件对象来调用一下close方法,close方法就可以把已经打开的文件做一个关闭.

在开发时, 如果忘记了关闭文件,会造成系统的消耗,并且会影响到后续对这个文件的访问,因此在开发时当针对这个文件进行的操作操作完成,一定要调一下close方法,close方法可以关闭一个已经打开的文件.

这样就是一个函数和两个方法的基本使用,那接下来就做个代码演练,准备了一个README的文本文件,

 就来读取一下这个文件的完整内容,并且把所有内容输出到控制台,目的明确之后, 就来到代码,

123, 3个步骤,那现在就把光标放在第2行,既然打开文件会返回一个文件操作对象,就先定一个变量file,来接收一下open函数返回的结果,open函数的第1个参数就是要打开的文件名,

要重点提示一下,打开文件, 文件名是区分大小写的,所以一定要注意一下文件名的大小写拼写, 现在文件打开了,就把光标直接放在第8行,注意直接用file函数来调用一下关闭文件的方法,

有的同学可能很好奇老师老师为什么刚打开就关闭呀,因为这样可以避免打开文件之后忘记关闭了,打开文件关闭文件,当两个固定的动作做完, 才会把光标放在中间, 在中间来编写针对这个文件的操作代码.打开文件, 关闭文件,两个基本动作准备完成, 就可以来做一下读取文件的操作,现在先定义一个变量text, 来接收一下 file 对象调用read 方法的返回结果,

read 方法,在默认情况下会返回文件的所有内容.

那现在既然用了一个变量,接收了文件的所有内容,就可以使用print函数把text变量做个输出,

针对文件的操作已经完成了,

那现在运行一下,看看效果,

README的完整内容现在都输出在控制台.
 

3.读取文件后, 文件指针会发生变化

一个概念,叫做文件指针, 所谓文件指针,可以把它理解成一个标记,这个标记的作用就可以告诉read 方法,从哪个位置开始读取数据.

画一个示意图,先画一个红色的框框,假设这个框框就是要操作的文件,当使用open方法打开一个文件之后,文件的指针, 也就是标记从哪里读数据的这个标记, 会默认放在文件的开始,

既然在文件的开始,那么在调用read的方法时,

就可以从文件的开始位置读取数据,当执行了read方法之后,read 方法会把文件指针移动到读取内容的末尾.

什么叫读取内容的末尾呢?使用的read 方法,默认会读取文件的所有内容,那么从文件的开始位置读取文件的所有内容,那么当read 方法执行完成之后,文件指针会来到文件的末尾, 那现在执行了一次read方法之后,如果再次调用read方法,就不能能够读到内容了.

因为标记读取数据的文件指针已经被移动到了文件末尾,所以再次调用read 方法应该读不到任何的内容,

首先在第8行使用print 函数做个输出,先来打印一个分割线,

分割线加上之后, 直接运行下程序,现在把README的内容输出在控制台,并且在下方打印了一个分割线,

read 方法执行完成之后, 会移动文件的指针,那就把上一小节完成的读取内容以及打印内容选中, 现在复制一下,

然后呢,把光标放在第10行做一个粘贴,

仅仅是把读取内容粘贴到下方,现在再运行一下程序,看看分割线下方能否打印出来的内容, 这次程序执行, 分割线下方没有任何内容输出, 

这个就是因为read方法执行之后,会把文件的指针, 移动到文件的末尾,移动到末尾之后,再调用read方法, 就读不到任何的内容了.

那现在再把代码做一个改造,使用print 函数来输出一下,读取到内容的长度, text,

那同样的方式,在第1次读取完,同样来输出一下读取内容的长度,

代码改造完成,

再来运行一下程序,第1次读取完成,在控制台输出了,读取到的内容长度是48,第2次调用的方法得到的内容长度是0.

4. 打开文件方式以及写入和追加数据

Python中打开文件的方式,所谓打开文件的方式,就是说在调用open这个函数时, 传递的第2个参数,

回顾一下, 之前在读取文件内容时并没有传递第2个参数, 这个是因为,在调用open函数时,如果不传递第2个参数,那么open函数啊,会默认以只读方式打开这个文件.

只读方式打开, 就可以读取文件的内容,但是如果在开发中希望向文件中写入一些数据,以只读方式打开,不能够向这个文件中写入数据.

首先把对文件的三个操作步骤明确一下,

把光标放在第1行,先来定一个file 的变量来接收一下open函数的返回结果, 传出一个README 的文件名, 文件打开之后,

接下来应该先用文件这个对象来调一下,close 方法,这样呢可以避免中间边写了很多代码之后,忘记把文件进行关闭,

当打开准备完成, 关闭准备就绪,就可以把光标放在第5行, 来针对文件进行写入的操作.

如果想向文件中写入哪些内容, 就可以把要写入的内容当作参数传递给write方法,

那现在运行一下程序, 程序运行出错了,

再直行到第5行时, 告诉不可以写入的,

因为open这个函数默认是以只读方式来打开文件,

只读方式打开, 就不允许向这个文件中写入内容,那怎么样能够向文件中写入内容呢?第2个参数啊,只需要传入一些字母就可以,默认情况下是一个r字母,r对应的就是只读方式打开,

如果向文件中想要写入一些数据,就可以传入一个w字母,w是write 的意思,使用w这种方式,就会以只写的方式打开文件,

但是这种方式打开文件之后,文件原本的内容会被覆盖,同时如果文件不存在,会建立一个新的文件.

给open这个函数传递一个w这个参数,w会覆盖文件的内容.

程序执行了,控制台什么也没有输出,

但是如果来查看一下README这个文件,原本的内容全部不见了,剩下的内容呢,就是刚刚写入的hello,

这个就是只写参数w 达到的效果.

那接下来看一下第3种方式,第3种方式是以追加的方式打开文件,所谓追加的方式,就是打开文件之后把文件的指针移动到文件的末尾,这个时候写的内容就会追加到原本文件已经存在的内容后面,

把w改成a, a是追加的方式,然后呢,,代码改造完成,

再来执行一下程序,控制台仍然没有任何的结果,

再来查看一下README,

经过这个对比, 能够看出来a和w的区别,w会覆盖原有的所有内容,从头开始写入,a会从已有的内容后面开始追加,这样就是两种写入的方式.

如果在打开文件时,在r, w, a后面增加一个加号,

增加加号之后, 就会以读写的方式打开文件,三种方式都会以读写的方式打开文件,在开发中啊,如果以读写的方式打开文件,在针对这个文件操作时,会频繁的移动文件指针,

通常呢文件的操作效率并不会很高,所以啊,在开发时,更多的时候会只读或者只写的方式来操作文件,

5. 使用readline 分行读取大文件

   

readline,从字面上来看, 这个方法应该每次能够读取一行内容, 先回顾一下read 方法,read方法在默认情况下会把文件的所有内容一次性全部读取到内存中,那现在试想一下,假设要读取的文件非常非常大,这个时候使用read 方法一次性把所有内容加载到内存,这个时候会给内存带来非常非常大的压力,

这个时候就可以考虑使用readline 这个方法,readline 方法虽然一次只能读取一行内容,但是呢,可以利用循环, 同样也可以把一个非常大的文件一行一行的读取出来,同时考虑一下,一次只读取一行内容,就不会给内存造成很大的压力了.

这个就是readline 方法的应用场景.

那接下来看一下这个方法的细节,当使用open这个函数打开一个文件后,这个文件的指针默认在文件的开始位置,这个时候调用readline 方法会把文件的第1行内容读取出来,方法执行之后,文件的指针会移动到下一行,这就意味着再次调用readline 方法的时候, 就读取不到任何的内容, 这个就是readline方法的使用细节.

把README 这个文件做一个调整, 这样呢可以方便分行读取内容时,可以很清楚的看到当前读取到第几行,

那就使用readline 方法,从README 文件中一行一行的读取内容,读取一行输出一行, 读取一行输入一行,把所有内容最终都输出在控制台.

先使用file这个变量来接收一下open函数返回的结果,并且传送一个文件名,

文件打开了,接下来应该先把文件做一个关闭, 当打开和关闭准备完成,就可以在中间让文件这个对象来调用一下readline方法, readline 方法一次读取一行内容,并且是有返回结果的,那现在就在前面定义一个text 变量接收一下readline 的返回结果, 同时呢,

同时再使用print 函数把text变量做个输出,读取一行内容的代码,先来运行一下,

hello 1, 已经输出在控制台,这个是读取一行内容,

如果想把所有内容读取出来,可以使用一个循环.

但现在不能够知道这个文件到底有多少行, 在打开文件的时候,并不知道这个文件到底有多少行,这个时候可以这么做,要使用循环, 就使用while来指定.

既然不知道循环条件,就可以把循环设置成一个无限循环,让它一直读取.

把这两行代码增加一个缩进,

第1行代码,是让文件这个对象来调用了一下readline方法,readline方法会读取一行内容返回给text,并且会向下移动文件指针.

如果把文件指针移动到文件末尾,这个方法就不能读取出内容.

如果不能读到内容,就是退出这个循环的时机, 在第6行增加一个注释,判断一下是否读取到内容,如果没有读取到,就可以使用break退出这个循环.

那现在编写一下代码,要判断就使用if关键字,要判断是否读取到, 没有读取到,可以使用not来判断?判断一下有没有内容,如果没有内容,可以使用break这个关键字来退出一下循环,代码改造完成,

运行一下程序,控制台输出了,123,

3行内容输出完成, 整个程序就终止了,这个呢,就是使用一个无限循环加上readline 这个方法逐行的从一个大的文件中顺序读取内容.
 

6. 小文件复制

接下来就针对文件读写做一个案例演练,就用代码的方式来实现一下,平时在文件管理器中经常做的文件复制这个动作,也就是把一个源文件的所有内容复制到一个全新的目标文件.

先来做一下小文件的复制,要复制文件,首先使用open函数打开两个文件,一个是源文件,一个是目标文件, 源文件以只读方式打开,那目标文件,以只写方式打开.

现在来看既然要复制的源文件是一个小文件,就可以使用read 方法,一次性把原文件所有的内容读取出来,然后呢,把这些内容直接写入到目标文件,读取做完了, 写入也完成了,第3步应该关闭文件, 把原文件关掉,同样也需要把目标文件关掉,这个就是小文件复制的思路.

就以README 这个文件作为复制的源文件,把完整的内容复制到另外一个文件.

目标明确之后,以注释的方式先来明确一下代码的步骤,要操作文件,第1步应该打开文件,需要打开两个文件,一个是复制的源文件,一个是复制的目标文件.

打开文件之后就可以进行读写操作,从原文件中读取内容,然后把读取到的内容写入到目标文件,当针对文件操作完成第3步,应该关闭文件,123三个步骤明确下来.

现在就把光标放在第2行,先来以只读的方式打开一下复制的源文件,先给变量起个名字, 然后使用open这个函数,来打开一下要复制的源文件README .

原文件打开之后, 不要忘记还要打开一下目标文件,在起个名字, 同样使用open这个函数,先给目标文件起个名字,给目标文件起了一个名字, 同时注意目标文件,要以只写方式打开,要以只写方式打开,现在就指定一下文件的打开方式是只写的,

现在两个文件都打开了,接下来应该先关闭文件,先把原文件做一个关闭,再把目标文件也关闭一下,好两个文件全部关闭.

就可以把注意力集中在读和写这个操作上,要想从原文件中读取内容,应该让这个对象来调用read 方法,同时read 方法会返回文件的所有内容,定义一个text变量接收一下,现在就用file_read 这个对象来调用一下read 方法,现在已经完成了读的动作,

那接下来要做一个写的动作,那要写入文件,就用file_write 这个对象来调用一下write 的方法,同时把刚刚读取到的内容text 当作参数传递进来,123三个步骤完成,

运行一下程序,看看README 这个文件能不能被复制到 README[复件] 中,

控制台虽然没有任何的输出,

 

但是左侧有一个README[复件] ,

现在双击打开这个文件, 跟README 的内容完全一模一样.

7. 大文件复制

接下来就把上一小节完成的案例做一个扩展,假设现在要复制的源文件非常非常大,就不能够使用read 方法,一次性把原文件全部读取出来, 因为源文件太大,一次性读取, 会给内存造成太大的压力.

这个时候就可以使用到readline 这个方法,可以一行一行的来读取内容,读取一行写入一行,这种思路能够实现大文件的复制.

要复制大文件,不需要修改打开文件这两句代码.

那现在要复制大文件,也不需要需要修改关闭文件这两句代码.

重点 只需要把从原文件中读取内容的代码做一个修改就可以,

要想一行一行的读取内容,首先需要增加一个循环,同样使用无限循环来一行一行的读取代码.

现在要想一行一行的读取代码就不能够使用read 这个方法, 需要读取一行内容,既然要读取一行内容,就需要把read 方法替换成readline ,替换完成,

readline 这个方法不能够保证每一次都读到内容, 因为当文件的指针移动到文件末尾之后,再次执行readline 方法, text 就没有任何内容了,而没有任何内容,刚好是无限循环的出口.

再增加一个注释判断是否读取到内容,要进行判断,就使用if来判断,要判断是否读取到内容,就使用not 这个关键字来判断一下text ,如果没有读取到的内容, 就使用break这个关键字退出一下循环,

那如果读取到内容呢,就让目标文件来执行一下写入的动作,

这一次写入啊,只是把当前读取的这一行写入到目标文件,

整个循环执行完成,目标文件的内容就应该是原文件的内容,代码改造完成,

现在运行一下程序,现在查看一下README[复件],README[复件] 中仍然是hello12345,再来看一下README,同样也是12345.

那么就选中复件的文件,全部选中,

先把它咔嚓掉,

再来运行一下程序,

复件的文件中就一行一行的把README 中的内容复制进来,这个就是复制大文件的思路.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值