zoukankan      html  css  js  c++  java
  • 编码和文件操作

    字符编码:

    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

  • 相关阅读:
    53. Maximum Subarray
    64. Minimum Path Sum
    28. Implement strStr()
    26. Remove Duplicates from Sorted Array
    21. Merge Two Sorted Lists
    14. Longest Common Prefix
    7. Reverse Integer
    412. Fizz Buzz
    linux_修改域名(centos)
    linux_redis常用数据类型操作
  • 原文地址:https://www.cnblogs.com/andy117/p/11005612.html
Copyright © 2011-2022 走看看