一、文件
1.1 文件打开与读写
文件打开要先在硬盘中寻找到要打开的文件,然后完整的映射到内存中,读取操作会在内存中完成。当文件要写入时,会先将数据写在内存的和缓冲区里面,在对缓冲区进行刷新时才会写入硬盘文件。
1.2 打开文件(内置函数open()
)
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
-
file
: 可以是要打开文件的路径, 也可以是被封装的整数类型文件描述符 -
mode
: 可选字符串, 用于指定打开文件的模式
模式(mode) | 含义 | 解释 |
---|---|---|
"r" | 以只读方式打开文件 | 默认值 |
"w" | 以只写方式打开文件 | 文件存在则打开, 不存在则创建 |
"a" | 以追加内容方式打开文件 | 文件存在则打开, 不存在则船舰 |
"x" | 排他性创建文件 | 文件存在这报错, 不存在则创建文件 |
buffering
: 是一个可选的整数,用于设置缓冲策略
buffering | 含义 | 解释 |
---|---|---|
0 |
关闭缓冲 | 仅允许在二进制模式下 |
1 |
行缓冲 | 仅在文本模式下可用 |
>1 |
固定大小的块缓冲区 | 以字节为单位 |
-
encoding
: 是用于解码或编码文件的编码的名称。 只在文本模式下使用; 默认编码是依赖于平台(locale.getpreferredencoding()
返回值), 但可以使用任何Python支持的text encoding
. -
errors
是一个可选的字符串参数, 用于指定如何处理编码和解码错误, 不能在二进制模式下使用
errors | 含义 | 解释 |
---|---|---|
'strict' | 如果存在编码错误, 会引发 ValueError 异常 | 与默认值None相似 |
'ignore' | 忽略错误 | 可能会导致数据丢失 |
'replace' | 会将替换标记插入有错误数据的地方 | |
'surrogateescape' | ||
'xmlcharrefreplace' | 编码不支持的字符将替换为相应的XML字符引用 &#nnn; |
只有在写入文件时才支持 |
'backslashreplace' | 用Python的反向转义序列替换格式错误的数据 | |
'namereplace' | 用 N{...} 转义序列替换不支持的字符 |
-
newline
: 控制universal newlines
模式如何生效(它仅适用于文本模式)。它可以是 None,'',' ',' ' 和 ' '。 -
closefd
: 文件关闭时,底层文件描述符的状态
1.closefd=False
且给出了文件描述符: 底层文件描述符保持打开
2. 给出文件名且closefd=True
, 否则会报错 -
opener
: 可调用的自定义开启器, 必须返回一个打开的文件描述符 -
新创建的文件是 不可继承的。
1.3 文件写入
file.write(obj:str)
: 将字符串内容从光标位置开始写入file.writelines(iterable)
: 将可迭代对象中的每一个元素从光标位置开始写入文件,如果该元素不是str
则报错
1.4 文件指针操作
-
file.tell()
: 返回光标位置 -
file.seek(offset, whence=0)
: 文件指针的移动offset
: 值必须为一个整数,表示移动多少 字节 ,在utf-8字符集中汉字一般站3字节。
whence 含义 解释 0
从文件开始位置移动 文件头部 1
从光标当前位置开始移动 2
从文件末尾开始移动
1.5 文件读取
file.read([size: int])
: 读取文件内容- 返回字符串或二进制对象
size | 含义 |
---|---|
<0 或 不写 |
读取文件全部内容 |
>=0 |
读取并返回size字符(文本模式), 或返回size字节(二进制模式) |
-
file.readline([size: int])
: 从文件中读取一行, 保留换行符(" ")在末尾- size超过当前行字符数, 则只读取当前行
- 返回字符串或二进制对象
-
file.readlines([size: int])
: 从文件中读取多行, 并将每一行数据保留在列表中size
: 如果超过当前行剩余字符, 读取下一行
1.6 文件自动管理
语法:with open(_file_path:str, _mode:str) as file:
使用 with 管理文件,在文件处理的代码执行完之后会自动关闭文件
1.7 文件关闭(file.close()
)
1.8 缓冲区刷新(file.flush()
)
二、io流
在需要短时间读取大量数据时,我们直接在内存中读取性能会比较好. io
模块中实现这一操作
io
对象的方法和文件方法是一致的.
import io
sio = io.StringIO() # 创建字符io
sio.write('我是字符串io') # 写入字符io
print(sio.getvalue()) # 读取字符io
sio.close()
bio = io.BytesIO() # 创建字节io
bio.write('hello world'.encode()) # 写入字节io
print(bio.getvalue().decode()) # 获取字节io
bio.close()