• 9.文件处理


    • 引子
    • 文件处理

    • 什么是文件?为何要用文件?如何用文件?

    • 字符编码应用
    • bytes类型

    • 文件操作方法
    • 控制文件指针移动
    • 文件的修改

    • 文件处理

    • 1、什么是文件

      文件是操作系统提供给用户或者应用程序操作硬盘的一种机制

    • 2、为何要用文件

      读写文件--------->存取硬盘
      应用程序:open()

      操作系统:打开文件

      计算机硬件: 硬盘空间
    • 3、如何用文件

      打开文件:得到文件句柄并赋值给一个变量
      读/写:通过句柄对文件进行操作
      关闭文件
    r"D:acd.txt"   # 绝对路径:从头开始的文件夹路径 代表路径分隔符,加r是取消的特殊意义
    r"aa.txt"          # 相对路径:相对当前运行程序所在的文件夹路径
    
    # 回车与换行的来龙去脉
    http://www.cnblogs.com/linhaifeng/articles/8477592.html
        
        
    # 打开文件,得到文件句柄并赋值给一个变量
    f = open(r"aa.txt",mode="rt",)   # open是指定你要打开文件的路径
    # f的值-》文件句柄,文件对象
    
    # 通过句柄对文件进行操作
    res = f.read()
    print(res,type(res))
    
    # 关闭文件
    f.close()  # 回收操作系统的资源
    print(f)
    f.read()   # f.read只适用于比较小的文件
    
    
    # with上下文管理(帮你关文件)
    with open(r"aa.txt",mode="rt",) as f,  
            open(r"a.txt",mode="rt",) as f1:  # ,转义换行符,其实这是一行
        res = f.read()
    
    
    with open(r"aa.txt",mode="rt",) as f:
        for line in f:     
            print(line)    # line末尾其实是有一个换行符的
            
            
    with open(r"aa.txt",mode="rt",) as f:        
            res=line.strip('
    ').split(':')   # 去掉换行符
            print(res)
    

    • 字符编码应用

    		
    	英文字符--------------》内存:ASCII格式的二进制--------------》硬盘:ASCII格式的二进制
    		
    中文字符、英文字符--------------》内存:gbk格式的二进制----------------》硬盘:gbk格式的二进制
    
    日文字符、英文字符--------------》内存:shif-jis格式的二进制-----------》硬盘:shif-jis格式的二进制
    
    
                         编码                                编码
            万国字符---------------》内存:unicode格式的二进制-----------》硬盘:utf-8格式的二进制
             
    中文字符、英文字符---------------》内存:unicode格式的二进制-----------》硬盘:gbk格式的二进制
    
    日文字符、英文字符---------------》内存:unicode格式的二进制-----------》硬盘:shift-jis格式的二进制
    
    • 如何保证不乱码:

      存乱了

      用utf-8编码存入硬盘

      读乱了

      将读的编码改成与存的编码一致

      运行python程序的三个步骤:python test.py

    1、启动python解释器
    2、解释器将test.py的内容从硬盘读入内存
    3、解释器解释执行刚刚读入内存的代码,识别python语法,比如x = "上"
    # coding:gbk  # 在python程序的第一行,必须是在第一行。此行代码就是告诉python解释器在运行 
    #               程序的时候不要再使用默认的字符编码表,要使用gbk
    
    
    • bytes类型

    # 细节:以后写python程序,字符串前面要加小u,涉及这个程序在python2的程序中也能运行,
    #      python3不需要加,它的本质就是unicode
    
    #             编码                     编码
    # 字符-------------------->unicode------------->其他编码
    
    #             解码                     解码
    # 字符<--------------------unicode<-------------其他编码
    
    x = "上"
    # x.encode 编码
    print(x)
    res = x.encode("gbk")     
    print(type(res))          # res是gbk格式的字符编码
    
    # 强调:在python3里,只会将unicode格式的数字转成字符,其余编码格式的数字均不会转换成字符
    # x.decode 解码
    print(res)
    print(res.decode("gbk"))   
    

    • 文件操作方法

    • 控制文件读写操作的模式

      r:只读模式 (默认模式,文件必须存在,不存在则抛出异常)

      w:只写模式 (不可读;不存在则创建;存在则清空内容)

      a:只追加写模式 (不可读;不存在则创建;存在则只追加内容)

    • 制文件读写内容的模式:

      t:控制读写的内容都是字符串类型(默认的)

      特点:
      1、只适用于文本文件
      2、一定要指定encoding参数

      b:控制读写的内存都是bytes类型

      1、写入时也需要提供字节类型
      2、一定不要指定encoding参数*
    # r: 如果文件不存在则报错,文件存在则将文件指针跳到整个文件的开头
    f = open(r'a.txt',mode='rt',encoding='utf-8')
    print(f.read())
    f.close()
    
    # w: 如果文件不存在则创建空文档,如果文件存在则清空,文件指针跳到文件开头
    f = open(r'b.txt',mode='wt',encoding='utf-8')
    f.write("你好啊1
    ")
    f.write("你好啊2
    ")  # 打开了文件不关闭的情况下,新写入的内容永远跟在老内容之后
    f.write("你好啊3
    ")
    
    f.close()
    
    # a: 如果文件不存在则创建空文档,如果文件存在则清空,文件指针跳到文件末尾
    f = open(r'c.txt',mode='at',encoding='utf-8')
    f.write("你好啊1
    ")
    f.write("你好啊2
    ")  # 打开了文件不关闭的情况下,新写入的内容永远跟在老内容之后
    f.write("你好啊3
    ")
    f.close()
    
    # 读写模式
    "+"   # 表示可以同时读写某个文件
    r+t   # 读写(可读,可写)
    w+t   # 写读(可读,可写)
    a+t   # 写读(可读,可写)
    
    
    x     # 只写模式(不可读;不存在则创建,存在则报错)
    x+    # 写读(可读,可写)
    
    
    # 例如
    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()
    
    
    # b模式:对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作
    with open('c.txt',mode='rb') as f:
        res = f.read()
        # print(type(res))
        # print(res)
        print(res.decode('utf-8'))
    
    
    with open('1.mp4',mode='rb') as f:
        print(f.read())
        for line in f:
            print(line)
    
    
    with open('1.mp4',mode='rb') as src_f,open(r'D:111111.mp4',mode='wb') as dst_f:
        for line in src_f:
            dst_f.write(line)
    
    with open('d.txt',mode='wb') as f:
        msg = "你好"
        f.write(msg.encode('utf-8'))
    
    • 操作文件方法:

    # 掌握
    f.read()       # 读取所有内容,光标移动到文件末尾
    f.readline()   # 读取一行内容,光标移动到第二行首部
    f.readlines()  # 读取每一行内容,存放于列表中
    
    f.write('1111
    222
    ')    # 针对文本模式的写,需要自己写换行符
    f.write('1111
    222
    '.encode('utf-8'))  # 针对b模式的写,需要自己写换行符
    f.writelines(['333
    ','444
    '])   # 文件模式
    f.writelines([bytes('333
    ',encoding='utf-8'),'444
    '.encode('utf-8')]) # b模式
    
    # 了解
    f.readable()  # 文件是否可读
    f.writable()  # 文件是否可读
    f.closed      # 文件是否关闭
    f.encoding    # 如果文件打开模式为b,则没有该属性
    f.flush()     # 立刻将文件内容从内存刷到硬盘
    f.name
    
    
    # 文件操作的其它方法:
    
    with open('a.txt',mode='rt',encoding='utf-8') as f:
        res = f.read()
        print(res)                # 读所有行的内容
        print('=========================')
        res = f.read()
        print(res)
    
        print(f.readline())   # 可以一次读一行
    
        res = f.readlines()   # 读每一行内容,存放于列表中
        print(res)  
        pass
    
    
    
    with open('a.txt',mode='wt',encoding='utf-8') as f:
        f.write("1111
    222
    333
    ")     # 针对文本模式的写,需要自己写换行符
    
        lines = ['aaa
    ',"bbbb
    ","cccc
    "]
        for line in lines:
            f.write(line)                # 针对b模式的写,需要自己写换行符
    
        f.writelines(lines)             # 跟f.write(line)看似一样,但底层原理不同
        f.writelines("hello")           # for循环写入的,hello写了五次
    
    
    with open('a.txt',mode='wt',encoding='utf-8') as f:
        f.write("hello")
        f.flush()             # 催促硬盘输入,其实是降低效率
        print(f.closed)
        print(f.name)
    
    print(f.closed)
    
    

    • 控制文件指针移动

    • 1、被动控制文件指针移动

      只有t模式下的read(n)的n代表的是字符个数,除此以外都是字节个数

    with open('a.txt',mode='rt',encoding='utf-8') as f:
        res = f.read(6)
        print(res)
    
    
    with open('a.txt',mode='rb') as f:
        res = f.read(8)
        print(res.decode('utf-8'))
        
    
    with open('a.txt',mode='at',encoding='utf-8') as f:
        f.truncate(6)
    
    
    
    • 2、主动控制指针移动

      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)
        f.seek(5,0)
        print(f.tell())
    
    with open('a.txt',mode='rb') as f:
        f.seek(3,1)
        f.seek(5,1)
        print(f.tell())
        res=f.read()
        print(res.decode('utf-8'))
    
    with open('a.txt',mode='rb') as f:
        f.seek(-3,2)
        print(f.tell())
        f.seek(0,2)
    

    • 文件的修改

    • 修改文件的方式一:

      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('egon','EGON'))
    
    
    • 修改文件的方式二:

      1、以读的方式打开原文件,然后以写的方式打开一个临时文件

      2、读原文件的一行内容到内存,然后在内存中修改完毕后再写入临时文件,循环往复直到全部改完

      3、删出原文件,将临时文件重命名为原文件名

    ps: 耗费硬盘不耗费内存
    import os
    
    with open('e.txt',mode='rt',encoding='utf-8') as src_f,open('.e.txt.swp',mode='wt',encoding='utf-8') as dst_f:
        for line in src_f:
            dst_f.write(line.replace('EGON','egon'))
    
    os.remove('e.txt')
    os.rename('.e.txt.swp','e.txt')
    
  • 相关阅读:
    SQLServer 系统表简介
    C# abstract 和 virtual 关键字
    Windows脚本 %~dp0的含义
    Windows脚本 批处理中能够使用的系统变量
    Windows脚本 Shift 命令
    Windows脚本 关于本机ARP静态绑定批处理文件讲解[绑定ipmac脚本详解]
    开学测试
    仓库管理系统
    读《人月神话》
    个人作业2
  • 原文地址:https://www.cnblogs.com/gfeng/p/14190981.html
Copyright © 2020-2023  润新知