• python0.11-----文件/编码和解码/pickle模块


    文件:
    python中的文件读写和c兼容,磁盘上的读写由操作系统完成,一般的程序无法操作磁盘。文件读写是通过操作系统对象完成,该对象称为文件描述符。

    文件的操作分两种:

    1.打开文件
    open(path,flag[,encoding][,errors])
    path:要打开文件的路径。
    flag:打开方式。
      r:以只读的方式打开文件。文件的(描述符)指针放在文件开头。
      rb:以二进制格式打开一个文件用于只读,文件描述符放在文件开头。
      r+:打开一个文件用于读写,文件描述符放到开头。
      w:打开文件只用于写入。若文件已经存在则会被覆盖,若文件本身不存在,则会创建新文件。
      wb:打开一个文件只用于写入二进制。若文件已经存在则会被覆盖,若文件本身不存在,则会创建新文件。
      w+:打开一个文件用于读写。若文件已经存在则会被覆盖,若文件本身不存在,则会创建新文件。
      a:打开一个文件用于追加。如果文件存在,文件描述符将会放到文件末尾。若文件本身不存在,则会创建新文件。
      a+:打开一个文件用于读写。如果文件存在,文件描述符将会放到文件末尾。若文件本身不存在,则会创建新文件。注意:因为文件描述符放在文件末尾,因此,读文件读不出来什么东西。

    encoding:编码方式。
    errors:错误处理方式,'ignore'表示若编码和解码方式不一致不会报错,'strict'表示若编码和解码方式不一致会报错。
    注意:网络数据是以二进制进行传输的。因此存在'wb','rb'。

    例子:
    f=open(r'C:UsersyuliangDesktopProjectlrc.txt','r',encoding='utf-8',errors='ignore')
    注意:f代表的是已经打开的文件。
    2.1 从文件中读出内容:
    #1.读取文件的全部内容:str1=f.read(),此时文件描述符已经来到了文件的末尾。
    注意:若文件很大,有1G以上,那么文件内容全部存到内存里面去了,这样显然不好。
    #2.读取指定的内容:str1=f.read(num),读取文件描述符后面的num个字符数,此时文件描述符向右移动num个字符位置。
    #3.读取整行,包括' '字符:str1=f.readline(),文件描述符放到下一行的行首。另外,str1=f.readline(num)跟str1=f.read(num)功能一样,不过很少用。
    #4.读取所有行并返回列表:list1=f.readlines()。文件描述符放到文件末尾。另外,list=f.readlines(num),若给定数字大于0,就读取就实际size的行数。不过很少用。
    #5.修改描述符的位置:f.seek(num)。表示将文件描述符放在离文件开头num个字符的位置。

    2.2 向文件写入内容:
    #1 将信息str1写入缓冲区 f1.write(str1)
    #2刷新缓冲区
    f1.flush() :直接将缓冲区的内容立即写入文件。若不加这个语句,则文件在关闭的时候才将缓冲区的内容写入到内存里面区。若缓冲区满了,也会自动将缓冲取内容立即写入文件。

    3.关闭文件
    f.close

    #一个完整的过程
    try:
      f1=open(path,'r')
      print(f1.read())
    finally:
      if f1:    #若f1正常打开,则关闭,否则无须关闭。

        fi.close

    #更简单的读取方式:
    with open(path,'r') as f1:
      print(f1.read())
    不管文件打开成功或者失败,with最后都可以自动将文件给关上。

    #写内容的简单方式,不用关闭,不用刷新
    with open(path,'a') as f1:
      f1.write(str)

    #遍历一个文件的每一行:

    for eachline in f1:
      print(eachline)

    编码和解码:
    with open(path,'wb',encoding='utf-8') as f1:       #wb表示将存入文件的数据应该为字节类型。
      f1.write(str1.encoding('utf-8'))            #将字符串str1用utf-8格式编码成为二进制模式并写入文件。若不编码,则报错:a bytes-like object is required, not 'str'。


    with open(path,'rb') as f1:
      date=f1.read()    #读出来的是二进制文件,date是字节类型class 'bytes'。
      newDate=date.decode('utf-8')   #所以要将字节类型以utf-8格式解码为字符串类型。若不解码,则无法得到正常的字符串。

    注意:若文件保存的编码格式是utf-8,那么用gbk的格式读取内容将会报错: 'gbk' codec can't decode byte 0xae in position 40: illegal multibyte sequence。
    errors='ingnore'会忽略打开文件的编码解码不一致错误,无能忽略二进制文件编码时产生的错误。

    pickle模块:数据持久性模块。它可以把list,tuple,dict,set数据写入文件。

    使用pickle模块的方法:
    #打开文件:f1=open(path,'wb')
    #使用pickle模块存储数据:pickle.dump(data,f1)
    #关闭文件:f1.close()
    #打开文件:f2=open(path,'rb')
    #读取pickle文件内容:pickle.load(f2)
    #关闭文件:f2.close()
    注意:因为dump和load会将将其他数据类型转化为二进制的字节类,因此,文件的读写方式应该是'wb'和'rb'形式。若读方式不是二进制的形式,则会报错:write() argument must be str, not bytes

  • 相关阅读:
    Element Form表单验证
    layui table中记住当前页
    Mysql定时任务
    Mysql存储过程
    StringRedisTemplate与redistemplate
    vue路由传值
    背景色渐变(兼容各浏览器)
    用onclick点击框架跳转
    美化滚动条
    图片无缝滚动
  • 原文地址:https://www.cnblogs.com/yulianggo/p/9206572.html
Copyright © 2020-2023  润新知