1,字符编码

2,文件操作

1024TB = 1PB

字符编码 用8位二进制(1bytes)表示一个英文字符

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

            shift

            euck
    乱码: 编码与解码不一致
        内存中unicode     >>>编码(encode)          硬盘中utf-8编码
        硬盘中utf-8编码   >>>解码(decode)          内存中的unicode
现在的计算机内存中统一用的都是unicode
    unicode两大特点:
        1.用户无论输入哪个国家的字符都能够正常显示(兼容万国)
        2.与任意国家的编码都有对应关系

    文件头
          # coding:gbk
          指定python解释器读取该文件使用gbk编码,而不再用默认的

          python2在读取文件默认使用的是ASCII码
          python3在读取文件默认使用的是utf-8码

 

识别python语法执行python代码      x = '上'

        python2  如果不指定文件头 中文没法存储   那是因为python2解释器识别语法存储数据的时候默认使用的是ASCII
                 如果指定了文件头 python2解释器识别语法存储数据的时候使用文件头指定的编码

                 python2中通常都会在中文的字符串前面加一个u
                 x = 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'))

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

        操作系统
计算机硬件
什么是文件
        操作系统暴露给用户操作复杂硬盘的简易接口

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

 

f:遥控器   文件句柄
文件的上下文管理
            with open(....) as f:
                文件操作
文件路径
            相对路径:必须有一个参照物 通常是相对于执行文件所在的文件夹
            绝对路径:类似于GPS全球定位,不需要有任何的参照物
        r用来取消转义
            r'D:av\ttt\xxx\ooo\rrr'

        mode不写默认用的是rt

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

 

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

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

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

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

        文件句柄f可以直接被for循环 每次for循环拿出来的就是文件一行行的内容
        for line in f:
            print(line)

        \r\n:换行符  现在做了优化 可以只写\r或者\n

        f.readlines():将文件一行行的内存放是列表中 成为一个个元素

        f.readable():是否可读

        f.write()  写文件

        f.writeable()  是否可写

        f.writelines()  要接收一个容器类型
            for i in l:
                f.write(i)

        f.writeline()  写一行
其他模式补充
        r+
        w+
        a+
    文件内光标移动
        在rt模式下read内n表示的读取字符的个数
        其他情况及其他方法内n表示都是字节数
        f.read(n)
    f.seek(offset,whence)
        offset:指定光标的偏移量
        whence:模式
            0:相对于文件开头               t和b下都可以正常使用
            1:相对于光标所在的当前位置     只能在b模式下使用
            2:相对于文件末尾               只能在b模式下使用

        牢记:中文在utf-8中用3个bytes表示,英文用一个bytes

    检测文件是否被修改
        打开文件 利用f.seek(0,2)将光标移动到文件末尾
        利用while循环
            再利用readline()来读取末尾内容
            在通过if判断看readline()是否有值,有值说明文件新增了内容
            通过字符串的格式化输出将新增的文件内容输出给检测程序
    查看当前光标移动了多少字节
        f.tell()
    截断文件内容
        f.truncate()  括号内输入的数字 表示的是字节数
    将内存中的文件内容直接刷到硬盘
        f.flush()

    硬盘删除的数据原理

    文件修改
        两种方式
            第一种将文件内容先读取到内存在内存中完成修改,然后重新覆盖原文件
                优点:硬盘上始终只有一个文件
                缺点:内存很有可能会溢出 当文件内容过大的情况下
            第二种重新创建一个新的文件,将老文件的内容一行行读入内存完成修改
            直接写到新的文件中,利用os模块将原文件删除,将新文件的名字改为来文件的名字
                优点:内存中始终只有文件的一行内容 不占用内存
                缺点:硬盘上在某一时刻会出现两个文件

    函数
        什么是函数
            函数就是具有某个具体功能的工具
        为什么要用函数
            提供开发效率
            减少代码冗余
            提高程序的扩展性



        定义一个函数
        def是定义函数的关键字
        函数名:函数名的命名规则与变量名一致
                1.不能以关键字(******)
                2.函数也应该做到见名知意

        函数在定义的时候只检测函数体语法 不执行函数体代码

        def func():
            print('hello')

        调用函数的固定格式
            函数名+括号
            函数名只要遇到括号会立即执行函数体代码
            代码中遇到函数名加括号 优先级最高
            先去执行函数 再看下面的代码