day3-文件操作之打开模式


一、概述

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

二、打开模式

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中,二进制模式读取文件时,不需要做编码和转码的操作

优质内容筛选与推荐>>
1、eclipse 调试nodejs 发生Failed to connect to standalone V8 VM错误的解决方案
2、重置数据库的id
3、Directx11教程36 纹理映射(6)
4、2015.6.25
5、与你一起学习MS Project理论篇:项目管理与Project


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn