• chapter6.1、文件系统操作和上下文管理


    文件操作

    IO操作指的一般是文件IO,如果指网络IO,会直接说网络IO

    cp936 = codepage936就是 GBK,微软的编码方式,
    我国信息化时间较晚,最早的中文编码是big5 码,然后统一的使用GB2312,现在通用的是GBK码
    ,使用两位的字节编码,编码范围0-65535,保留了ASCII码的0-127,汉字使用两个字节,通过查编码表,确定一串字节的含义。

    看编码方式,才能知道磁盘上的0和1的含义

    Unicode编码体系,Unicode和国际标准组织规定的全球范围的编码方式。使用两个字节编码,这对于拉丁字母的单字节使用国家来说,会对存储空间造成浪费,所以产生了Unicode的传输标准utf8.

    utf-8 (8-bit Unicode Transformation Format) 多字节,从一个到六个字节,中文大部分3个字节

    文件IO常用操作

    open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

    文件系统是操作系统的子系统,文件查找不到报回的错误,是系统返回的OSError,操作系统文件系统报错

    open 通过路径系统,使用系统调用,操作系统提供的功能,调用API接口,返回一个文件对象

      文件地址找到文件,理解为流对象,通过编码方式读取文件。

      open的默认模式是rt文本模式只读打开,不存在抛OsError

      文件用完一定要关闭,流对象关闭不可在操作,f.close()

      访问模式:文本模式,二进制模式

    open  参数,
    file 文件名,如果不指定路径,默认当前路径。绝对路径,相对路径。

      操作会涉及指针操作,文件指针指向当前字节位置

    mode r,w,a,x,b, t,+

        r,只读模式,不可以写操作,指针指向0

        w,只写操作,覆盖执行,不可读,相当于新建文件,指针指向0,写入可以创建新文件f.write,缓冲可能会不能直接看,关闭后执行flush操作后,才能catch查看,如果seek,也会执行一次flush。

        x,不覆盖写,存在同名文件抛异常,不存在新建,create

        a,追加尾部,不存在创建新文件。可以来写日志,

        t,字符流,字符,返回字符流,按照某种编码理解,默认None,会自己判断,但还是要自己确定好编码。
        b,字节流,字节模式,返回字节流,与编码无关,字节流用bytes操作

        +,追加功能,追加没有的功能,+为rwax提供缺失的读或写的功能,

          r+ 读从头开始,一写就会从头覆盖
          w+ 写直接覆盖,直接清空,可读,但数据如果是字符,可能在缓冲区,read不出来

    t,b,+  不能独立使用。

    文件类型的扩展名,默认会关联一些操作,系统通过文件的扩展名来查看文件,读取后在查看文件头的信息,确定能否执行,比如你用文本阅读器,打开mp3格式,无法打开,修改扩展名,也会显示一连串乱码。
    出现乱码时,最好在创建文件时约定编码,windows下默认使用cp936,要使用utf-8,转换至linux下也是utf-8,才不会出现乱码。

    buffering 缓冲区

      是一个内存空间,大部分是先进先出队列,例外是环状。到缓冲区满了,或者到达阈值,数据才flush到磁盘

      -1缺省,二进制和文本都表示使用默认,缺省缓冲区大小 默认为8192或4096个字节

      0只在二进制使用,表示不用buffer,可以看作FIFO的文件,直接写入磁盘

      1只给文本模式使用,行缓冲模式,文本模式下只用默认的缓冲区,见到换行符就换行,换行后同一行内有内容,一起写入磁盘。

      大于1表示指定buffer的大小,文本模式没有影响。

    seek会flush一次,close会调用flush一次,批处理是电脑使用的较好的方式

    只要记住:

      文本模式,一般都用默认缓冲区

      二进制模式,是一个一个字节操作,可以指定buffer的大小

      一般来说,默认缓冲区大小是个比较好的选择,除非明确知道,否则不调整塔。参数不懂不要乱动

      一般编程中,明确知道需要写磁盘,可以手动调用一次flush,但是少用,与电脑习惯不同,可能会降低性能

    encoding 编码,仅文本模式下使用

    None表示缺省,依赖操作系统,windows下GBK。Linux下UTF-8,如果不写可能会乱码

    跨平台时,一定要写上编码方式,最好的处理是都写上

    error ignore表示忽略,None和strict表示错误时抛出ValueError

    newline 新行,文本模式下,换行的转换

      newline = None,根据操作系统换行,( , , =   linux,ios,windows),文件中的'空串 , , '都会转换为当前系统的换行符,Linux下是

      newline = '' 表示不做转换,

      其他表示使用指定换行符分行。 或‘’ 表示 不替换,其他合法字符表示换行的会替换为指定字符

    文件描述符,是有限资源,使用io下的表示文件打开后的文件id,默认的0,1,2使用给了,标准输入,标准输出,标准错误

    closefd关闭文件描述符=True ,Flase关闭后保持,直到下次使用,fileobj.fileno()查看文件描述符

    read(size) 

      读操作,指定size,不指定默认到EOF,结尾

      read(size=-1),表示读取字节的个数,从指针开始读,-1是默认,读到结尾

    readline一行一行读取

    readlines(hint=-1)  立即返回一个列表,可以直接迭代文件,也是按行处理,只处理文本模式

    write 写入

    writelines,写入列表,可以自己提供换行符writelines(map(lambd ...,list)),或者默认跟随操作系统

    f.close()   flash并关闭文件

    f.closed()判断是否打开,seekable readable,writeable,判断是否可索引,可读,可写

    tell()   显示指针当前位置,mode = r时,指针在0,moda=a时,指针在EOF

    seek(offset,[whence])   

      文本模式下,offset字节位置移动距离,只能是正整数,whence位置(0,1,2= 头,当前,尾),缺省值为0,设置为1时,offset只能为0,whence为2时,移动指针到尾部,offset为0

      二进制模式下,whence 0缺省,offset只能为正,whence为1表示从当前位置开始,offset可正可负,whence为2表示从EOF位置开始,offset可正可负,不可超左界限,可超右界限。字节偏移,二进制支持任意起点的偏移。

     b0a1 gbk第一位,汉字’啊‘

    上下文管理

    lsof 查看所有打开文件  ls open file,没有使用 yum install lsof 命令安装

    文件的打开限制可以用ulimit -a 查看,文件描述符数目上限1024

    可以做实验打开1024个文件,放在一个容器中,但最后一定要关,使用容器记录中间变量。

    lsof -p 1427 | grep test |wc -l

    使用容器存放文件打开目录 ,可以批量关闭

    try 

    f = open('test')
    try:
        f.write("abc")
    finally:
        f.close()
        print("~~~~")

    try...finally 结构可以保证关闭文件,但要保证前一句f = open("test")一定成立

    with 强大的关闭文件的方法

    f2 = open('test2')
    with f2:
        f2.write('ssss')
        print('wwwww')

    with可以在函数返回return的语句执行后归还对象,甚至可以在执行程序退出前归还,with语句执行完会关闭对象。 sys.exit(-1)

    with     上下文管理语句块不会启动新的作用域,与if的作用域类似,要有语句块,但不开启新的作用域

    with...as

    del f2 
    with open("test2") as f2:
        f2.write('ssss')
    print(f2.closed,'!!!!!')

    可以理解为把打开的对象命名为f2

    对于类似文件对象的IO对象,一般都要在不使用时关闭,注销,以释放资源

    IO被打开时,会获得一个临时的文件描述符,计算机资源是有限的,所以操作系统都有限制。是为了保护计算机的资源不被用尽,计算机资源是共享的,不是独占的

    一般情况下,除非特别明确知道资源情况,否则不要轻易提高资源限制值

  • 相关阅读:
    mysqlbinlog
    MySQL二进制日志
    Slave I/O: Got fatal error 1236
    Zabbix监控nginx-rtmp status(json版)
    shell命令find
    Zabbix监控mysql performance
    Zabbix监控disk performance
    MySQL复制配置(多主一从)
    数据建立和保持时间
    Source insight 中 标题栏路径显示完整路径的方法
  • 原文地址:https://www.cnblogs.com/rprp789/p/9568621.html
Copyright © 2020-2023  润新知