• 编码和文件操作


    字符编码:

    1:文本编辑器存取文件原理

    存文件: 1先启动文本编辑器

            2写内容 内容都是保存在内存中 断电丢失  但现在的额软件强大可以定期自动保存

             3 ctrl +s 保存内存中的数据 就会被刷到硬盘中永久保存

     

    读文件:

           1 启动文本编辑器

           2把文件内容由硬盘读到内存中去

           3文本编辑器把内存中的文件内容打印到屏幕上

     

    2:

    字符编码

    内存中存着二进制编码 输出'你好'是存在内存中,通过一定的转换成机器能识别的二进制数

    这个转换要遵循一定的规律 这个规律叫字符编码

     

    什么时候有字符编码的概念

    x=1

    name='小明'

     

    程序运行过程:

    1 打开 pycharm 解释器运行到内存中

    2 把文件内容往内存中读(直接把硬盘中的数据读到内存中)

    3在解释对应的二进制显示成python指令但凡是字符就会有字符编码的概念 所以第三步

    就有字符编码的感念

     

     

    字符编码的发展史

    两位表示四中变化     00  01  10  11

    八位  2*8       256 种变化

    一个英文单词用一个8位二进制表示

    1个英文 =  8 bit = 1 Bytes

    bit  是二进制位   Bytes 是字节

    这叫 ASCII 码

     

     

    后来 当中国人使用计算机是 汉子太多  就不能用ASCII 码了

    但依然是这个原理中国加到了  16位  2*16= 65536位

    中国用  GBK 码

     

    用  1 Bytes 表示一个英文  用 2 Bytes 表示一个中文

     

    如果你把日本的软件copy到你的电脑硬盘上不能用可以存 但编码格式不一样 不能取

    不能做到字符编码的统一

    所以就有一个兼容万国的字符编码  就是unicode 编码

     

    #######内存中使用   unicode 编码 全世界的字符都建立对应的关系

    用2Bytes表示一个字符  对特殊字用更多的bytes 表示

     

    在写一个 word文档 不管用英文中文 日文 等 都是由内存转成 unicode 二进制码 再反解成人类的

    字符出现在显示器上 。但如果要存储时 就保存在硬盘上 这是如果是英文的字符就会浪费一个字节

    的空间

     

    所以 就有了一个utf-8的编码  他是Unicode的升级 版  会自动中文 3个字节 英文一个字节

     

    那么为什么内存不用utf-8 呢?因为unicode兼容以前的字符编码格式

     

    3 保证不乱码

    1内存中固定是unicode编码 唯一可以改变是存到硬盘时使用的编码

    2要想不乱码应该保证文档当初以什么编码格式存的 就应该 以什么格式取出

     

     

    python2 中

    coding:utf-8

    x='上'

    print(x)

    往空间放的值是'上'为unicode格式 而Python2 会把 x = '上'这个值转成头文件规定放在内存

    如果不写头文件 会默认为  ASCII码  如果 x= 'sadasd'不出错 因为 utf-8兼容ASCII码

    如果是x='上'中文出错

     

    python3中

    coding:utf-8

    x='上'

    print(x)

     

    python3 会把这个值转成unicode码   不会有乱码

     

    cmd 是windows提供的终端  在pycharm终端 不会乱码

     

    python2 中这样解决

    coding:utf-8

    x=u'上'           # u 表示 unicode  意思是不用费劲了 就以unicode格式存吧 不乱码

    print(x)           加小u 跨平台使用方便

     

    python3 不加 因为默认是unicode

     

     

    在python2中

    coding:utf-8

    x='上'

    print(x)

    print([x])  #  打印 3个字节的 Bytes  ['xe4xb8x8a']   头文件改问gbk  就是二个字节

     

    在python2 中有两种字符串类型

    unicode

     x=u'上'

     

     unicode

     x= '上'    如果头文件是utf-8 就存成了utf-8 格式

     

    python3  只有一种

    unicode

    x='上'

     

     

     

    4 编码与解码
    unicode转成其他编码 叫编码  encode**************
    其他码 转成 unicode 叫解码  decode*********

    python2 中
    coding:gbk
    x='上'
    x.encode('utf-8')   #  这是  gbk 转unicode 所以是 解码
    x.decode('utf-8')   # 可以解 但报错 因为存是gbk 解码也要 gbk
    改为
    x.decode('gbk')
    res=x.decode('gbk')
    print([res,])  # 内部是[,]表示看二进制数是多少


    python 3  中没有解码  decode  只有编码encode 可以编码任意编码**********
    x='上'
    print(type(x))
    res=x.encode('gbk')
    print(res)    # 输出有一个b 前缀有一个b  表示 bytes 相当于 二进制
    s=res.decode('gbk')
    print(s)

    总结:
    在python3中的字符串类型 str 都是unicode 编码
    在python2 中的字符串类型str 都是unicode按照文件头指定的编码
    在python2中也可以制造unicode编码的字符串需要在字符串前加  u  跨平台不乱码
    所以在python3中的字符串类型可以编码成其他任意字符编码的格式  结果是bytes 类型

    # str  转   bytes
    x='上'
    b=x.encode('utf-8')
    print(b)

    # bytes  转  str
    s=b.decode('utf-8')
    print(s)
    x='wwwww'
    b=x.encode('utf-8')
    print(b)
    s=b.decode('utf-8')
    print(s)

     

     

     

     

    文件操作

    绝对路径

    f = open('d:模特主妇护士班主任.txt',mode='r',encoding='UTF-8')

    content = f.read()

    print(content)

    f.close()          # 关闭文件

     

     

     

    f = open('模特主妇护士班主任',mode='rb',)   # b  是指读取内容为图片视频等不指定编码输出是一些二进制btyes

    content = f.read()

    print(content)

    f.close()

     

     

     

    对于w:没有此文件就会创建文件    只写w  前提是没有log'文件 没有创建文件  有先将源文件清空在写

    f = open('log',mode='w',encoding='utf-8')

    f.write('骑兵步兵')

    f.close()

     

    先将源文件的内容全部清除,在写。

    f = open('log',mode='w',encoding='utf-8')

    f.write('附近看到类似纠纷')

    f.close()

     

     

     

     

    f = open('log',mode='wb')

    f.write('附近看到类似纠纷'.encode('utf-8'))   #附近看到类似纠纷 是写的文件内容  utf-8是指定的编码

    f.close()

     

    f = open('log',mode='a',encoding='utf-8')  #原理就是光标默认移到最后一位然后把内容追加到后面

    f.write('佳琪')

    f.close()

    只能有一步操作 两步就报错所以有了'a+'模式

     

     

    f = open('log',mode='a+',encoding='utf-8')

    f.write('佳琪')

    f.seek(0)

    print(f.read())

    f.close()

     

    读写模式  r+

    f = open('log', mode='r+', encoding='utf-8')

    print(f.read())

    f.write('大人,小孩')

    print(f.read())

    f.close()

     

    由原来文件写的内容是python9 ,输出是pytho9 是因为写文件写哪光标移哪

    看到就要用f.seek(0)调光标

     

    写在前r+模式

    f = open('log', mode='r+', encoding='utf-8')

    f.write('你')

    print(f.read())

    f.close()

     

     

     

    在文件中存的是python9结果输出hon9 前面3个字节被中文你覆盖掉了

    写文件会从头开始写写完光标停在h 上后面就没有覆盖

     

    写读文件w +

    f=open('log',mode='w+',encoding='utf-8')

    f.write('附近')

    f.read()

    f.close()

    输出没有任何值 打开文件是附近,因为写的模式是没有创建有清空在写。不打印任何

    想看可以调光标 f.seek()

     

    功能详解

    1

    f = open('log',mode='r+',encoding='utf-8')

    content = f.read(3)  # 读出来三个字符

    print(content)

    f.close()

    # 输出  abd 三个字符  或  你好啊三个字符

    # 小节:read(3)读出文件的最小单位  为一个字符中英文都是一个字符

     

     

    2

     

    f = open('log',mode='r+',encoding='utf-8')

    # f.seek(3) # 调光标 调到三个字节从第四个字节开始读

    # print(f.read())

    # f.close()

    # 文件中分别写进‘asdfgh’ 和‘附近的二哥’  分别读到  ‘fgh’  和‘近的二哥’

    # 小节:utf-8一个中文三个字节  一个英文 一个字节

    # seek(3)是安字节定光标

    # read(3)是安字符定光标

     

    3

     

    f= open('log',mode='r+',encoding='utf-8')

    f.seek(3)  # 是按照字节定光标的位置

    f.tell() # 告诉你光标的位置 安字节

    print(f.tell())

    print(f.read())

    f.close()

     

    4

    f = open('log',mode='r+',encoding='utf-8')

    f.write('佳琪')# 读不出因为光标在最后

    count=f.tell()#找光标的位置

    f.seek(count-6)# 中文三个字节  两个中文

    print(f.read())#读出佳琪

    f.close()

     

    其他功能

     

    f.readable()  # 判断是否可读

    line = f.readline()  # 一行一行的读

    line = f.readlines()  # 每一行当成列表中的一个元素,添加到list中

    f.truncate(4)

     

     

    f= open('log',mode='r+',encoding='utf-8')

    for line in f:

        print(line)

    文件太大不能用

     

     

    5

    另一种写法 防止忘记关闭文件 f.close()

    with open('log',mode='r+',encoding='utf-8') as f:

        f.read()

        print(f.read())

     

    可以打开多个文件:

    with open('log',mode='r+',encoding='utf-8') as f,

            open('log',mode='w+',encoding='utf-8') as f1:

        print(f.read())

        print(f1.read())

     

    # 注册登录

    username = input('请输入你要注册的用户名:')

    password = input('请输入你要注册的密码:')

    with open('list_of_info',mode='w',encoding='utf-8') as f:

        f.write('{} {}'.format(username,password))

    print('恭喜您,注册成功')

    lis = []

    i = 0

    while i < 3:

        usn = input('请输入你的用户名:')

        pwd = input('请输入你的密码:')

        with open('list_of_info',mode='r+',encoding='utf-8') as f1:

            for line in f1:

                lis.append(line)

        if usn == lis[0].strip() and pwd == lis[1].strip():

            print('登录成功')

            break

        else:print('账号和密码错误')

        i+=1

  • 相关阅读:
    h5手机页面注册处理(短信验证)
    jq倒计时
    Unity实现Android端视频播放
    Unity中自定义扩展方法
    UGUI中粒子特效与UI的遮挡问题
    Unity中各种格式计时器
    Unity中锚点的动态设置
    unity中调试模型时unity崩溃问题
    具体分析UGUI中RectTransform
    unity中加载场景不销毁以及切换场景重复实例化
  • 原文地址:https://www.cnblogs.com/andy117/p/11005612.html
Copyright © 2020-2023  润新知