python文件处理
python文件操作
python中使用open函数去打开一个文件,实际上是对系统调用中的文件操作的一种函数封装,打开文件需要经过操作系统和内核去处理一个IO 操作,是一种系统调用的过程,open函数只是为了简化使用而进行的一层封装。创建一个文件,会在磁盘中开辟一段空间并标记为文件,windows 开辟空文件后大小为4k ,磁盘中每一扇区的大小为512字节,是最小储存单元(即使只存储1字节大小数据 也将占用整个扇区的512字节的空间), 这个扇区将不能够被其他数据所用。
文件对象
f = open(filename, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
文件对象参数
- mode:文件的打开模式,t(默认)表示为字符形式打开,这就需要指定编码,r, w, a标识使用读,写,追加的方式打开。
- buffering:
当使用字节模式时
buffering = -1 | 使用默认缓冲区大小 |
buffering = 0 | 关闭缓冲区 |
buffering = 1 | 不支持,使用默认的缓冲区 |
buffering > 1 | 设置缓冲区的大小,可以超过默认值 |
当使用文本模式时
buffering = -1 | 使用默认缓冲区大小 |
buffering =1 | 不支持 |
buffering = 1 | 以换行符作为一次缓冲大小,但是不能超过设定的默认缓冲区大小 |
buffering >1 | 最大为默认值个字节,flush后写入磁盘 |
- encoding
打开文件应该指定文件的编码,将以该方式解码字节,映射到相应的字符,在不同的操作系统使用的默认编码不同,不指定将会以默认编码解码,例如Windows中文默认以jbk写入,当该文件在linux 打开时,默认使用utf-8去解码字节,就造成乱码,文件时会失败。所以encoding一般指定为 "utf - 8",而不是使用默认值。
- newline
在读取文件时,会解释读取到的换行字符,使用换行符号一般三种, \r\n ,\n ,\r,在Windows中写入文件时,换行时写入文档的字节的 \r \n,mac 写入的是 \r, linux 写入的是 \n
- closefd = True
关闭文件时释放文件描述符,设置为False将不会释放文件描述符。
文件对象的方法
- f.seek(cookie, whence = 0,1,2):偏移量 + 起始位置;返回偏移字按自己计算指针的位置
- 文本模式:只支持头部正向偏移,结尾和中部不能偏移
- 二进制模式:可以随意偏移,以字节为单位,返回最终指向的位置
- 右边界超界后会补空白字符 "\x00",可以直接seek(100) 到指定的长度,内容为空
- f.tell():当前指针的位置,以字节计算的
- f.read(size=1024):默认读取1024长度,可以指定长度
- f.readline():文件的内容,以行位单位,每次调用返回一行内容
- f.write(content):向内存缓冲区写入内容,此时不会写入磁盘
- f.close():关闭文件对象,释放文件操作符(一个整数fd),关闭前flush写入磁盘
- f.seekable(),f.readable(),f.writable(),可读可写
- f.fileno() 查看文件对象的文件描述符
- f.truncate([size]) 不论指针在什么位置,只留下指针前 size 个字节的内容,其余全部删除; 如果没有传入 size,则当指针当前位置到文件末尾内容全部删除
缓冲区:(buffering)
buffering 类似一个队列,用于缓冲写入磁盘中数据,写入数据时超过缓冲区的最大容量,将会自动将缓冲区域的内容写入到磁盘内。操作系统默认制定了缓冲区的大小,在python中 使用模块的 io.default_buffer_size 查看默认缓冲大小,一般为 8k (8192字节) 和 4k (4096字节) 大小
from io import DEFAULT_BUFFER_SIZE
print(io.DEFAULT_BUFFER_SIZE)
数据写入磁盘以簇为单位,,一次写满一个簇区域,所以 一般 4k 或 8k 写入一次,为一个簇的整数倍,不会浪费磁盘资源。缓冲区大小也应该设置为一个簇大小的整数倍,一般为1024的整数倍;
文件描述符fd
文件描述符是一些小的整数,对应于当前进程所打开的文件。例如,标准输入的文件描述符通常是 0,标准输出是 1,标准错误是 2。之后被进程打开的文件的文件描述符会被依次指定为 3, 4, 5 等。在 Unix 平台中套接字和管道也被文件描述符所引用。当需要时,可以用fileno() 可以获得file object 所对应的文件描述符。
上下文管理
with语句
在正常的管理各种系统资源(文件、锁定和连接)过程中,一旦涉及到异常时通常是个棘手的问题。异常很可能导致控制流跳过负责释放关键资源的语句。例如打开一个文件进行操作时,如果意外情况发生(磁盘已满、特殊的终端信号让其终止等),就会抛出异常,这样可能最后的文件关闭操作就不会执行。如果这样的问题频繁出现,则可能耗尽系统资源。
对于文件对象,当离开with的执行区域时,会对 with 后的对象 f 进行关闭。 f = open("file") with f : pass # 离开with语句,执行文件对象的 f.close(),关闭文件对象 with open("file") as f: pass