分享

Python基础

 流形sbz 2023-10-23 发布于甘肃
*Python3的默认编码是utf8,而其中的open函数打开文件时依托于系统编码(windows编码时gbk)
      这里面比较经典的问题就是解码与编码的码不一致,导致乱码的问题
 *文件操作的基本流程:
      1.f=open('文件路径',encoding='编码') 注意:文件的编码要与打开文件时的解码一致
      2.data=f.read()
      3.print(data)
      4.f.close() 
 *文件的操作模式:
          注意:读写的文件内容必须都是字符串。write或是read参数都是字符串,writelines或是readlines参数都是list
      1.r:只读 open()函数默认就是只读的。 (r+ 读写都可以)
        读文件:
          f=open('文件路径','r’,encoding='编码')
          f.readable() 如果对象是只读的,则返回True,否则返回False
          f.readline() 按行读取文件中的数据。
         例:f=open('b.txt')
            data1=f.readline()
            data2=f.readline()
            print(data1,end='') #如果不加end,默认打印数据之间是有换行符的。
            print(data2)
       注意:如果使用f.read()读取文件的全部内容了,这是光标会自动到文件内容的末尾,所以在使用
                   f.readline()就不会在读取出数据了。
       f.readlines():读取多行,默认返回列表,每一行数据包括换行符作为列表中的一个元素
  2.w:只写(w+读写都可以)
  写文件:
      f=open('文件路径','w’,encoding='编'码):如果文件不存在,则创建一个空的文件;如果存在,则清空原文件内容
      f.write('文件内容\n') 如果不手动添加换行符,默认是不会换行的
      f.writeable():如果对象是只写的,则返回True,否则返回False
      f.writelines(list):写多行,列表中元素的个数代表写几行内容,前提是每个元素里面结尾必须加上换行符
  3.a:只追加(写)[a+ 可读写]
      f=open('文件路径','a’,encoding='编'码):如果文件不存在,则创建一个空的文件;如果存在,则保留原文件内容
      f.write()/f.writelines()会把数据追加到文件中数据末尾
  4.with open(...) as f:
       ...
   本方法操作文件不需要手动调用close方法,其本身会自动调用,这就是这个方式操作文件的优势
   with open() as f1,open() as f2:
     ...
   打开多个文件 
5.注意:把文件中的内容存到硬盘上,即实现str编码成byte的形式,从硬盘上读取str,即实现byte解码成str的操作
 *b是操作字节文件
  .rb模式
  f=open(file,'rb') 注意:这里面是从硬盘上直接读取字节文件,不需要编码,即没有encoding这个参数
  print(f.read()) :打印的内容都是字节对象(包括\r\n换行符),如果想打印字符串即原文件具体内容,可以data.decode()
  注意:解码与编码的码一致
  . wb模式
  f=open(file,'wb')
  方式一:f.write(bytes(filecontent,encoding)) 注意:必须指定编码encoding,因为文件存到硬盘上,必须编码(str-->byte)
  方式二:f.write(str.encode(编码))
  .ab模式
 注意:为什么使用b模式?
  *b模式可以打开多种类型文件(文件默认打开的是文本类型,即便你指定'r’的方式打开文件,其默认也会变成'rt’,
   w与a同上;如果操作非文本类型就要使用b模式)
  *b模式跨平台
  *b模式对于linux操作系统没用。因为linux默认打开文件就是b模式的
6.文件操作的其他方法:
 * f=open(file,'r',encoding='gbk')
   print(f.encoding)#该方法获取的是encoding的参数值(文件的解码的码值,并非文件编码码值)
 *  f=open(file,'w',encoding='gbk')
  f.write('I love China!')
  f.flush()
 PyCharm中,会默认调用该方法,把内容写到文件中,在cmd中,需要手动调用flush()方法
 *f.tell():返回值是光标所在的位置(光标移动是以字节为单位的)
  注意:windows下的换行符是\r\n,不同系统的换行符在PyCharm中都会被转换成\n,但是只是形式发生变化,其字节数并未变
    还要注意文件编码的中文问题,中文在utf8中占用3个字节,gbk中占用2个字节
  例:f=open('a.txt','r+',encoding='utf-8',newline='')
   print(f.readlines())
   如果open函数不加newlines参数,打印的内容是['...\n','...\n',...],加上参数之后,打印内容是['...\r\n',...]
 *f.seek(int):从文件头开始移动光标到int的位置(字节)
  1.f=open(file,'r+',encoding='gbk')
    f.seek(int,0):第二个参数是0,是该方法的默认值,即从文件头开始移动光标
  2.f=open(file,'rb+')
    f.seek(int,1):第二个参数是1,表示从相对位置移动光标,所谓的相对位置即上一次seek的位置
  3.f=open(file,'rb+')
    f.seek(int,2):从文件内容的末尾倒着读int个字符,注意int必须是负数才可以,若是正数不报错,但是处理不多。
  注意:seek方法除了默认的模式0之外,其他的文件打开方式必须是b模式,否则报错
 *f.read(int):从光标位置读取int个字符
 *f.truncate(int):从文件头发开始截取文件内容(字节为单位,注意中文问题)
 *循环文件:
  方式一:
  f=open(file,'rb')
  for item in f.readlines():浪费内存,因为文件中的内容已经全部读取出来放到list中了
       print(i)
  方式二:
  f=open(file,'rb')
  for item in f:按行读取文件内容,只是在需要的时候才会读取,不会以一下子全部拿出来
       offs=10 #偏移量
       while True:
            f.seek(offs,2)
            li=f.readlines()
            if len(li)>1 :
                 print(data[-1].decode('utf-8'))#这里面的解码与你该文件的编码一致,不一定是utf-8
                 break;
            offs*=2
  方式二是读取大型文件的最后一行操作。常见于面试题

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多