Python3之文件(File)

本文介绍了Python3中open()方法的使用,包括打开文件、设置模式、参数详解以及如何关闭文件对象。强调了使用open()后务必调用close()方法确保文件关闭。还提到了File对象的各种常用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、open()方法

open()方法用于打开一个文件,返回文件对象。在对文件进行处理过程中,都需要用到这个函数,如果文件无法被打开,报OSError错误

注意:使用open()方法一定要记得关闭文件对象,即使用close()方法

语法:

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有如下参数:

模式描述
t文本模式 (默认)
x写模式,新建一个文件,如果该文件已存在则会报错
b二进制模式
+打开一个文件进行更新(可读可写)
U通用换行模式(Python 3 不支持)
r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+打开一个文件用于读写。文件指针将会放在文件的开头。
rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

注意:mode默认为文本模式,如果要以二进制模式打开,加上 b 。

二、File对象常用方法

File对象常用方法

方法描述举例
file.open()

open()方法用于打开文件,返回文件对象

filename = open(".\\file.txt" , "r")

只读方式打开当前目录下文件file.txt,返回一个文件对象

file.close()

close()方法用于关闭文件,关闭后文件不能再进行读写操作

filename.close()

关闭文件filename

file.flush()

flush()用来把文件从内存buffer(缓冲区)中强制刷新到硬盘中,同时清空缓冲区。

一般情况下,文件关闭后会自动刷新到硬盘中,但有时需要在关闭前刷新到硬盘中,可以使用 flush() 方法

语法:fileobject.flush()

参数:无

返回值:无

# 1、flush()用来把文件从内存buffer(缓冲区)中强制刷新到硬盘中,同时清空缓冲区
# 创建一个文件
filename = open(".\\file.txt" , 'w+' , encoding='utf-8')
# 文件里写入内容
filename.write("科比,你好")
# 文件从内存buffer(缓冲区)中强制刷新到硬盘中,同时清空缓冲区
filename.flush()
filename = open(".\\file.txt" , 'a+' , encoding='utf-8')
# 指针定位到文件开始位置
filename.seek(0 , 0)
# 读取文件内容,返回一个字符串
strA = filename.read()
print("文件内容为:" , strA)
# 关闭文件
filename.close()
文件内容为: 科比,你好

 

file.fileno()

fileno()方法返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上

语法:fileObject.fileno()

参数:无

返回值:返回文件描述符

 

# 2、fileno()方法返回一个整型的文件描述符(file descriptor FD 整型)
# 创建一个文件
file = open(".\\file.txt" , 'r')
# 输出文件路径
filepath = file.name
print("文件名为:" , filepath)
# 输出文件描述符
fid = file.fileno()
print("文件描述符为:" , fid)
# 关闭文件
file.close()
文件名为: .\file.txt
文件描述符为: 3

 

file.isatty()

 

file.isatty()方法,如果文件连接到一个终端设备返回 True,否则返回 False

语法:file.isatty()

参数:无

返回值:如果连接到一个终端设备,返回 True,否则返回 False

# 3、file.isatty()方法,如果文件连接到一个终端设备返回 True,否则返回 False
# 创建一个文件
file = open(".\\file.txt" , 'r')
# 输出文件路径
filepath = file.name
print("文件名为:" , filepath)
# file.isatty()方法
fileisatty = file.isatty()
print("file.isatty()方法:" , fileisatty)
# 关闭文件
file.close()
文件名为: .\file.txt
file.isatty()方法: False

 

file.next()

file.next() 方法在文件使用迭代器时会使用到,在循环中,next()方法会在每次循环中调用,该方法返回文件的下一行,如果到达结尾(EOF),则触发 StopIteration

Python 3 中的 File 对象已不支持 next() 方法

语法:file.next()

参数:无

返回值:返回文件的下一行

Python2.0:

# 4、file.next() 方法返回文件的下一行内容
# 打开文件
file = open(".\\file.txt", "r+")
print("文件名为: ", file.name)
for index in range(5):
    line = file.next()
    print("第 %d 行 - %s" % (index, line))
# 关闭文件
file.close()
第 0 行 - 科比,你好

 

file.read(size)

file.read(size)从文件读取指定的字节数,如果未给定或为负则读取所有

语法:file.read(size)

参数:

size - 从文件中读取的字节数

返回值:

返回从字符串中读取的字节

# 5、file.read() 方法用于从文件读取指定的字节数,如果未给定或为负则读取所有
# 打开文件
file = open(".\\file.txt", "r+" , encoding='utf-8')
print("文件名为: ", file.name)
# 读取文件内容
print("文件内容为:" , file.read(5))
# 关闭文件
file.close()
文件名为:  .\file.txt
文件内容为: 科比,你好

 

file.readline(size)

file.readline(size)用于读取整行文件,包括 "\n" 字符。如果指定了一个非负数的参数,则返回指定大小的字节数,包括 "\n" 字符

语法:file.readline(size)

参数:

size - 从文件中读取的字节数

返回值:返回从字符串中读取的字节

# 6、file.readline(size)用于读取整行文件,包括 "\n" 字符
file = open(".\\file.txt" , 'r' , encoding='utf-8')
strA = file.readline(2)
print("file.txt文件内容为:" , strA)
file.close()
file.txt文件内容为: 科比

 

file.readlines(sizeint)

file.readlines(size) 方法用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for... in ... 结构进行处理,

如果碰到结束符 EOF 则返回空字符串

语法:file.readlines(size)

参数:

size - 读取文件的大小,如果size大于缓冲区的大小,则读取缓冲区大小的数据;如果size小于缓冲区的大小,读取size大小的数据,但不是完全的等于size的大小,一般读取比size大的整行的数据

返回值:返回列表,包含所有的行

# 7、file.readlines(size)用于读取整行文件,包括 "\n" 字符
file = open(".\\file.txt" , 'r' , encoding='utf-8')
# 使用for...in...循环遍历文件内容
for line in file.readlines():
    print("file.txt文件内容为:" , line) # 包含了每行末尾的转义字符\n
file.close()
file.txt文件内容为: 科比,你好

file.txt文件内容为: 再见,曼巴

file.txt文件内容为: 再见,青春

 

file.seek(offset , whence)

file.seek(offset , whence)方法用于移动文件读取指针到指定位置

语法:file.seek(offset , whence)

参数:

  • offset -- 开始的偏移量,即需要移动偏移的字节数

  • whence:可选,默认值为 0。0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起

返回值:

如果操作成功,则返回新的文件位置,如果操作失败,则函数返回 -1

# 8、file.seek(offset , whence)方法用于移动文件读取指针到指定位置
# 打开模式为w+,指针位于文件开头
file = open(".\\file.txt" , 'r+' , encoding='utf-8')
# 输出指针当前位置
print("指针当前默认位置为:" , file.tell())
# 设置指针位置为文件末尾
file.seek(0 , 2)
# 换行
file.write("\n")
# 文件写入内容
file.write("曼巴,再见")
print("指针当前位置为:" , file.tell())
file.close()
指针当前默认位置为: 0
指针当前位置为: 49

 

file.tell()

file.tell()方法返回文件指针当前位置

语法:file.tell()

参数:无

返回值:

文件指针当前位置

# 9、file.tell()方法返回文件指针当前位置
# 打开模式为w+,指针位于文件开头
file = open(".\\file.txt" , 'r+' , encoding='utf-8')
# 输出指针当前位置
print("指针当前默认位置为:" , file.tell())
# 设置指针位置为文件末尾
file.seek(0 , 2)
print("指针当前位置为:" , file.tell())
file.close()
指针当前默认位置为: 0
指针当前位置为: 32

 

file.truncate(size)

file.truncate(size)方法从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 windows 系统下的换行代表2个字符大小

语法:

file.truncate(size)

参数:

size - 可选,如果存在则文件截断为 size 字节

返回值:无

注意:截断操作不改变文件指针位置

# 10、file.truncate(size)用于截断文件内容,size限定了截断的字节数量
file = open(".\\file.txt" , "r+" , encoding="utf-8")
# 截断前文件内容
print("截断前文件内容:" , file.read()) # read()整个文件后,指针位于文件最后一行末尾
print("截断前文件指针:" , file.tell())
# 截断文件内容,截断操作不改变文件指针位置
file.truncate(18)
print("截断后文件指针:" , file.tell())
# 指针重置文件开头
file.seek(0 , 0)
print("截断后文件内容:" , file.read())
file.close()
截断前文件内容: 1:www.runoob.com
1:www.runoob.com
截断前文件指针: 34
截断后文件指针: 34
截断后文件内容: 1:www.runoob.com

 

file.write(str)

file.write(str)方法用于向文件中写入指定字符串。在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,此时文件内无法看到写入的内容;

如果文件打开模式带 b,那写入文件内容时,str (参数)要用 encode 方法转为 bytes 形式,否则报错:TypeError: a bytes-like object is required, not 'str',即str.encode("utf-8");读取文件内容时,要用decode方法将bytes形式转换为str,即str.decode("utf-8");

语法:

file.write(str)

参数:

str - 要写入文件的字符串

返回值:返回的是写入文件的字符长度

# 11、file.write(str)用于向文件内写入字符串内容
file = open(".\\file.txt" , "rb+" )
# 读取写入前文件内容,读取完毕后指针置于文件最后一行末尾
# 文件打开模式带 b,读取文件内容时,bytes 结果要用 decode 方法转为 str 形式
print("写入前文件内容:" , file.read().decode("utf-8"))
strA = "你好,科比"
# 换行
file.write("\n".encode("utf-8"))
# 文件打开模式带 b,写入文件内容时,str (参数)要用 encode 方法转为 bytes 形式
file.write(strA.encode("utf-8"))
# 此时文件指针处于文件最后一行末尾,无法读取文件内容,需将指针设置到文件最开始位置
file.seek(0 , 0)
print("写入后文件内容:" , file.read().decode("utf-8"))
file.close()
写入前文件内容: 你好,科比
再见,曼巴
写入后文件内容: 你好,科比
再见,曼巴
你好,科比

 

file.writelines(sequence)

file.writelines(sequence)方法用于向文件内写入一个序列的字符串列表,这一序列字符串可以是由迭代对象产生的,如一个字符串列表,如果需要换行则要自己加入每行的换行符

语法:

file.writelines(seq)

参数:

seq - 要写入文件的字符串序列

返回值:无

# 12、file.writelines(sequence)方法用于向文件内写入一个序列的字符串列表
file = open(".\\file.txt" , "a+" , encoding="utf-8")
# 读取写入前文件内容,读取完毕后指针置于文件最后一行末尾
print("写入前文件内容:" , file.read())
listA = ["窗前明月光" , "疑是地上霜" , "举头邀明月" , "低头思故乡"]
# 换行
file.write("\n")
# 列表转换为str
strA = str(listA)
print("listA列表转换为字符串strA:" , strA)
file.writelines(strA)
# 此时文件指针处于文件最后一行末尾,无法读取文件内容,需将指针设置到文件最开始位置
file.seek(0 , 0)
print("写入后文件内容:" , file.read())
file.close()
写入前文件内容: 
listA列表转换为字符串strA: ['窗前明月光', '疑是地上霜', '举头邀明月', '低头思故乡']
写入后文件内容: 再见,曼巴
再见,科比
['窗前明月光', '疑是地上霜', '举头邀明月', '低头思故乡']

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值