- open函数参数解析
- mode 打开模式
- buffering 缓冲区
- 什么是缓冲区?
- 如何查看系统默认缓冲区大小?
- 为什么默认缓冲区是4K?
- 测试缓冲区
- 如何修改缓冲区?
-
- encoding 编码格式
- errors 报错级别 不能用于binary mode
- newline 设置换行符, 默认为none
- 不同操作系统换行符不统一
- 使用newline
- 文件方法调用
- read 读文件
- readline 读一行
- readlines
- write 写文件
- writelines 把可迭代对象写入文件
- flush
- tell
- readable
- writeable
- isatty
- seek
- fileno
open函数参数解析
- open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
- file : 一个包含了你要访问的文件名称的字符串值。
mode 打开模式
决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。默认文件访问模式为只读(r)。
buffering 缓冲区
设置文件缓冲区大小,默认值为系统默认缓冲区大小。open 函数对文件 buffer 的设置是对系统调用的封装,并不是 Python 本身实现的,而是系统 API 中早已提供的
什么是缓冲区?
- 因为磁盘的IO是很耗时的,设置缓冲区为了减少IO读写次数。例如每次向磁盘写入1kb字符,如果缓冲区大小大于1kb,这个时候不会立刻写入磁盘,而是等缓冲区满了之后再次写入。
- 如果一次写入内容大于缓冲区大小,则会立即写入。如果不 close,或者不提前用 flush 是不会刷入硬盘的
如何查看系统默认缓冲区大小?
在多数系统里面,默认缓冲区大小为4094(4k),8192(8k)。
import
为什么默认缓冲区是4K?
操作系统通常系统有一个磁盘最小读写单位,逻辑块(block),linux里面是4k。 e.g: ```shell script sudo /sbin/tune2fs -l /dev/nvme0n1p2 First block: 0 Block size: 4096
### 测试缓冲区
这个例子将缓冲区修改为2,这样每次都会去写磁盘,造成效率低下。
```python
with open("test.txt", "wb+", buffering=2) as f:
for num in range(1, 1000000):
f.write(b"tn")
如何修改缓冲区?
对于不同参数(-1, 0, 1, > 1),不同类型的文件 (Binary/Text) 还有不同的策略
| File Type | buffering=-1 | buffering=0| buffering=1 | buffering>1 | | ---- | ---- | ---- | ---- | ---- | | Binary | 系统默认的 buffer 大小 | unbuffered | 1| 指定缓冲区大小 | Text | 系统默认的 buffer 大小 | 不允许 | line buffering | 系统默认的 buffer 大小
encoding 编码格式
这个参数应该被用于text模式,默认编码是系统设置。
errors 报错级别 不能用于binary mode
- strict: 字符编码出现问题时会报错
- ignore: 字符编码出现问题时程序会忽略而过,继续执行下面的程序
newline 设置换行符, 默认为none
newline 的值可以为 None, '', 'n', 'r', and 'rn'
不同操作系统换行符不统一
- linux/mac:n
- windows:rn universal newlines - 系统换行符
使用newline
- 若文件都是使用python程序进行读写,一般使用默认值即可
- newline="" 的例子。使用csv模块读写CSV文件时候,需要设置newline='' 参考文档:https://docs.python.org/3.4/library/csv.html?highlight=csv
例子:
# 强制转化成r 写入
输出
['r', 'r', 'r', 'r']
['n', 'n', 'n', 'n']
文件方法调用
read 读文件
默认把整个文件当成一个字符串读出来,可以传入参数设置一次性读出来的字符长度
readline 读一行
一次读一行,以换行符作为分界点,每次调用之后文件指针指向下一行
readlines
默认把整个文件当成一个list读出来,以换行符作为元素分隔,可以传入参数设置一次性读出来的列表长度。需要注意是列表每个元素包涵所有内容,换行符不会被转义。
write 写文件
把一个字符写入文件
writelines 把可迭代对象写入文件
可迭代对象包括字符串,列表,元祖 需要注意是,writelines传入的是一个可迭代对象类型,如果传入一个字符串,会遍历这个字符串每个字符,然后再写入,如果字符串很大,会造成效率极其低下。一个长字符串写入,应该采用write方法
flush
刷新缓冲区,如果缓冲区还没有写满,则可以强制刷新,写入磁盘。
tell
返回当前指针位置
readable
判断当前文件是否可以读,返回bool值
writeable
判断当前文件是否可以写,返回bool值
isatty
判断当前文件是否被打开,并且连接到了一个类终端(TTY)设备。具体用法参考open_function_issatty.py
seek
- offset 开始的偏移量,也就是代表需要移动偏移的字节数
- whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
fileno
返回整型的文件描述符.如果IO对象不能使用文件描述符,SError异常被抛出。