Fork me on GitHub

文件操作之打开模式

一、概述

之前的博客中只是简单介绍了文件操作中,打开模式,今天需要详细的介绍一下文件的打开模式

二、打开模式

1、普通打开模式

  • r,英文:read,只读模式(默认)
  • w,英文:write,只写模式(不可读,不存在则创建新文件,存在则删除内容)
  • a,英文:append,追加模式(不可读,不存在则创建,存在则只追加内容

普通模式不论是读、写或者追加,都是按照字符来操作的,所以在操作过程中不需要进行编码(encode)和解码(decode)的动作。

说道这里有些童鞋觉得,我还不懂字符和字节的区别,或者说什么是编码和解码,请:猛击这里

①r(读)

注:读操作,只能是只读,不能写和追加

②w(写)

注:写操作只能写,不能读和追加,而且写操作会重新创建一个文件,会覆盖之前的文件

③a(追加)

 

注:追加模式不可读,不存在则创建,存在则只追加内容

2、同时读写模式

  • r+,可读写文件(可读;可写;可追加,不存在文件则报错)
  • w+,可写读文件(可读,可写,创建新文件)
  • a+,可追加和读文件(可读,可追加,不存在则创建)

①r+(读写)

代码如下:

f = open("yesterday2","r+",encoding="utf-8")
print(f.readline())
#获取指针的位置
print(f.tell())
#写入文件
f.write("\n高高最帅。。")

#输入
Somehow, it seems the love I knew was always the most destructive kind #读取文件

72 #指针位置

写入结果,如图:

这个说明什么呐,就是说,不管指针在什么位置,依然在文件内容的最后添加写入的内容

②w+(写读)

写读的功能是:创建新文件->写入文本->设置指针为开始位置(seek(0))->读取到文件内容

代码如下:

f = open("yesterday2","w+",encoding="utf-8")
print(f.read())
f.write("qigao zui lang\n")
f.seek(0)
print(f.read())
print(f.tell())
f.write("qigao zui lang\n")
f.seek(0)
print(f.read())

#输出
#第1次读的内容

#第二次读取的内容
qigao zui lang

#指针位置
16
#第三次读取的内容
qigao zui lang
qigao zui lang

 写入文件的内容如下:

 注:

  1. 写读功能,写入的行数不会收指针位置的控制,就是说不管指针在什么位置,依然写入的还是最后一行。
  2. 就是说写读功能是先创建一个文件,所以第一次读的时候,文件内容为空,但是当你写入内容时,需要从开始读取文件内容的话,或者在某个位置之后的内容的话,需要设置指针位置,否则读取不到内容,代码如下:
f = open("yesterday2","w+",encoding="utf-8")
f.write("qigao zui lang\n")
print("-----不设指针位置-----")
print(f.read())
f.write("qigao zui lang\n")
print("-----设置指针位置-------")
f.seek(0)
print(f.read())

#输出
-----不设指针位置-----

-----设置指针位置-------
qigao zui lang
qigao zui lang

③a+(追加和读)

追加和读:追加读在写入文件时,不会清空之前的内容,而是在之前的内容的追加一行,读取文件内容,需要重新设置指针

f = open("yesterday2","a+",encoding="utf-8")
print("--------data1-----")
print(f.read())  #没有设置指针
print("--------data2-----")
f.seek(0)
print(f.read()) #设置指针
f.write("qigao zui lang\n")
print("---------data3----")
print(f.read())  #写完以后没有设置指针
print("--------data4-----")
f.seek(0)
print(f.read()) #写完以后设置指针
f.close()

#输出

--------data1-----

--------data2-----
And only now I'm left alone to end the play, yeah
qigao zui lang
qigao zui lang

---------data3----

--------data4-----
And only now I'm left alone to end the play, yeah
qigao zui lang
qigao zui lang
qigao zui lang

 注:在追加内容以后,读取文件时,需要重新设置指针的位置读取文件,不管指针的位置在哪里,写入的都是追加在文件的最后一行

3、二进制打开模式

  • rb,二进制读
  • wb,二进制写
  • ab,二进制追加

  这种打开模式就要注意了,这种是以二进制操作的,也就是说不管是是读,写,追加,都必须是二进制文件,也就是字节,而不是字符,需要解码以后才会生成字符。一般情况下跨平台的文件视频文件等需要二进制模式 操作

①rb(二进制读)

#二进制读取
f = open("yesterday2","rb")
f_read = f.read()
print(f_read)
#解码
print(f_read.decode())

#输出
#没有解码,读出来的是二进制,也就是字节码
b'Somehow, it seems the love I knew was always the most destructive kind'
#解码后,是字符
Somehow, it seems the love I knew was always the most destructive kind

②wb(二进制写)

f = open("yesterday2","wb")
in_str = "小高最帅"

#这边写入文件,就需要编码,否则就会报错
in_str = in_str.encode()

f.write(in_str)
f.close()

③ab(二进制追加)

f = open("yesterday2","ab")
in_str = "gaoge,shuai de yibi"
#这边需要先编码,才能追加到文件中
in_str = in_str.encode()

f.write(in_str)
f.close()

 总结:

普通打开模式和二进制打开模式,只是在python 3中,二进制打开模式才做了字符和字节的编码和解码;然而在python 2中,字节和字符没有做明显的区别,所以在python 2中,二进制模式读取文件时,不需要做编码和转码的操作

 
posted @ 2018-06-10 15:19  IT技术随笔  阅读(833)  评论(0编辑  收藏  举报
返回顶部↑