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')>>>>.修改新文件名变为原文件
原文地址:https://www.cnblogs.com/liuyang521/p/14190935.html