Python — 文件IO常用操作(一)– open参数 mode

 一、打开操作

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

打开一个文件,返回一个文件对象(流对象)和文件描述符。

打开文件失败,则返回异常。

基本使用:创建一个文件test,然后打开它,用完关闭

f = open("test")  # file对象
# windows <_io.TextIOWrapper name='test' mode='r' encoding='cp936'>
# linux <_io.TextIOWrapper name='test' mode='r' encoding='UTF-8'>
print(f.read())  # 读取文件
f.close()  # 关闭文件

文件操作中,最常用的操作就是读和写。

文件访问的模式有两种:文本模式和二进制模式。

不同模式下,操作函数不尽相同,表现得结果也不一样。

注:

Windows中使用codepage代码页,可以认为每一个代码页就是一张编码表。cp936等同于GBK。

二、open的参数

1、file

打开或者要创建的文件名。

如果不指定路径,默认是当前路径。

2、mode模式

默认是文本打开模式,且是只读的。

(1) r模式 

文件指针初始在开头0

# r模式  只读,默认打开模式;文件不存在,立即报错
f = open('test')    # 只读还是只写?  ----只读,默认是文本打开模式,且是只读的
f.read()
f.write('abc')
f.close()

f = open('test', 'r')   # 只读
f.write('abc')
f.close()

f = open('test1', 'r')  # 只读,文件不存在

(2) w模式

文件指针初始位置在0

# w模式
'''
w模式,为白纸一张,从头写
1. 只写,不支持读取
2. 文件存在,文件内容将被清空,从头写,小心:会清空内容
3. 文件不存在,文件将被创建,从头写
'''
f = open('test', 'w')   # 只写打开
f.write('abc')
f.close()

f = open('test', mode='w')
f.close()

f = open('test1', mode='w')
f.write('123')
f.close()

(3) a模式

文件指针初始位置在EOF

# a模式
'''
只写,不支持读取
文件存在,追加写入
文件不存在,创建文件,从头写,对于白纸来说就是从尾部写,也就是追加写
a模式,不管文件存在否,都从尾部追加写入
所以:
文件存在,只写打开,追加内容
文件不存在,则创建后,只写打开,追加内容
'''
f = open('test2', 'a')
f.read()

f.write('abcde')
f.close()

f = open('test2', 'a')
f.write('\n hello')
f.close()

f = open('test3', 'a')
f.write('test3')
f.close()

(4) x模式

文件指针在初始位置0

# x模式  exists
'''
只写,不支持读取
文件存在,抛异常 -- 文件存在了
文件不存在,创建新文件,所以只能从头写
所以:
文件不存在,创建文件,并只写方式打开
文件存在,抛出FileExistsError异常
'''
f = open('test2', 'x')
f.read()
f.write('abcd')
f.close()

f = open('test2', 'x')

总结:

open默认是只读模式 r 打开已经存在的文件

r模式:

        只读打开文件,如果使用write方法,会抛异常

        如果文件不存在,抛出FileNotFoundError异常

w模式:

        表示只写方式打开,如果读取则抛出异常

        如果文件不存在,则直接创建文件

        如果文件存在,则清空文件内容

r是只读,wxa都是只写

wxa模式都可以产生新文件:

        w不管文件是否存在,都会产生全新内容的文件重新写入

        a不管文件是否存在,都能在打开的文件尾部追加

        x必须要求文件事先不存在,自己要造一个新文件

w从头写;a追加写;x文件不存在,创造文件从头写

字符和编码有关,字符串的世界都是有编码的

(5) mode中的t,文本模式

字符流,将文件的字节按照某种字符编码理解,按照字符操作。

t是text,文本模式,默认可以不写

t模式不能单独使用,必须和rwax四种之一配合使用,不影响主模式

open的默认mode就是rt(rt才是真正的默认模式)

(6) 二进制模式b

b是binary,二进制,字节的世界都是0和1组成的字节,和编码无关 

字节流,将文件就按照字节理解,与字符编码无关

二进制模式操作时,字节操作使用bytes类型

f = open("test3", 'rb')   # 二进制只读
s = f.read()
print(type(s))    # bytes
print(s)
f.close()    # 关闭文件

f = open("test3", 'wb')    # IO对象
s = f.write("你好".encode())
print(s)   # 是什么?
f.close()

四种主模式rwax只能选择一种,与t 、b组合使用

(7) +

为r、w、a、x提供缺失的读或写功能,但是,获取文件对象依旧按照r、w、a、x自己的特征

+模式不能单独使用,可以任务它是为前面的模式字符做增强功能的

+的意思是plus,附加的能力,必须和主模式配合使用,不影响主模式

r+, rt+, r+t   只读文本模式打开,补充写能力

w+,wt+,w+t 只写文本模式打开,补充读能力,w能力不变

三、文件指针

文件指针,指向当前字节位置

mode=r,指针起始在0

mode=a,指针起始在EOF

tell()显示指针当前位置,返回的一直都是字节的索引 

seek(offset[, whence])

移动文件指针位置,offset偏移多少字节,whence从哪里开始

文本模式下

whence 0 缺省值,表示从头开始,offset只能正整数

whence 1 表示从当前位置,offset只接受0

whence 2 表示从EOF开始,offset只接受0

文本模式支持从开头向后偏移的方式

whence为1表示从当前位置开始偏移,但是只支持偏移0,相当于原地不动,所以没什么用

whence为2表示从EOF开始,只支持偏移0,相当于移动文件指针到EOF

seek是按照字节偏移的

read在文本模式是按照字符读取的

二进制模式下:

whence 0 缺省值,表示从头开始,offset只能正整数

whence 1 表示从当前位置,offset可正可负

whence 2 表示从EOF开始,offset可正可负

二进制模式支持任意起点的偏移,从头、从尾、从中间位置开始

向后seek可以超界,但是向前seek的时候,不能超界,否则抛异常

作者:晶晶亮_Casablanca

物联沃分享整理
物联沃-IOTWORD物联网 » Python — 文件IO常用操作(一)– open参数 mode

发表回复