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

 

 

posted @ 2020-06-08 21:18  没有想象力  阅读(242)  评论(0编辑  收藏  举报