在Python 中,对文件的操作有很多种,常见的操作包括创建、删除、修改权限、读取、写入等。
一、open()函数
在 Python 中,如果想要操作文件,首先需要创建或者打开指定的文件,并创建一个文件对象,而这些工作可以通过内置的 open() 函数实现。
open() 函数:用于打开一个文件,并返回文件对象。如果该文件无法被打开,会抛出 OSError。
该函数常用形式是接收两个参数:文件名(file)和模式(mode)。
open(file, mode=‘r’)
该函数的完整语法格式如下:
fileObj = open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明:
- file: 必需,文件路径(相对或者绝对路径)。
- mode: 可选,文件打开模式
- buffering: 设置缓冲
- encoding: 一般使用utf8
- errors: 报错级别
- newline: 区分换行符
- closefd: 传入的file参数类型
- opener: 设置自定义开启器,开启器的返回值必须是一个打开的文件描述符。
mode 参数:
文件打开模式值如下(文件打开模式,直接决定了后续可以对文件做哪些操作
):
文件的操作一般分为以下 3 步:
- 打开文件:使用 open() 函数,该函数会返回一个文件对象;
- 对已打开文件做读/写操作。
- 关闭文件:完成对文件的读/写操作之后,最后需要关闭文件,可以使用 close() 函数。
注意:使用 open() 方法打开的文件,使用完之后一定要关闭文件。
示例代码如下:
try:
file = open("a.txt", encoding="utf-8")
print(file)
except:
raise
finally:
file.close()
1、默认方式打开文件
当以默认模式打开文件时,默认使用 r 权限,由于该权限要求打开的文件必须存在,否则会报错:FileNotFoundError。
示例代码如下:
# 当前程序文件同目录下没有 a.txt 文件
file = open("a.txt")
print(file)
在程序文件同目录下,手动创建一个 a.txt 文件,并再次运行该程序,就ok了。
2、指定编码
使用 open() 打开文件时,不同平台的 ecoding 默认参数值也不同。可以手动指定打开文件的编码格式。
file = open("a.txt", encoding="utf-8")
print(file) # <_io.TextIOWrapper name='a.txt' mode='r' encoding='utf-8'>
注意:
手动修改 encoding 参数的值,仅限于文件以文本的形式打开。如果是以二进制格式打开时,不能对 encoding 参数的值做任何修改,否则程序会抛出 ValueError 异常。
3、open()文件对象常用的属性
成功打开文件之后,可以调用文件对象本身拥有的属性获取当前文件的部分信息。
其常见的属性为:
- file.name:返回文件的名称;
- file.mode:返回打开文件时,采用的文件打开模式;
- file.encoding:返回打开文件时使用的编码格式;
- file.closed:判断文件是否己经关闭。
示例代码如下:
# 以默认方式打开文件
f = open('a.txt')
# 输出文件是否已经关闭
print(f.closed) # False
# 输出访问模式
print(f.mode) # r
#输出编码格式
print(f.encoding) # win下:cp936 相当于GBK
# 输出文件名
print(f.name) # a.txt
二、file 对象
file 对象使用 open 函数来创建,常用的函数如下:
1、关闭已打开文件
close() 函数:专门用来关闭已打开文件的对象。
该语法的基本格式如下:
file.close()
file = open("a.txt", encoding="utf-8")
print(file)
file.close()
2、读取文件中的数据
读取文件数据操作时,需要保证使用 open() 函数是可读模式打开文件(包括 r、rb、r+、rb+ 4 种),否则会抛出 io.UnsupportedOperation 错误。
Python 提供了如下 3 种函数,它们都可以帮我们实现读取文件中数据的操作:
- read() 函数:逐个字节或者字符读取文件中的内容;
- readline() 函数:逐行读取文件中的内容,包含最后的换行符“\n”。
- readlines() 函数:一次性读取文件中所有行内容,包含同行尾的换行符“\n”。
(1)read() 函数示例
# 以 utf-8 的编码格式打开指定文件
f = open("a.txt", encoding="utf-8")
# 输出读取到的数据
print(f.read())
# print(f.read(2)) # size参数:用于指定一次最多可读取的字符(字节)个数。默认不写表示读取一次性读取所有内容。
# 关闭文件
f.close()
(2)readline() 函数示例
# 以 utf-8 的编码格式打开指定文件
f = open("a.txt", encoding="utf-8")
# 读取一行数据
con = f.readline() # abc
print(con)
# 关闭文件
f.close()
(3)readlines() 函数示例
# 以 utf-8 的编码格式打开指定文件
f = open("a.txt", encoding="utf-8")
# 读取一行数据
con = f.readlines()
print(con) # ['abc\n', ' q\n', '1231']
# 关闭文件
f.close()
3、向文件中写入数据
向文件中写入数据操作时,需要保证使用 open() 函数是以可写模式打开文件(包括 r+、w、w+、a 或 a+ 的模式),否则会抛出 io.UnsupportedOperation 错误。
Python 提供了下面 2 种函数:
- write() 函数:可以向文件中写入指定内容。
- writelines() 函数:可以实现将字符串列表写入文件中。
(1)write() 函数示例
# 以 utf-8 的编码格式打开指定文件
f = open("a.txt", 'w', encoding="utf-8")
# w:清空原内容,写入一行数据
f.write("写入一行数据wwww")
f.flush()
# 关闭文件
f.close()
flush() 函数:
它可以实现将缓冲区的数据写入文件中。
(2)writelines() 函数示例
f = open("a.txt", 'w', encoding="utf-8")
list = ['abc\n', ' q\n', '1231']
list.append("\t写入字符串列表数据") # ['abc\n', ' q\n', '1231', '\t写入字符串列表数据']
print(list)
# 写入字符串列表数据
f.writelines(list)
f.flush()
# 关闭文件
f.close()
4、文件指针
文件指针用于标明文件读写的起始位置。
使用 open() 函数打开文件并读取文件中的内容时,总是会从文件的第一个字符(字节)开始读起。
注意:
当向文件中写入数据时,如果不是文件的尾部,写入位置的原有数据不会自行向后移动,新写入的数据会将文件中处于该位置的数据直接覆盖掉。
Python file对象提供了 tell() 函数和 seek() 函数。
- tell() 函数:用于判断文件指针当前所处的位置。
- seek() 函数:用于移动文件指针到文件的指定位置。
(1)tell() 函数示例
f = open("a.txt", 'r', encoding="utf-8")
print(f.tell()) # 0
print(f.read(2)) # ab
print(f.tell()) # 2
(2)seek() 函数示例
该函数的语法格式如下:
file.seek(offset[, whence])
- whence:作为可选参数,用于指定文件指针要放置的位置,该参数的参数值有 3 个选择:0 代表文件头(默认值)、1 代表当前位置、2 代表文件尾。
- offset:表示相对于 whence 位置文件指针的偏移量,正数表示向后偏移,负数表示向前偏移。
f = open("a.txt", 'r', encoding="utf-8")
# 将文件指针从文件开头,向后移动到 5 个字符的位置
f.seek(2)
print(f.tell()) # 2
print(f.read(2)) # c
f.close()
三、with as语句
1、with as语句
在 Python 中,使用 with as 语句操作上下文管理器(context manager),它能够帮助我们自动分配并且释放资源。
with 语句用于异常处理时,可以理解为封装了 try…except…finally 编码范式,简化了文件流等公共资源的管理。使得代码更清晰、更具可读性。
该语句的基本语法格式为:
with 表达式 [as target]:
代码块
- 表达式:需要操作的对象。比如:open() 方法打开的文件
- target 参数用于指定一个变量,该语句会将 expression 指定的结果保存到该变量中。
- with as 语句中的代码块如果不想执行任何语句,可以直接使用 pass 语句代替。
示例代码如下:
with open('a.txt', 'a', encoding="utf-8") as f:
f.write(" with as语句操作")
– 求知若饥,虚心若愚。