1. 文件的打开
- 文件(file)通过Python程序来对计算机中的各种程序进行增删改查的操作,文件也叫做 I/O(Input/Output)
- 文件的打开的操作步骤
- 打开文件
- 对文件进行修改、保存的操作
- 关闭文件
- 文件会有一个返回值。返回一个对象,返回的这个对象就是当前文件的本身。
- open()函数
- 在 Python 中,如果想要操作文件,首先需要创建或者打开指定的文件,并创建一个文件对象,而这些工作可以通过内置的 open() 函数实现。
- open() 用于创建和打开指定文件
- 语法:file_object = open(file,mode=‘r’,buffering=None,encoding=None)
- 个数参数的用法:
- file_object:要创建的文件对象
- file:想要访问的文件名的字符串的值
- mode :可选参数,指的是文件的打开方式,默认为 r
- buffering:可选参数,用于对指定文件进行读写操作时,是否使用缓冲区
- enconding:手动设定打开文件的编码格式,如果不对编码格式进行修改,默认为cp936,为GBK模式
# 1.txt 文件已经创建
file = open('1.txt')
print(file)
<_io.TextIOWrapper name='1.txt' mode='r' encoding='cp936'>
file = open('1.txt', encoding='utf-8')
print(file)
<_io.TextIOWrapper name='1.txt' mode='r' encoding='utf-8'>
# 注意:手动修改enconding的值仅限于文本文件,也就是说以二进制模式打开时,不能对enconding参数值进行任何的修改,否则会抛出 ValueError 异常
模式 | 意义 | 注意事项 |
---|---|---|
r | 只读模式打开文件,读文件内容的指针会放在文件的开头(默认) | 操作的文件必须存在 |
rb | 以二进制模式、只读格式打开文件,读文件内容的指针位于开头,一般用于非文本文件(音频文件、图片文件) | 操作的文件必须存在 |
r+ | 打开文件后,既可以从头读取文件内容,也可以从开头向文件中写入新的内容,写入的新内容会覆盖文件中等长度的原有内容。 | 操作的文件必须存在 |
rb+ | 以二进制格式、采用读写模式打开文件,读写文件的指针会放在文件的开头,通常针对非文本文件(如音频文件) | 操作的文件必须存在 |
w | 以只写模式打开,若该文件存在,打开时会覆盖原文件的内容 | 若文件存在,会清空其原有内容(覆盖文件);反之,则创建新文件。 |
wb | 以二进制模式、只写格式打开,一般用于非文本文件(音频文件) | 若文件存在,会清空其原有内容(覆盖文件);反之,则创建新文件。 |
w+ | 打开文件后会对原文件内容进行清空,并对该文件有读写权限 | 若文件存在,会清空其原有内容(覆盖文件);反之,则创建新文件。 |
wb+ | 以二进制格式,读写模式打开文件,一般用于非文本文件 | 若文件存在,会清空其原有内容(覆盖文件);反之,则创建新文件。 |
a | 以追加模式打开文件,对文件只有写的权限。如果文件已经存在,文件指针将放在文件的末尾(即新写入内容会位于已有内容之后);反之,则会创建新文件。 | |
ab | 以二进制模式打开文件,并采用追加模式,对文件只有写权限。如果该文件已存在,文件指针位于文件末尾(新写入文件会位于已有内容之后);反之,则创建新文件。 | |
a+ | 以读写模式打开文件;如果文件存在,文件指针放在文件的末尾(新写入文件会位于已有内容之后);反之,则创建新文件。 | |
ab+ | 以读写模式打开文件,并采用追加模式,对文件具有读写权限,如果文件存在,则文件指针位于文件的末尾(新写入文件会位于已有内容之后);反之,则创建新文件。 |
- open()函数对象的常用属性
成功打开文件以后,可以调用文件对象本身拥有的属性获取当前文件的部分信息,常见属性为:- file.name:返回打开文件的名称
- file.mode:返回打开文件时,采用的文件打开格式
- file.enconding:返回打开文件时,采用 的文件打开的编码格式
- file.closed:判断文件是否已经关闭
file = open('1.txt', encoding='utf-8')
# print(file)
# 判断打开文件的名字
print(file.name)
# 输出打开文件是否关闭
print(file.closed)
# 输出打开文件的编码方式
print(file.encoding)
# 输出打开文件的格式
print(file.mode)
# 输出结果
1.txt
False
utf-8
r
注意:用open()函数打开的文件对象,必须手动进行关闭,Python垃圾回收机制无法自动回收打开的文件所占用的资源
2. 文件的关闭
- close()函数是专门用来关闭已经打开的文件的
- 语法格式: file.close()。其中 file 表示已打开的文件的对象
读者可能一直存在这样的疑问,即使用 open() 函数打开的文件,在操作完成之后,一定要调用 close() 函数将其关闭吗?答案是肯定的。文件在打开并操作完成之后,就应该及时关闭,否则程序的运行可能出现问题。
- 如果我们没有手动关闭文件的话,对文件进行删除会抛出错误
import os
file = open('1.txt', encoding='utf-8')
os.remove('1.txt')# # PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。: '1.txt'
os.remove()用于删除文件
- 如果我们手动将文件关闭,在对文件进行删除
import os
file = open('1.txt')
file.close()
os.remove('1.txt')
3. 文件的读取
- read()函数:逐个字节或字符读取文件中的内容
- readline()函数:逐行读取文件中的内容
- readlines()函数:一次性读取文件中多行内容
3.1 read()函数
对于借助open()函数,并以可读模式(r,r+,rb,rb+)打开的文件,可以调用read()函数逐个字节(逐个字符)读取文件中的内容
如果文件是以文本模式(非二进制模式)打开的,read()函数会逐个字符进行读取。如果文件是以二进制模式打开的,read()函数会逐个字节进行读取
read()函数基本语法:file.read([size])
- 其中:file 表示已经打开的文件对象,size 作为可选参数,用于指定一次最多读取的字符(字节)的个数,如果省略,则默认一次性地读取所有的内容
示例一:
file = open('1.txt')
f = file.read()
file.close()
print(f)
# Python
# http://www.xxx.com/
示例二:我们对size进行指定值
file = open('1.txt')
f = file.read(6)
file.close()
print(f)
# Python
# 采用二进制逐个字符的读取文件的内容
file = open('1.txt', 'rb')
f = file.read()
file.close()
print(f)
# b'Python\r\nhttp://www.xxx.com/'
3.2 readline()函数
和 read() 函数不同,readline()函数和readlines()函数都以“行”作为读取单位,即每次都读取目标文件中的一行。对于读取以文本格式打开的文件,读取一行很好理解;对于读取以二进制格式打开的文件,它们会以“\n”作为读取一行的标志。
- readline()函数用于读取文件中的行,包括 “ \n ”
- 语法:file.readline([size])
- 其中:file 作为文件对象,size 为可选参数,用于指定每一行,一次最多读取的字符(字节)数
和 read()一样,此函数成功读取文件数据的前提是,使用open()函数指定文件的打开模式为可读模式(r、r+、rb、rb+ 四种)
file = open('1.txt', encoding='utf-8')
f = file.readline()
file.close()
print(f) # Python学习
由于readline()函数在读取文件中一行内容的时候,会读取到最后的换行符“ \n ”,再加上print()函数输出时默认换行,所有输出的结果中会多看到一个换行
file = open('1.txt', 'rb+')
f = file.readline(6)
file.close()
print(f) # b'Python'
3.3 readlines()函数
readlines()函数读取文件中的所有行,它与调用不指定size参数的read()类似,只不过该函数返回字符串列表,其中每个元素为文件中的一行内容
和 readline()函数一样,readlines()函数在读取每一行内容时,会连同末尾的换行符一同读取
- readlines()的基本语法:
file.readlines()
其中,file 为打开的文件对象。和 read()、readline() 函数一样,它要求打开文件的模式必须为可读模式(包括 r、rb、r+、rb+ 4 种)。
file = open('1.txt', 'rb')
f = file.readlines()
file.close()
print(f)
# [b'Python\xe5\xad\xa6\xe4\xb9\xa0\r\n', b'http://www.xxx.com/']
file = open('1.txt', encoding='utf-8')
f = file.readlines()
file.close()
print(f)
# ['Python学习\n', 'http://www.xxx.com/']
4. 文件的写入
4.1 write()函数
python中的文件对象中提供了write()函数,可以向文件中写入指定内容
-
语法:file.write(string)
-
其中:file表示文件打开对象, string 表示要写入的字符串(或字节串,仅限于写入二进制文件中)
-
在使用write()写入文件时,需保证open()函数是以 r+、w、w+、a 或 a+ 的模式打开文件,否则会抛出 io.UnsupportedOperation 错误。
-
-
1.txt文件的内容如下:
Python学习
http://www.xxx.com/
file = open('1.txt', 'w', encoding='utf-8')
f = file.write('新写入的数据')
# 新写入的数据
file = open('1.txt', 'a', encoding='utf-8')
f = file.write('\n新写入的数据')
# Python学习
# http://www.xxx.com/
# 新写入的数据
注意:在写入文件之后,一定要使用close()函数将打开的文件关闭,否则写入的内容不会保存到打开的文件中。因为,在我们写入文件内容的时候,操作系统不会立刻把数据写入磁盘,而是先缓存起来(存放到缓冲区),只有调用close()函数时,操作系统才会把全部的数据写入到磁盘文件中。
4.2 writelines()函数
writelines()函数可以实现将字符串列表写入到文件中
注意:这里只有write()函数和 writelines()函数,而没有 writeline()函数
5 with…as… : 用法
5.1 with … as … 语句的导入
- 在任何一门编程语言中,文件的输入和输出,数据库的连接断开等,都是很常见的资源管理操作。但资源是有限的,在写程序的时候必须为保证这些资源在使用后得到释放,不然很容易造成资源泄露,轻者会使系统处理缓慢,重者会使系统崩溃。
- 在进行文件操作的时候,在文件打开最后一定要关闭文件,否则很容易造成意想不到的隐患。但是,即便使用了close()进行文件关闭操作,如果在打开文件或者打开文件的过程中抛出了异常,还是无法关闭文件。
- 在Python中,我们使用with … as … 语句操作上下文管理器,它能够帮助我们自动分配资源并且释放资源。
5.2 with … as …
- 使用 with … as … 操作已经打开的文件对象(本身就是上下文管理器),无论期间是否抛出异常,都能保证语句执行完以后,能够自动关闭已经打开的文件
- with as 语法:
-
with 表达式 [as target]:
代码块 - 我们向1.txt 中写入语句
with open('1.txt', 'a', encoding='utf-8') as f:
f.write('这是一句新的语句')
- 运行结果为
Python学习
http://www.xxx.com/
这是一句新的语句