1、特性
Python读取文件主要使用open()这个函数,它会返回一个File对象,通过这个对象就可以实现文件对象的读写等操作。
2、读取文件关键函数open()
该函数包含多个参数:
一般常用的两个参数如下:
open(file, mode=‘r’)
参数说明:
- file:文件路径(eg:D:\test.txt),必填;
- mode:文件打开模式(eg:r,w等),选填。
完整的参数如下:
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:选填,可以通过传递可调用的打开器来使用自定义打开器。 然后,通过使用(file, flags)调用opener来获取文件对象的基础文件描述符。 开启程序必须返回一个打开的文件描述符(传递os.open,因为开启程序导致的功能类似于传递“无”)。
可用的mode如下:官方链接
模式 | 描述 | 直译 |
‘r’ | open for reading (default) | 以只读方式打开文件。文件的指针将会放在文件的开头。(默认模式)。 |
‘w’ | open for writing, truncating the file first | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
‘x’ | open for exclusive creation, failing if the file already exists | 写模式,新建一个文件,如果该文件已存在则会报错。 |
‘a’ | open for writing, appending to the end of the file if it exists | 打开一个文件进行写操作。如果该文件已存在,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
‘b’ | binary mode | 二进制模式 |
‘t’ | text mode (default) | 文本模式 |
‘+’ | open for updating (reading and writing) | 打开一个文件进行更新(可读可写)。 |
默认模式为 ‘r’ (打开用于读取文本,与 ‘rt’ 同义)。 模式 ‘w+’ 与 ‘w+b’ 将打开文件并清空内容。 模式 ‘r+’ 与 ‘r+b’ 将打开文件并不清空内容。
3、File对象常用的函数
序号 | 函数名 | 描述 |
1 | file.close() | 关闭文件。关闭后文件不能再进行读写操作。 |
2 | file.flush() | 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
3 | file.fileno() | 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 |
4 | file.isatty() | 如果文件连接到一个终端设备返回 True,否则返回 False。 |
5 | file.read([size]) | 从文件读取指定的字节数,如果未给定或为负则读取所有。 |
6 | file.readline([size]) | 读取整行,包括 “\n” 字符。 |
7 | file.readlines([sizeint]) | 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。 |
8 | file.seek(offset[, whence]) | 移动文件读取指针到指定位置 |
9 | file.tell() | 返回文件当前位置。 |
10 | file.truncate([size]) | 从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。 |
11 | file.write(str) | 将字符串写入文件,返回的是写入的字符长度。 |
12 | file.writelines(sequence) | 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。 |
4、案例
准备一个具体的文件:D:\python_workplace\venv\test.txt,文件内容如下:
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
现有一个需求:为诗句添加标题和作者信息。
file2 = open("D:\\python_workplace\\venv\\test.txt", "r+", encoding='utf-8')
print("======读取文本原始内容:开始======")
# 读取所有行
list = file2.readlines()
for t in list:
print(t)
print("======读取文本原始内容:结束======\r\n")
print("======基础函数调用:开始======")
print("文件指针初始位置:", file2.tell())
# 这个方法个人理解是文件有没有被其他设备占用
print("是否连接到终端设备:", file2.isatty())
# 读取第一行的前两个字符
line2 = file2.readline(2)
print("读取第一行指定数量的字符:", line2)
print("文件指针当前位置:", file2.tell())
# 执行文件截断 mode 需要设置可读写状态,因为会直接取操作文件中的字符
# file2.truncate(2)
print("======基础函数调用:结束======\r\n")
print("======执行写入内容:开始======")
"""
1、案例:为诗句添加标题和作者信息。
指针位置放到文件首,因为我们要在文件首的位置插入标题和作者信息 。
特别注意:mode用的是r+ (打开一个文件用于读写。文件指针将会放在文件的开头。原文本内容不会被清空,但是会覆盖写入位置的内容)
"""
# 指针放到文件首
file2.seek(0, 0)
print("文件指针当前位置:", file2.tell())
# 读取旧文本内容
old = file2.read()
# 指针放到文件首
file2.seek(0, 0)
print("文件指针当前位置:", file2.tell())
# 插入标题
file2.write("《静夜思》\n")
# 插入作者信息
file2.writelines(['作者', ':', "李白", ' _写于唐朝年间\r\n'])
# 回填旧文本内容
file2.write(old)
# 关闭缓冲
file2.flush()
# 关闭文件
file2.close()
print("======执行写入内容:结束======\r\n")
print("======读取最新内容:开始======")
file3 = open("D:\\python_workplace\\venv\\test.txt", "r+", encoding='utf-8')
# 读取所有行
list2 = file3.readlines()
for t in list2:
print(t)
file3.flush()
file3.close()
print("======读取最新内容:结束======")
案例中夹杂了一些基础的函数操作,如读写操作等。
输出结果:
======读取文本原始内容:开始======
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
======读取文本原始内容:结束======
======基础函数调用:开始======
文件指针初始位置: 78
是否连接到终端设备: False
读取第一行指定数量的字符:
文件指针当前位置: 78
======基础函数调用:结束======
======执行写入内容:开始======
文件指针当前位置: 0
文件指针当前位置: 0
======执行写入内容:结束======
======读取最新内容:开始======
《静夜思》
作者:李白 _写于唐朝年间
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
======读取最新内容:结束======
D:\python_workplace\venv\test.txt,文件内容已经改变,如下:
《静夜思》
作者:李白 _写于唐朝年间
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
5、总结:
open函数的模式有很多种,mode的取值可以进行一些特定的组合;
覆盖写入和非覆盖写入对应的mode都不同,实际使用要注意查看手册;
处理中文字符串文本时编码格式需要统一,一般使用"utf-8"进行 处理,不然会报错;
文件操作完成记得关闭。