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’模式),所以从文本末尾开始写,便不会覆盖掉原有内容。
欢迎各位发表自己的看法,我也深知自己可能会出现一些错误,恳请各位批评指正,互相促进!