open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
f = open('c:/users/jiao1/test.txt')
print(f)
Out:
<_io.TextIOWrapper name='c:/users/jiao1/test.txt' mode='r' encoding='cp65001'>
# windows 11 Python Jupyter Notebook 环境
# windows 中使用 codepage 代码页,可以认为每一个代码页就是一张编码表
# windows 11 默认使用的编码表是 cp65001
# windows 10 默认使用的编码表是 cp936,等同于 GBK
# Linux 中默认使用的是 utf-8
可以使用绝对路径和相对路径,默认是当前路径。
r 模式
只读打开文件,如果使用 write 方法,会抛异常
如果文件不存在,抛出 FileNotFoundError 异常
w 模式
表示只写方式打开,如果读取则抛出异常
如果文件不存在,则直接创建文件
如果文件存在,则清空文件内容
x 模式
文件不存在,创建文件,并只写方式打开
文件存在,抛出 FileExistsError 异常
a 模式
文件存在,只写打开,追加内容
文件不存在,则创建后,只写打开,追加内容
文本模式 t
字符流,将文件的字节按照某种字符编码理解,按照字符操作。open 的默认 mode 就是 rt
二进制模式 b
字节流,将文件就按照字节理解,与字符编码无关。二进制模式操作时,字节操作使用 bytes 类型
+ 模式
为 r w a x 提供缺失的读或者写功能,但是,获取文件对象依旧按照 r w a x 自己的特征
+ 模式不能单独使用,可以认为它时为前面的模式字符做增强功能的
-1 表示 使用缺省大小 的 buffer。
如果是二进制模式,使用 io.DEFAULT_BUFFER_SIZE 值,默认是 4096 或者 8192 bytes。
如果是文本模式,如果是终端设备,是行缓存方式,如果不是,则使用二进制模式的策略。
0,只在二进制模式使用,表示关 buffer
1,只在文本模式使用,表示使用行缓冲,意思就是见到 换行符 就 flush
大于1,用于指定 buffer 的大小
buffer 缓冲区是一个内存空间,一般来说是一个 FIFO 队列,到缓冲区满了或者达到阈值,数据才会 flush 到磁盘
flush() 将缓冲区数据写入磁盘
close() 关闭前会调用 flush()
import io
print(io.DEFAULT_BUFFER_SIZE)
# 8192
f = open('test.txt', 'wt+')
f.write('a\rb\nc\r\nd')
f.seek(0, 0), f.read(), f.close()
Out:
(0, 'a\nb\nc\n\nd', None)
newlines = [None, '', '\n', '\r\n']
for n1 in newlines:
f = open('test.txt', 'r+', newline=n1)
print(f.readlines())
f.close()
Out:
['a\n', 'b\n', 'c\n', '\n', 'd'] # 常见换行符都替换为\n
['a\r', 'b\r\n', 'c\r', '\r\n', 'd'] # ’‘表示什么都不做
['a\rb\r\n', 'c\r\r\n', 'd'] # \n 作为换行符
['a\rb\r\n', 'c\r\r\n', 'd'] # \r\n 作为换行符
关闭文件描述符, True 表示关闭它。False 会在文件关闭后保持这个描述符。可以使用 fileobj.fileno()
查看。
f = open('test.txt', 'wt+')
f.fileno(), f.close()
Out:
(5, None)
read(size=-1)
# size 表示读取的多少个字符或字节;负数或者 None 表示读取到 EOF
readline(size=-1)
# 一行行读取文件内容。size 设置一次能读取行内几个字符或字节
readlines(hint=-1)
# 读取多有行的列表。指定 hint 则返回指定的行数
write(s) # 把字符串 s 写入到文件中并返回字符的个数
writelines(lines) # 将字符串列表写入文件
flush 并关闭文件对象
文件已经关闭,再次关闭没有任何效果
文件指针,指向当前字节位置。
mode=r 指针起始在 0
mode=a 指针起始在 EOF
tell() 显示指针当前位置
seek(offset[,whence]) 移动文件指针位置, offset 偏移多少字节, whence 从哪里开始
文本模式下:
1 whence 0 缺省值,表示从头开始,offset 只能正整数
2 whence 1 表示从当前位置, offset 只能接受 0
3 whence 2 表示从 EOF 开始,offset 只能接受 0
文本模式支持从开头向后偏移的方式
1 whence 为 1,相当于原地不动,所以没什么用
2 whence 为 2,相当于移动文件指针到 EOF
seek 是按照字节偏移的
read 在文本模式是按照字节读取的
二进制模式下:
1 whence 0 缺省值,表示从头开始,offset 只能正整数
2 whence 1 表示从当前位置, offset 可正可负
3 whence 2 表示从 EOF 开始,offset 可正可负
二进制模式支持任意起点的偏移,从头/从尾/从中间位置开始
向后 seek 可以超界,但是向前 seek 的时候,不能超界,否则抛异常
with...as...
关键字with
语句块执行完的时候,会自动关闭文件对象# Linux 建议使用 pyenv Python多个版本管理器
# utf-8 一个汉字占三个字节
# cp936 code page 936 可以理解为 gbk 编码表
# Linux 默认编码 utf-8
# Windows 10 默认编码 GBK
# Windows 11 默认编码 utf-8
# w 只写模式 一定会从一张白纸开始写
# r 只读模式
# x 要求文件不存在,即创建一个全新文件,只写模式
# a 只写模式,追加模式;如果文件不存在,会创建文件(EOF 追加写)
# 二进制一定要考虑编码格式
# ascii 0 和 str 0 注意区别
# 二进制模式只认字节,注意和文本模式的区别
# seek 是按照字节来进行的,文本模式慎用 seek
# seek 左边界不可超,右边界可以超
# seek 和 read 操作 可以导致内存中的数据写入到磁盘
# seek 和 tell 操作 都是和字节相关的,与字符无关
# buffer 其实更像一个队列 Queue 缓冲区 FIFO
# cache 解决反复查询/解决重复计算
# rb+ buffering=0
# \x00 == ascii 0 == NUL , print 无法显示
# 磁盘适合一批批处理数据,不能一个个进行处理
# buffering=0 只能二进制
# buffering=1 文本模式,行缓冲,遇到换行符(\n)写入数据(二进制也能使用,但是没啥用)
# buffering>1 文本模式下 和缓冲区大小有关系,与进行的buffering值没关系
# buffering>1 二进制模式下 buffering的值就是缓冲区大小
# 二进制模式和编码无关,文本模式时一定要注意编码