pythonopen函数打开模式_python open()函数的模式选择

python open()函数打开文件的模式详解html

使用python处理文件时,避免不了要用到open()函数。咱们今天主要讨论mode参数的区分。python

fd = open('文件名(路径)’, mode=‘模式’)函数

先放上stockoverflow上一个哥么作的图,很清楚的从整体上归纳了mode的区分;post

32f3bed9b3c2e7fe0c446f2df7ef57b7.png

图中展现了几种主要的模式,r(只读),r+(读写),w(只写), w+(读写), a(追加),a+(追加读)this

从功能上分类:模式r只有读的功能,模式w和a只有写的功能,模式r+,w+和a+拥有读和写的功能。spa

读的功能就是,文件读入的对象能够使用read读取文件内容,不用使用write方法向写入内容;写的功能是反过来的,指针

能够使用write方法向写入内容,不用使用read读取文件内容,而读写就是这两个功能都有。code

说到这里模式之间的区别仍是不清楚。咱们能够接着看下面这张图来进一步认识模式间的区别:htm

------------------|r r+w w+a a+read|++++write|+++++write after seek|+++create|++++truncate|++position at start|++++position at end|++

1,r和r+的区别对象

先试着执行下面代码:

1 fd1 = open('newfile1.txt', mode='r')2 fd2 = open('newfile2.txt', mode='r+')

若是你的工做目录下没有newfile.txt的话,运行这两行代码会出现FileNotFoundError报错信息,告诉

你“本路径下没有名叫newfile.txt的这个文件”,能够先建立一个名为newfile.txt的文件再执行上面代码就不会出问题了,

接着执行:

1 fd1.read()2 fd2.read()

代码正常执行,返回空字符串;返回空字符串是由于你的文件里什么本来就什么就没有

接着执行:

1 fd1.write('this is test')2 fd2.write('this is test')

第一行代码报错io.UnsupportedOperation: not writable,第二行代码正常运行,这里就是r和r+的区别了

r只有读的功能,r+既有读的功能,也有写的功能。

2,w和w+的区别

1 fd1 = open('newfile1.txt', mode='w')2 fd2 = open('newfile2.txt', mode='w+')3 fd1.write('this is test')4 fd2.write('this is test')5 fd1.read()6 fd2.read()

与r和r+不一样的是,不管当前目录下有没有名字为newfile.txt的文件,第一第二行都会正常运行,若是没有的话会在当前目录下建立一个名为newfile.txt的文件。

第三第四行也会正常运行,并将字符串写入文件,

第五行会报错:io.UnsupportedOperation: not readable,第六行会正常运行;这说明w和w+的区别是后者兼有读写功能,前这只有写的功能。

第六行虽然运行成功了,可是返回的确是空字符串,问题是咱们在读取以前已经写入了内容呀?这

是由于写入结束以后咱们的指针放在文件的末尾,这时候你读取的就是末尾以后的东西,也就是空

字符串了。能够尝试一下方法解决:

(1)先关闭文件再打开文件读取

1 fd2.close()2 fd2 = open('newfile2.txt', mode='r')3 fd2.read()

这样的话会正常显示咱们以前写入的内容,这个方法未免太“折腾”了

(2)移动指针到文件开头再读取

1 fd2.seek(0)2 fd2.read()

这样也能够成功读取刚写入的内容,seek(0)中的0表示offset=0,偏移0个字符,还有一个参数whence默认为0表明从文件开始位置,另外还有1表明当前位置,2表明文件末尾。

3,a和a+的区别:

模式a和a+之间的区别与w和w+之间的区别相同,在此不作赘述

4,a和w的区别

模式a和w都是写,区别就在于从哪里开始写,为了说明问题,咱们先新建立两个文件new1.txt和new2.txt内容都为:

this istest1

thisistest2

thisis test3

而后执行下面代码:

1 fd1 = open('new1.txt', mode='w')2 fd1.write('try to update')3 fd1.seek(0)4 fd1.read()

输出的结果为:

try to update

new1.txt文件中的原始内容被“冲洗”掉了!,咱们再试试追加模式a

1 fd2 = open('new2.txt', mode='a')2 fd2.write('try to update')3 fd2.seek(0)4 fd2.read()

返回的结果为:

this istest1

thisistest2

thisistest3try to update

在文本的末尾添加了新写入的内容。上面就是模式w和a的区别,w在打开文件的

时候将指针移动到文件开头并截断(truncate)了以后的全部内容,截断即删除掉了。

而模式a开打文件的时候,其指针的位置是在文件的末尾。因此写入新内容的时候

这两种模式就会不同。

值得一提的是,以模式a打开一个当前目录下不存在的文件也一样会新建立该文件。

5,r+和w+之间的比较

r+和w+之间是有必要拿出来比较一下的,由于他们的功能仍是很像的,先说相同点

(1)都是可读可写的

(2)打开文件时指针都位于开始位置

再说不一样点,建立两个新文件new3.txt和new4.txt内容都为:

this isone

thisistwo

thisis three

尝试如下代码:

1 fd3 = open('new3.txt', mode='w+')2 fd3.write('1234')3 fd3.seek(0)4 fd3.read()

返回的结果是:

1234 isone

thisistwo

thisis three

仅仅是替换了new3.txt原来位置的字符,其余未变!咱们再试试w+

1 fd4 = open('new4.txt', mode='w+')2 fd4.write('1234')3 fd4.seek(0)4 fd4.read()

返回的结果为:

1234

结果一目了然了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值