python编程中常用的对文件的读和写操作,以及文件的编码问题
对文件操作的流程
- 打开文件,得到文件句柄并赋值给变量
- 通过文件句柄对文件进行操作
- 关闭文件
演示
打开一个文件,读取文件中的数据并输出
第一句代码就是得到了文件的句柄,第二句代码是通过句柄对文件进行操作。第三句代码是关闭文件
详细解释
encoding=“utf-8”,如果不指定编码,默认会以gbk的形式打开,因为我们的系统就是gbk的,但是打开之后python会以utf-8的形式来读取,所以会出问题,写上utf-8这样就会以utf-8的方式来打开文件,这样就不会有问题了
f=open("aa",encoding="utf-8")打开一个文件默认的模式是读模式,也就是只能对文件进行读操作
f=open("aa",encoding="utf-8")相当于f=open("aa","r",encoding="utf-8"),r就是读操作
一个文件的读操作是根据光标来读的,read一次会读到文件的所有内容,光标会在文件内容的最后,如果再次read会继续从最后光标读下去,而此时文件的内容已经没有了,所以读不到任何内容
读操作就是只能读,要是想写的话,有两个模式,"w"或者"a"
w的意思是从新建立这个文件,然后写,也就是文件中原来存在的内容会被删掉
a的意思是在原来已经有的文件的基础上,后面继续写不会覆盖掉原来的文件内容
原来的数据被覆盖了
模式为a,那么就是继续写,原来存在的不会被覆盖掉
write方法写都是继续着当前光标来写,如果要想换行,就在写的内容地方加上一个就OK了
上面的read读操作是一次读取全部,readline方法是一次读取一行
readlines()方法是文件中的内容封装到一个列表中,其中文件中的每一行就是列表中的每一个元素
我们有了所有元素列表之后就可以快速进行遍历操作了
因为每一行的末尾都有,所以输出的结果都会间隔一行,如果要是想去掉这一行可以使用是strip()方法去掉换行和空格
小demo,在输出第二行(对应列表为下标为1)之前打印--------------
这个方法虽然可以实现一行一行读取文件的内容,但是存在着一些问题,这个方法第一步是执行f.readlines()方法将文件内容封装成一个列表但是如果一个文件内容过大,那么这个过程会非常慢,所以这个方法不常用,真正用的是下面这个方法:
这个方法是读一句从文件中取一句,快速,缺点就是不可以直接获取每行对应的下标,不过可以使用计数器的方式解决这个问题
读取文件数据的时候,从哪里开始读,是由当前光标决定的,刚开始的时候文件的光标是文件的初始位置,随着读的进行,光标一直往后在移动,只要读就会继续当前的光标来读,我们可以通过tell()函数来返回当前的光标位置,举例:
我们read读一次全部读完,readline读一次读一行,可以通过read(数字)来指定一次读的个数,read(5)表示一次读5个
feng后有一个空格,空格占一位
光标是根据读主键往后移动的,也可以直接通过方法seek()来设置光标到什么位置
f.seek(0)将光标回到0位置,不是所有文件都可以seek移动光标的,可以通过seekable()方法来确定该文件是否可以移动光标
类似的方法还有readable()判断文件是否可读,writeable()判断文件是否可写
其它一些的api
输出当前文件的编码和名字:
截取文件truncate(数字),这个方法的意思是无论光标在什么位置,他都会从文件的开头截取数字个数的文字保存,之后的内容全部删掉。
原aa文件
只要十个,从开头数
向文件中写数据详解
执行write时不是一下子就将数据写入到文件中,而是先将数据写入到缓存中,然后等缓存数据达到一定数量的时候,再写入文件中,可以通过flush刷新,flush刷新无论现在缓存中有多少内容,只要刷新就直接全部写到文件中。
print()输出,输出到控制台然后默认换行,可以使用sys.stdout.write()来出输出,需要导入sys包,它可以不换行输出
小demo,模拟文件安装的进度条是一行输出的,所以用sys.stdout.write来输出
效果就是输出50个#。每隔0.1秒输出一个,所以它不是逐渐输出的,会有一个过程,就是类似进度条的效果
这个程序导入了两个包,一个sys,一个time,sys输出的时候,也是先写入到内存中等到一定数量之后,在整体输出到控制台,那么就很难出现进度条效果,可能出现一下子输出50个的效果,为了防止这类事情发生,所以只要write一次就flush一次,也就相当于直接输出到控制台,一个#一个#的输出,但因为计算机运行速度太快,所以即使是50个也一会进会被输出,所以使用time.sleep,目的就是让当前的线程睡一会,这样就会有进度条一点一点运行的效果了。
其它打开文件的模式
1读写模式r+
这里有一点是需要注意的,可能会有人以为readline读一行之后,光标会到在一行之后的位置,然后此时写入数据应该是在一行之后写,可实际情况是无论光标在什么位置,写是在文件的最后写入的,这一点需要注意
2写读模式
写读模式就是第一步先创建文件夹,无论原来的文件夹是否存在,内部是否有内容,都会自动创建一个新的,内容为空的
可以看出readline没有读取到内容,这是因为w+模式第一步是先创建一个文件,所以读的时候这个文件是空的内容,所以读不到内容,然后write写到文件中222222222
写读模式写的时候内容也是写在文件最后,无论光标在什么位置
追加读写模式a+
和w+不同的一点是它增加了读,而且不会新创建文件,所以可以追加写
二进制rb模式
当我们读取的一个文件是二进制文件的时候是使用rb模式的进行读取,使用rb的时候,不用指定编码
什么时候使用rb模式?
网络传输socket,网络传输只能用二进制模式传输(3.0)
二进制文件,比如视频
二进制wb模式
wb模式就是写入二进制的模式,使用wb模式的时候,不能使用ecoding来指定编码格式
encode()没有指定编码的时候,默认的是程序的编码
文件的修改
一个文件只能读取或者写入,是无法修改的,比如要想修改文件中的某一句话,是不可能的事情,但是可以通过下列方式完成类似修改的操作:
遍历这个文件,读取每一行,然后写入一个新的文件,读取每一行的时候判断该行是否是我们要修改的那行,如果是那就将改行替换成我们要修改的,然后再写入。
将3333333那行修改成huanfeng
打开文件一定要关闭文件
打开文件经常会忘记关闭文件,这有时候会出问题,为了解决这个问题,可以使用with的方式来打开文件,with代码块执行完毕之后,会自动关闭文件,使用方式举例:
f=open("aa","r",encoding="utf-8")相当于with open("aa","r",encoding="utf-8") as f:
没有必要关闭文件,所有执行文件的代码就都要写到with内,这样with内代码执行完毕之后,文件会自动关闭
python2.7之后,可以允许一个with同时操作多个文件,多个文件用,隔开
格式一
格式二