python笔记-文件操作

一、文件

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 文件写入

  1. file.write(obj:str): 将字符串内容从光标位置开始写入
  2. file.writelines(iterable): 将可迭代对象中的每一个元素从光标位置开始写入文件,如果该元素不是 str 则报错

1.4 文件指针操作

  1. file.tell(): 返回光标位置

  2. file.seek(offset, whence=0): 文件指针的移动

    • offset: 值必须为一个整数,表示移动多少 字节 ,在utf-8字符集中汉字一般站3字节。
    whence 含义 解释
    0 从文件开始位置移动 文件头部
    1 从光标当前位置开始移动
    2 从文件末尾开始移动

1.5 文件读取

  1. file.read([size: int]): 读取文件内容
    • 返回字符串或二进制对象
size 含义
<0或 不写 读取文件全部内容
>=0 读取并返回size字符(文本模式), 或返回size字节(二进制模式)
  1. file.readline([size: int]): 从文件中读取一行, 保留换行符(" ")在末尾

    • size超过当前行字符数, 则只读取当前行
    • 返回字符串或二进制对象
  2. 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()
原文地址:https://www.cnblogs.com/duyupeng/p/13166133.html