目录
1. 打开与关闭文件
在对文件进行操作前,首先要打开文件,用到的是open()函数,open()函数有以下几个参数:
def open(
file: FileDescriptorOrPath, # 文件路径
mode: OpenTextMode = "r", # 文件读取的方式,默认为"r"
buffering: int = -1, # 文件的缓冲策略
encoding: str | None = None, # 文件的编码类型
errors: str | None = None, # 指定在编码/解码过程中遇到错误时的处理方式
newline: str | None = None, # 控制文本文件如何处理换行符
closefd: bool = True, # 指定在文件关闭时是否关闭文件描述符
opener: _Opener | None = None, # 自定义的文件打开器
)
在这些参数中,最常用的是"file" ,"mode"和"encoding"。其中file是文件路径,不必过多解释,剩下两个:
mode: OpenTextMode = "r"
- 一个字符串,表示打开文件的模式。默认值是 "r"(只读模式)。
- 常用模式包括:
"r"
: 只读"w"
: 写入(如果文件不存在会创建新文件,存在则清空文件内容)"a"
: 追加(写入内容会追加到文件末尾)"b"
: 二进制模式(可以与其他模式组合使用,如"rb"
,"wb"
,"ab"
)"t"
: 文本模式(默认,可以省略,常与其他模式组合使用,如"rt"
,"wt"
,"at"
)"x"
: 排他性创建(文件不存在则创建,存在则报错)
encoding: str | None = None
- 指定文件的编码类型,仅在文本模式下使用。常见的编码包括
"utf-8"
,"ascii"
,"latin-1"
等。- 默认值为
None
,表示使用系统默认编码。
使用open()函数的只读(r)模式打开文件时,如果该文件存在,会正常打开;如果文件不存在,程序会报错。
使用open()函数的写入(w)模式打开文件时,如果该文件存在,会正常打开;如果文件不存在,会先创建这个文件,再打开。
关闭文件使用的是close()函数,具体的使用且看下边的介绍。
有这样一个名为“稻城亚丁.txt”的文件:
我希望有个如你一般的人,如山间清爽的风,
如古城温暖的光,从清晨到夜晚,由山野到书房,
等待不怕岁月蹉跎,不怕路途遥远,只要最后,
是你就好,听闻远方有你,动身跋涉千里,
我吹过你吹过的风,这算不算相拥,我走过你走过的路,
这算不算相逢,我还是喜欢你,从一而终,认真且怂
打开与关闭文件:
# 打开或创建文件"稻城亚丁.txt"
f = open("稻城亚丁.txt", encoding="UTF-8")
# 关闭文件
f.close()
2. 文件的读取
读取文件时首先要以读(r)的方式打开文件:
file_path = "稻城亚丁.txt"
f = open(file_path, 'r', encoding="UTF-8")
然后使用read()等函数读取文件的内容:
# 读取文件的前10个字符
print(f"读取10个字节的结果:{f.read(10)}")
# 读取全部内容
print(f"读取全部内容的结果:{f.read()}")
# 读取文件的一行
line = f.readline()
print(f"line对象的内容是:{line}")
print(f"line对象的类型是:{type(line)}")
# 读取文件全部行,封装到列表中
lines = f.readlines()
print(f"lines对象的内容是:{lines}")
print(f"lines对象的类型是:{type(lines)}")
# 逐行读取文件的内容
for line in f:
print(line)
以上五种是比较普通的读取文件方式,如果尝试运行代码可能会发现两个问题:
1. 某些输出结果会有多余的空行。
2. 在连续read时,后一个read会接着前一个读取到的位置继续读取。
这里多余的空行是因为txt文件中本身就有换行符,在每一行的末尾相当于一个"\n",而python的print()函数在输出完后会自动添加一个换行符,所以造成了多余的空行。
至于第二个问题,可以联系C语言的指针来理解。在同一次文件打开后(f = open()),每个read读取完成相当于将指针指向了此次读取结果的末尾,下次再使用read时,会接着指针的位置继续读取。而且,在程序使用open()函数打开文件之后,该文件一直被程序占用,此时对文件进行删除、重命名和移动等操作都是不允许的。
由此引出文件的关闭函数close(),只需在处理完读取文件后,使用f.close()即可关闭文件,重置文件的指针。
为了避免在实际情况中忘记使用close()函数,Python提供了一种可以省去close()函数读取文件的方法:
with open("测试.txt", 'r', encoding="UTF-8") as f:
for line in f:
print(line)
在with open语句下执行的操作在完成后会自动调用close()函数关闭文件,防止忘记调用close()函数而长时间占用文件。
3. 文件的写入
文件的写入主要使用以下几个函数:
write() //写入
flush() //将缓冲区的内容写入到文件内
文件的写入使用的函数是write()。文件的写入有两种方式,当打开文件的方式是可写(w)时,以覆盖的形式写入文件;当打开文件的方式是追加时,以追加的方式写入文件。
在正式介绍写入之前,先讲一下write()函数在计算机中文件写如的流程。程序运行时write()函数会将文件写入到内存的缓冲区内,直到使用flush()函数或close()函数时,才将缓冲区内的内容写入到文件中。
下面是写入文件的具体流程:
file_path = "test.txt"
# 以覆盖的方式写入文件
f = open(file_path, "w", encoding = "UTF-8")
f.wirte("欢迎关注菜鸟不秃头!")
file_path = "test.txt"
# 以追加的方式写入文件
f = open(file_path, "a", encoding = "UTF-8")
f.wirte("\n一起成为大佬吧!")