天天看点

Python中open方法mode参数一些使用问题Python中文件打开方法open()中的参数问题

Python中open方法mode参数一些使用问题

  • Python中文件打开方法
  • open()中的参数问题

Python中文件打开方法

使用open()方法可以打开文件,使用方法有两种:

f = open('E:\Projects\Python\text.txt') #1
     with open('E:\Projects\Python\text.txt') as g:#2
         g.read()
           

两种方法均可打开text.txt文件,但第二种会在执行完冒号后的语句(段)后自动执行g.close()方法,而第一种方法需要自己再加一行f.close()代码才会关闭。

如上代码有时会报错,提示路径下文件找不到,一般是系统把字符串中的\符号识别成了转义符,这里可以在字符串引号前加上r或R让编译器识别\为ascii字符,而不是识别为转义符。例:

with open(r'E:\Projects\Python\text.txt') as g:#将单引号中的\识别为符号
         g.read()
           

open()中的参数问题

实际上,open()方法中实际隐藏了很多参数,如模式mode,缓冲buffering等,这里只讨论mode参数的设置问题。

首先,格式为:open(file, mode=‘r’)或者open(file,‘r’)

例子中,模式r代表只读;常用的模式见下表:

Mode Meaning
r 只读模式
w 写模式
a 追加写模式

r:指针在文本最前(0,0),只能进行读,不可写;

w:指针在文本最前(0,0),如果没有目标文本,会新建一个空目标文本;如果有,会清除目标文本中的所有内容,相当于新建一个空的目标文本后替换原文本;

a:如果有目标文本,指针会跳到文本的最后;如果没有找到,同w模式会新建一个空的文本。

于是便有一些mode使用方式上的问题,假设我们的text.txt中的文本为This is Reading Text ,使用三种模式,如下面三段代码:

with open(r'E:\Projects\Python\text.txt','r') as f:
         print(f.read())
           

输出为:

This is Reading Text
           

而使用‘w’模式:

with open(r'E:\Projects\Python\text.txt','w') as f:
         print(f.read())
           

输出为:

'a’模式:

with open(r'E:\Projects\Python\text.txt','a') as f:
         print(f.read())
           

输出为:

可以放到python中实验,得到’w’和’a’模式下的输出为空;这是因为’w’模式下会清空文本内容;而’a’模式下,指针在文本的最后,会从当前指针位置开始往后读;如果想在这种模式下读取全部的文本,则需要使用seek()方法:

with open(r'E:\Projects\Python\text.txt','a') as f:
         f.seek(0,0)#返回最前指针
         print(f.read())
           

输出为:

This is Reading Text
           

此外,还有二进制模式,使用方法一般在模式后面加一个字母b,如’rb’,具体使用方式这里不提。

+模式,放在三种模式后使用,意义是把单纯的只读模式、写模式等改变为可读写模式,使用方式为:‘r+’、‘w+’、‘a+’。

带上+号的三种读写模式看似有所差异,实际上除了一开始open()方法有所差异外,在正常的读写操作是基本可以说是没有差异的,关键就是指针的位置。我们保持初始文本内容为This is Reading Text ,看下面两个例子:

with open(r'E:\Projects\Python\text.txt','r+') as f:
         print(f.read())
         f.write("\nThis is Writing Text")
         seek(0,0)
         print(f.read())
           

输出为:

This is Reading Text This is Reading Text
     This is Writing Text
           

文本中有两行:

This is Reading Text

This is Writing Text

如果我们删除第一行的print,如下代码:

with open(r'E:\Projects\Python\text.txt','r+') as f:
         f.write("\nThis is Writing Text")
         seek(0,0)
         print(f.read())
           

输出为:

This is Writing Text
           

而且文本也可以看到,只有一行This is Writing Text ,这是因为r+指针在文本的开头,而写操作正是从开头的指针往后写,覆盖掉了原来的文本;而第一个例子因为执行了read()方法,指针在文本的最后(相当于读取开始就是采用’a’模式),所以从文本末尾开始写,便不会覆盖掉原有内容。

欢迎各位发表自己的看法,我也深知自己可能会出现一些错误,恳请各位批评指正,互相促进!