• 文件处理,光标


    '''上周回顾内容
    1Bytes=8bit
    1KB=1024Bytes
    1MB=1024KB
    1GB=1024MB
    1TB=1024GB
    1PB=1024TB
    字符编码
    字符编码的发展史
    字符编码表
    ASCII码 只有英文字母和符号与数字的对应关系
    用8位二进制(1bytes)表示一个英文字符

    GBK:中文 英文 符号与数字对应关系
    用2bytes表示一个中文符号 兼容英文字符

    乱码: 编码与解码不一致
    内存中unicode >>>编码(encode) 硬盘中utf-8编码
    硬盘中utf-8编码 >>>解码(decode) 内存中的unicode

    计算机内存统一使用的编码是Unicode
    Unicode两大特点:
    1,用户输入的任意字符都能正常显示(兼容万国)
    2,与任意国家的编码都有对应关系
    文件头
    #coding:gbk
    指定python解释器读取该文件使用gbk编码,而不再用默认的
    #python2在读取文件时默认使用ASCII码
    python3在读取文件时默认使用utf-8码

    识别python语法执行python代码
    python2
    如果不指定文件头 中文无法储存 因为python2解释器识别语法储存数据的时候默认使用的是ASCII
    如果指定了文件头 python2解释器识别语言储存数据的时候用文件头指定的编码
    python2中通常都在中文的字符串前面加一个u,告诉python2解释器上将数据储存为unicode形式
    python3
    字符串默认存储为unicode(******)
    保证不乱码的核心:存的时候使用的编码(encode),取的时候就用该编码(decode)

                x = ''
                # 第一种转换方式
                res1 = bytes(x,encoding='utf-8')
                print(res1,type(res1))
                res2 = str(res1,encoding='utf-8')
                print(res2,type(res2))
    
                # 第二种转换方式
                res = x.encode('utf-8')
                print(type(res))
                print(res.decode('utf-8'))




    文件处理
    一套完整的计算机系统
    应用程序

    操作系统


    计算机硬件


    什么是文件
    操作系统暴露给用户操作复杂硬盘的简易接口
    操作文件的流程:
    #1. 打开文件,得到文件句柄并赋值给一个变量
    #2. 通过句柄对文件进行操作
    #3. 关闭文件

            python代码操作文件
                f = open(文件路径,mode='读写模式',encoding='utf-8')
                f.close()
                print(f)




    f:遥控器 文件句柄


    文件的上下文管理
    with open(....) as f:
    文件操作


    文件路径
    相对路径:必须有一个参照物 通常是相对于执行文件所在的文件夹
    绝对路径:类似于GPS全球定位,不需要有任何的参照物
    r用来取消转义
    r'D:av ttxxxooo rr'

    mode不写默认用的是rt

    encoding参数只在mode位文本模式的情况下才加

                文件读写模式
                    r:只读模式
                        1.文件不存在的情况下 直接报错
                        2.文件存在的情况下 光标在文件开头
                    w:只写模式
                        1.文件不存在的情况下 自动创建新文件
                        2.文件存在的情况下 先清空文件内容再执行写入
                    a:只追加模式(只能在文件末尾添加内容)
                        1.文件不存在的情况下 自动创建新文件
                        2.文件存在的情况下 光标直接在文件末尾

    文件操作单位
    t:文本模式
    只能和r/w/a连用 并且不写的情况下 默认就是t
    b:原生的二进制数据
    只能和r/w/a连用
    该模式通常用来处理非文本文件
    直接存储网络上传输过来的二进制数据


    f.read() 一次性将文件内容全部读到内存
    当文件过大的情况下该方法可能会导致内存溢出

    f.readline():一行行的读取内容

    文件句柄f可以直接被for循环 每次for循环拿出来的就是文件一行行的内容
                for line in f:
                    print(line)
    
                
    :换行符  现在做了优化 可以只写
    或者
    
    
                f.readlines():将文件一行行的内存放是列表中 成为一个个元素
    
                f.readable():是否可读
    
                f.write()  写文件
    
                f.writeable()  是否可写
    
                f.writelines()  要接收一个容器类型
                    for i in l:
                        f.write(i)
    
                f.writeline()  写一行


    r
    w
    a
    将上面的三个模式称为纯净模式
    r+
    w+
    a+

    # with open(r'test',mode='r+',encoding='utf-8') as f:
    #     print(f.readable())
    #     print(f.writable())
    #     print(f.readline())
    #     f.write('嘿嘿嘿')
    
    
    
    # with open(r'test',mode='w+',encoding='utf-8') as f:
    #     print(f.readable())
    #     print(f.writable())
        # print(f.readline())
        # f.write('嘿嘿嘿')
    
    
    # with open(r'test',mode='r+b') as f:
    #     print(f.readable())
    #     print(f.writable())
    #     res = f.read()
    #     # print(res.decode('utf-8'))
    #     res1 = str(res,encoding='utf-8')
    #     print(res1)


    # 在rt模式下 read内的数字 表示的是字符的个数
    # 初次之外,数字表示的都是字节
    # with open(r'test','r',encoding='utf-8') as f:
    #     print(f.read(5))
    
    # with open(r'test','rb') as f:
    #     res = f.read(10)  # 读的是三个字节bytes
    #     print(res)
    #     print(res.decode('utf-8'))



    # 文件内光标的移动
    """
    f.seek(offset,whence)
    offset:相对偏移量  光标移动的位数
    whence:
        0:参照文件的开头   t和b都可以使用
        1:参照光标所在的当前位置  只能在b模式下用
        2:参照文件的末尾  只能在b模式下使用
    """
    # with open(r'test','rt',encoding='utf-8') as f:
    #     print(f.read(1))
    #     # f.seek(6,0)  # seek移动都是字节数
    #     # f.seek(4,0)  # seek移动都是字节数
    #     # print(f.read(1))
    #     f.seek(0,0)
    #     print(f.read(1))
    #     f.seek(0, 0)
    #     print(f.read(1))
    #     f.seek(6,0)
    #     print(f.read())
    
    
    
    # with open(r'test','rb') as f:
    #     print(f.read(3).decode('utf-8'))
    #     f.seek(0,0)
    #     print(f.read(3).decode('utf-8'))
    #     f.seek(7,0)
    #     print(f.read(1).decode('utf-8'))
    #     # f.seek(6,0)  # seek移动都是字节数
    #     # f.seek(4,0)  # seek移动都是字节数
    
    # with open(r'test','rb') as f:
    #     print(f.read(3).decode('utf-8'))
    #     f.seek(3,1)
    #     print(f.read(1))
        # f.seek(6,0)  # seek移动都是字节数
        # f.seek(4,0)  # seek移动都是字节数
    
    
    # with open(r'test','rb') as f:
    #     print(f.read())
    #     f.seek(-4,2)
    #     print(f.read().decode('utf-8'))
    
    # with open(r'test','r+',encoding='utf-8') as f:
    #     f.seek(3,0)
    #     f.write('过')
    
    import time
    res = time.strftime('%Y-%m-%d %X')
    # print(res,type(res))
    #
    with open(r'test01.txt','a',encoding='utf-8') as f:
        f.write('%s egon给jason发了1个亿的工资
    '%res)
    
    with open(r'test01.txt','rb') as f:
        # 先将光标移动到文件末尾
        f.seek(0,2)
        while True:
            res = f.readline()
            # 查看光标移动了多少位 bytes
            # print(f.tell())
            if res:
                print("新增的文件内容:%s"%res.decode('utf-8'))
                # 说明有人操作当前文件
            # else:
            #     # 说明文件没有被任何人操作
            #     print('暂无其他人操作该文件')
    
    with open(r'test','a',encoding='utf-8') as f:
        f.truncate(6)  # 接收的字节的长度 整型
        # 保留0~6字节数 后面的全部删除(截断)



    # 文件修改方式2
    # 创建一个新文件
    # 循环读取老文件内容到内存进行修改 将修改好的内容写到新文件中
    # 将老文件删除 将新文件的名字改成老文件名
    import os


    with open(r'test02.txt','r',encoding='utf-8') as read_f,
            open(r'test02.swap','a',encoding='utf-8') as write_f:
        for line in read_f:
            new_line = line.replace('jason','egon')
            write_f.write(new_line)
    os.remove('test02.txt')
    os.rename('test02.swap','test02.txt')



    优点:内存中始终只有一行内容 不占内存
    缺点:再某一时刻硬盘上会同时存在两个文件


    s = 'hello'
    # print(len(s))
    # 假设没有len了
    # 函数体代码定义截断只检测语法 不执行代码
    def test():
        hdhfd
        sdafsd
        sdafjsldakj
        sdfljsda;lf;lskdf;l
    
    print(test())

    """
    可以通过变量名找到变量对应的值
    可以通过函数名+括号 找到函数体所对应的代码并执行
    """


    # 函数名的命名规则跟变量名一模一样

    # 函数就是工具,并且函数必须先定义后调用(函数名+括号)






    def my_len():
        n = 0
        for i in s:
            n += 1
        print(n)
    my_len()
    my_len()
    my_len()
    
    l = [1,2,3,4,5]
    m = 0
    for j in l:
        m += 1
    print(m)



    # 将for循环的代码放到某一个地方 谁要用谁就拿

    '''
  • 相关阅读:
    linux 中的./configuration --prefix=安装路径 的用法(指定源码安装方式的安装路基)
    深入了解Activiti工作流流程定义
    ResultCode 自定义错误状态码
    maven和gradle对比
    js中的prototype原型解析
    json字符串的标准格式
    迷茫于Hibernate/JPA的人提一些建议。
    ModelDriven 和 Preparable 拦截器
    Spring中bean的scope
    spring配置文件详解以及beans:beans标签
  • 原文地址:https://www.cnblogs.com/wkq0220/p/11151475.html
Copyright © 2020-2023  润新知