文件1:打开文件 - open函数实操

目录

1. open函数

2. file参数

3. mode参数

4. 多模式实操

4.1 'r'模式

4.2 'w'模式

4.3 'x'模式

4.4 'a'模式

4.5 '+'模式

4.6 'b'模式

4.7 't'模式


1. open函数

参考open函数 

函数原型如下:

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

2. file参数

file:指定一个将要打开的文件的路径(绝对路径或相对路径,参考绝对、相对路径 );可以是要封装文件对应的整数类型文件描述符(如果给出的是文件描述符,则当返回的 I/O 对象关闭时它也会关闭,除非将 closefd 设为 False 。)。

当 file 使用绝对路径时,按路径打开/新建相应文件;当 file 使用相对路径时,IDLE以Python安装文件夹为起始点,Pycharm以当前工程文件夹为起始点;

注意路径中的“\”会触发各类转义字符,可以参考原始字符串r"" 的处理方式如下:

  1. 使用\\替换掉字符串中的\
  1. 字符串最前面使用字母r表示后续字符串是原始字符串,不使用任何转义字符
f = open(r'E:\David\Code\python\文件\test2.txt','w')
f = open('E:\\David\\Code\\python\\文件\\test3.txt','w')

3. mode参数

mode参数,可选参数,指定文件的打开模式,参数说明如下表:

字符串

含义

'r'

读取(默认)

'w'

写入(如果文件已存在则先截断清空文件)

'x'

排他性创建文件(如果文件已存在则打开失败)

'a'

追加(如果文件已存在则在末尾追加内容),注1

'b'

二进制模式,注2

't'

文本模式(默认),注3

'+'

更新文件(读取和写入)

注1:在某些 Unix 系统中,无论当前文件指针位于什么位置,所有的写入操作都将追加到文件末尾。
注2:如果需要读写原生字节格式,请使用二进制模式,并且不要去指定 encoding 参数。
注3:如果未指定 encoding 参数,则会根据当前平台决定编码格式,可以通过调用 locale.getpreferredencoding(False) 获取当前的编码。  

mode参数,至少需要有'r'、'w'、'x'、'a'四种模式之一,并可视情况添加'+'模式,以及'b'、't'模式之一,譬如'r+'、'w+b'等。

4. 多模式实操

4.1 'r'模式

默认模式为 'r' ,read模式(打开文件用于读取文本,与 'rt' 同义);

打开后,初始文件指针在位置0;

文件不存在时,'r' 模式打开文件失败,报错;

可以读取、修改文件指针,不可写入。

对如下文件做 'r' 模式打开:

文件1:打开文件 - open函数实操_第1张图片

 

# 'r' 模式打开文件test.txt,并赋值给f
f = open(r'E:\David\Code\python\文件\test.txt','r')

#文件可读、不可写、可修改指针
f.readable()
True
f.writable()
False
f.seekable()
True

#做文件读取、修改文件指针操作成功
f.readline()
'123abc  *)-{\n'
f.seek(0)
0
f.read()
'123abc  *)-{\n中国话,看一看……\n'

#做文件写入操作失败,报错
f.write('1234')
Traceback (most recent call last):
  File "", line 1, in 
io.UnsupportedOperation: not writable

#文件不存在时,'r' 模式打开文件失败,报错
f = open(r'D:\PycharmProject\测试文件\test4.txt','r')
Traceback (most recent call last):
  File "", line 1, in 
FileNotFoundError: [Errno 2] No such file or directory: 'D:\\PycharmProject\\测试文件\\test4.txt'

4.2 'w'模式

'w' 模式,write模式,如果文件不存在则新建文件,如果文件已存在则截断清空文件;

打开后,初始文件指针在位置0;

可以写入、修改文件指针,不可读取;

写入操作,自当前文件指针,替换/新增为待写入数据。

对4.1 'r' 模式操作文件 test.txt,做 'w' 模式打开,文件阶段清空,再做写入操作:

# 'w' 模式打开文件test.txt,并赋值给f2
f2 = open(r'E:\David\Code\python\文件\test.txt','w')

#可以写入、修改文件指针,不可读取
f2.readable()
False
f2.seekable()
True
f2.writable()
True

#对f2做写入、修改文件指针操作,成功
f2.write('1234')
4
f2.write('abcdefg')
7
f2.writelines('* ,\t. @\n#>')
f2.seek(3)
3
f2.write('中文')
2

#对f2做读取操作失败,报错
f2.read()
Traceback (most recent call last):
  File "", line 1, in 
io.UnsupportedOperation: not readable

#保存上述写入操作
f2.flush()

最终text.txt修改保存后如下:

文件1:打开文件 - open函数实操_第2张图片

4.3 'x'模式

'x' 模式,排他性创建文件,如果文件不存在创建空白文件,如果文件已存在则创建失败;

打开后,初始文件指针在位置0;

新创建的文件可以写入、修改文件指针,不可以读取;

写入操作,自当前文件指针,替换/新增为待写入数据。

#创建已存在文件失败,报错
f3 = open(r'E:\David\Code\python\文件\test.txt','x')
Traceback (most recent call last):
  File "", line 1, in 
FileExistsError: [Errno 17] File exists: 'E:\\David\\Code\\python\\文件\\test.txt'

# 'w' 模式创建文件test2.txt,并赋值给f3
f3 = open(r'E:\David\Code\python\文件\test2.txt','x')

#可以写入、修改文件指针,不可读取
f3.writable()
True
f3.readable()
False
f3.seekable()
True

#对f3做写入、修改文件指针操作,成功
f3.write('01234china中文\t¥,\n*#')
18
f3.seek(3)
3
f3.write('插入一段!')
5

#对f3做读取操作失败,报错
f3.read()
Traceback (most recent call last):
  File "", line 1, in 
io.UnsupportedOperation: not readable

#保存上述写入操作
f3.flush()

最终text2.txt修改保存后如下;因为调用指针插入中文,与文件中原有中文字符串位置交叉,导致部分数据混乱错误:

文件1:打开文件 - open函数实操_第3张图片

4.4 'a'模式

'a'模式,append(追加)模式,如果文件已存在则在末尾追加内容;

打开后,初始文件指针在位置 eof;

新创建的文件可以写入、修改文件指针,不可以读取;

写入操作,在文件末尾新增待写入数据。

# 'a' 模式创建文件test2.txt,并赋值给f
f = open(r'E:\David\Code\python\文件\test.txt','a')

#可以写入、修改文件指针,不可读取
f.writable()
True
f.readable()
False
f.seekable()
True

#对f做读取操作失败,报错
f.read()
Traceback (most recent call last):
  File "", line 1, in 
io.UnsupportedOperation: not readable

#对f做写入、修改文件指针操作成功
f.write('in a method')
11
f.flush()
f.seek(0)
0
f.write('cover')
5

#保存上述写入操作
f.flush()

所有写入数据,都自动在文件末尾添加:

4.5 '+'模式

'+' 模式,更新文件,同时支持读取和写入;

'+' 模式不能单独使用,需要配合 'r'、'w'模式一起使用;

'r+' 模式打开文件,但不清空内容,支持读取、写入、修改文件指针;

'w+'模式打开文件,清空内容,也支持读取、写入、修改文件指针。

#'+' 模式单独使用,打开文件失败,报错
f = open(r'E:\David\Code\python\文件\test.txt','+')
Traceback (most recent call last):
  File "", line 1, in 
ValueError: Must have exactly one of create/read/write/append mode and at most one plus

#'r+' 模式打开文件
f = open(r'E:\David\Code\python\文件\test.txt','r+')

#支持读取、写入、修改文件指针
f.writable()
True
f.readable()
True
f.seekable()
True

#读取、写入、修改文件指针,执行成功
f.read()
'0123abcd中文*&¥%'
f.write('替换ABCD')
6
f.seek(0)
0
f.read()
'0123abcd中文*&¥%替换ABCD'

#'w+' 模式打开文件
f2 = open(r'E:\David\Code\python\文件\test.txt','w+')

#文件清空,读取、写入、修改文件指针,执行成功
f2.read()
''
f2.write('123abc中文')
8
f2.seek(0)
0

4.6 'b'模式

'b'模式,以二进制模式打开的文件(包括 mode 参数中的 'b' )返回的内容为 bytes 对象,不进行任何解码;

不能单独使用,需要配合rwxa四种模式之一使用;

对以二进制模式打开的文件,写入数据需要转换为二进制格式。

# 'b' 模式不能单独使用,否则报错
f = open(r'E:\David\Code\python\文件\test.txt','b')
Traceback (most recent call last):
  File "", line 1, in 
ValueError: Must have exactly one of create/read/write/append mode and at most one plus

#文件读取返回二进制格式
f = open(r'E:\David\Code\python\文件\test.txt','r+b')
f.read()
b'123abc\xd6\xd0\xce\xc4in a methodcover'

#直接写入字符串数据,报错
f.write('abc')
Traceback (most recent call last):
  File "", line 1, in 
TypeError: a bytes-like object is required, not 'str'

#写入转换为二进制字节数据,成功
f.write(bytes('abcde',encoding="utf-8"))
5
f.seek(0)
0
f.read()
b'abcdec\xd6\xd0\xce\xc4in a methodcover'

修改后文件内容如下:

4.7 't'模式

在文本模式下(默认情况下,或者在 mode 参数中包含 't' )时,文件内容返回为 str ,首先使用指定的 encoding (如果给定)或者使用平台默认的的字节编码解码;

不能单独使用,需要配合rwxa四种模式之一使用。

f = open(r'E:\David\Code\python\文件\test.txt','t')
Traceback (most recent call last):
  File "", line 1, in 
ValueError: Must have exactly one of create/read/write/append mode and at most one plus

你可能感兴趣的:(Python学习,#,文件,python)