zoukankan      html  css  js  c++  java
  • 7、文件操作方法

    7、文件操作方法

    温故知新

    运行python的三个步骤
          1、启动python解释器
          2、解释器将test.py的内容从硬盘读入内存
          3、解释器执行刚刚读入内存的代码,识别python语法,比如 x='上'
    

    bytes类型

                 编码                     编码
     字符-------------------->unicode------------->其他编码
    
                 解码                      解码
     字符<--------------------unicode<-------------其他编码
    
     print(x)
     res = x.encode("gbk")
     print(type(res))>>>>>>>><class,bates>
    
     强调:在python3里,只会将unicode格式的数字转成字符,其余编码格式的数字均不会转换
     print(res)
     print(res.decode("gbk"))>>>>>>>b'xc9xcf'
    

    文件处理

    一、控制文件的读写操作模式:

      r:只读(默认的) 不能进行写操作
      w:只写---文件存在内容则会在打开的瞬间清空,文件不存在就会创建一个文件
      a:只追加写,打开文件后指针会移动到文件的末尾,不会删除数据,只会在后面写
    

    二、控制文件读写内容的模式

      t:控制读写的内容都是字符串类型(默认的)
           特点:
            1、只使用与文本文件,不适用于图片视频等其他格式
            2、一定要指定encoding的参数
      b:控制读写的内存都是bytes类型
            1、适用于所有类型,不过用于文本文件较繁琐,推荐用t模式
            2、一定不要指定encoding参数
    

    三、调用打开文件的方法# 在文件名前面加 r 可以避免路径中出现 ,r可以去点字符的特殊意义

            ####r: 文件不存在则报错,存在指针会跳到文件的开头进行读取文件
           ```
    f = open(r'a.txt',mode='rt',encoding='utf-8') 
               print(f.read())
               f.close()>>>>>>回收操作系统资源
    
    
                ####w:文件不存在会创建空文档,存在会清空内容,指针跳到开头(切记不要用w打开关键数据
               ```
           f = open(r'b.txt',mode='wt',encoding='utf-8')
                      f.write("你好啊1
    ")
                      f.write("你好啊2
    ")  
                      f.write("你好啊3
    ")
                      f.clujinlose()     打开了
    

    文件不关闭的情况下,新写入的内容永远跟在老内容之后
    ####a:文件不存创建空文档,存在会跳到末尾,在后面追加写,比如用来存取用户的账户、
    ```
    f = open(r'c.txt',mode='at',encoding='utf-8')
    文件不管是否关闭,打开指针都会跳到最后

    
               了解:读写模式(可读可写,很少用到)
                r+t、w+t、a+t
                 例如:r+t模式
                       f = open(r'c.txt',mode='r+t',encoding='utf-8')
                       print(f.readable())
                       print(f.writable())
                        print(f.read())
    
                        f.write("h")
                        f.close()
    ####with功能 b模式
                ```
    with open('1.mp4',mode='rb') as f:
                print(f.read())>>>>>>>一次性读取所有,若是文件过大会导致内存卡死,崩溃
                for line in f: >>>>>>>一行一行的读取,不会占用大量内存
                    print(line)
    
    with open('1.mp4',mode='rb')as f ,open(r'2.mp4',mode='2b')as new_f:
                      for line i f:  # 循环f line是读一行
                      new_f.write(line)  #把读到的一行 写入new_l里面去,一行一行读写,有效的节省内存空间
    
     ```
       with open('d.txt',mode='wb') as f:
                msg = "你好"
                f.write(msg.encode('utf-8'))>>>>>wb格式写入需要编码成utf-8 不然会乱码
    
    
          
               ```
     with open('a.txt',mode='rt',encoding='utf-8')as f:
                res = f.read()
                print(res)>>>>>>正常读出a.txt内文本内容
                res = f.read
                print(res)>>>>>>输出空白,在我呢见没有关闭是情况下,前面的f.read已经将指针移动到了末尾,所以再读就读不到内容了
                f.readline().......一行一行的读取
                f.readlines()........全部读取到一个列表中
    
                with open('a.txt',mode='wt',encoding='utf-8') as f:
                      lines = ['aaa
    ',"bbbb
    ","cccc
    "]
                            for line in lines
                                 f.write(line)
                  等同于 f.writelines(lines) 
                      不同的是 write.('hello) 是直接把整个字符串直接写入
                            而 writelines.('hello')是一个字母一个字母的写入
    
       了解:
           f.flush(),因为文件的写入是隔一段时间写入一次,非常急用的文件可以用 flush()立即写入
           print(f.close)判断文件是否关闭
            print(f.name) 文件的名字
    

    控制文件指针的移动(被动控制指针的移动)

      ####只有在 t 模式下的read(n)代表的是字符个数(utf-8中一个英文字符一个字节、一个中文字符三个字节),除此以外都是字节个数
           ```
    

    with open('a.txt',mode='rt',encoding = 'utf-8') as f:
    res = f.read(6)
    print(res) t模式.read(6)代表6个字符,所以正常输出

            with open('a.txt',mode='rb') as f:
                  res = f.read(6)
                  print(res)      >>>b'helloxe4xbdxa0' 会打印bytes格式
                  print(res.decode('utf-8'))>>>>解码成’utf-8'格式就可正常读出
            
            with open('a.txt',mode='at',encoding='utf-8') as f:
                  f.truncate(6)>>>>>hello�  截断内容,若是碰到中文三个字节,刚好截了一个或两个字节就会乱码
    
    
    ###主动控制指针的移动
          ####f.seek(移动字节的个数,模式)
          模式有三种:
                0:永远参照文件的开头
                1:参照指针所在的当前位置
                2:永远参照文件末尾
          ####注意:只有0模式可以在 t 模式下使用,1 和 2 只能在b模式下使用
                ```
    with open('a.txt',mode='rt',encoding='utf-8') as f:
                      f.seek(3,0) >>>参照文件开头,向右移动 3 个字节
                      f.seek(5,0)
                      print(f.tell())告诉指针所在位置
                
                with open('a.txt',mode='rb')as f:
                      f.seek(-3,2)>>>>参照文件末尾,-3 是向左移动 3 个字节
                      print(f.tell())>>>>文件的长度是从开头到指针处
    

    修改文件的方式一、

      ####1、先将文件的内容全部的读入内存
      ####2、在内存中完成修改
      ####3、在修改后的内容覆盖回源文件
      
        ```
    ps:耗费内存不耗费硬盘
      with open('e.txt',mode='rt',encoding='utf-8')as f:
            data = f.read()>>>>先读到内存
     with open('e.txt',mode='wt',encoding='utf-8')as f1:
            f1.write(data.replace('liu','LIU') 在内存修改后,在覆盖到文件中
    
    
    ###修改的方式二、
          ####1、以读的方式打开文件,然后以写的方式打开一个临时文件
          ####2、读源文件的一行内容到内存,然后在内存中修改完毕后在写入临时文件
          ####3、删除源文件,将临时文件重命名为源文件
                
                ps:耗费硬盘不耗费内存
          import os 
          
          with open('e.txt',mode='rt',encoding='utf-8') as scr_f,
                open('.e.txt.swp',mode='wt',encoding='utf-8') as dst_f:
                for line in scr_f:
                      dst_f.write(line.replace('liu','LIU')
                一行一行的修改后存到新的文件夹,极少的占用内存
            os.remove('e.txt')   >>> 删除源文件
            os.rename('e.txt.swp','e.txt')>>>>.修改新文件名变为原文件
  • 相关阅读:
    归并排序处理复杂对象例子
    Java归并排序的递归与非递归实现
    Java实现一个双向链表的倒置功能
    Node<T> 的作用
    Tomcat控制台总是打印日志问题的解决办法
    git回滚部分文件到某个版本
    ios-deploy was not found
    Ionic3的http请求如何实现token验证,并且超时返回登录页
    Ionic开发遇到的坑整理
    使用gradle命令代替CUBA Studio,启动项目
  • 原文地址:https://www.cnblogs.com/liuyang521/p/14190935.html
Copyright © 2011-2022 走看看