zoukankan      html  css  js  c++  java
  • 字符编码 文件处理

    字符编码
    1、软件启动流程(打开notepad++文档)
    从硬盘将软件加载到内存上
    加载test.txt到内存中
    执行notepad++的代码,将test.txt打到屏幕上

    python解释器也是一个应用软件
    从硬盘将软件加载到内存上
    加载test.py文件读到内存
    解释器解析python语法
    文本编辑器与解释器打开文件的前两个阶段的是一致的,仅第三个阶段不同

    什么是字符编码?字符编码表
    编码:按照某种规范将数据转换为二进制
    为什么要编码?
    计算机只能识别0和1,那么使用计算机就必须使用二进制的方式告诉计算机
    这是一个复杂的过程,所以需要一种解决的方法让计算机识别人类的语言
    字符编码的发展史
    1、美国使用Ascii编码表
    2、其他的国家也需要使用计算机,于是每个国家都推出自己的编码表
    中国-GBK
    日本-shift-j
    因为每个编码表互补兼容,导致乱码
    3、为了统一全世界产生Unicode编码(万国编码)
    1、统一全世界的编码
    2、必须还兼容之前的GBK、shift-j编码
    Ascii:用八个二进制位(一个字节bytes)
    1111 1111 2**8=255
    GBK:英文字母在GBK中占一个字节
    中文占两个字节 16个二进制位 2**16-1=65535
    你Y好
    1111 1111 1111 1111
    如果一个字节的首位为1,表示一个中文
    如果一个字节的首位为0,表示一个英文
    GBK 不仅仅要存储数据,还要计算每个符号
    unicode:无论是英文还是其他字符,都是两个字节
    为什么这么设计
    1、是为了提高效率,而采取的空间换时间
    缺点:
    2、浪费硬盘空间,降低网络传输效率
    为了解决上述unicode退出UTF-8
    utf-8是可变长的
    英文占一个字节
    中文占三个字节
    与GBK相同的是,都需要计算存几个字节,所以不适合内存
    使用与:硬盘和网络传输
    结论:内存中用unicode,硬盘或网络传输中用utf-8
    用户驶入->内存(unicode)->转换为(utf-8)->硬盘 该过程为编码就是字符转换为二进制的过程
    硬盘上的a.txt(utf-8的二进制)-> unicode的二进制-查编码表得到符号--显示到屏幕上
    该过程称之为解码,把二进制转化为符号
    乱码问题?
    1、存储是与取出时使用的编码不一致,只要找到正确的编码数据还可以恢复
    2、存的时候就已经乱了(文档中的内容超出了采用的编码表的范围),数据将丢失解决方法是用utf-8编码表
    如何解决文件乱码问题
    python在执行代码之前必须从硬盘加载到内存,硬盘中都是二进制,必须要用UNICODE编码表
    name解释器怎么知道你采用的什么编码方式?
    如果不明确自定,解释器将采用默认的解码方式,在python3中默认的是UTF-8字符编码,在python2中默认的ASCII码
    当你使用pathon中则需要手动指定编码方式 设置文件头 #coding:utf-8
    name=u'张全蛋‘
    #u 表示将这个变量存储为unicode 编码,可以防止取出变量时乱码
    1个16进制=0.5个字节

    encode unicode =>utf-8 将Unicode的字符转化为二进制
    decode utf-8 ->unicode 将二进制转化为Unicode


    文件处理:
    文件是什么?
    文件是操作系统提供的虚拟概念
    文件这个概念的自所以出现是为了简化对硬盘的操作
    学习文件处理是为了将数据永久保存

    1、打开文件
    f=open('test.txt,encoding='utf-8))#是给操作系统一个指令,让操作系统去打开文件,应为应用程序无法直接控制硬盘
    2、读取内容
    data=f.read()
    print(data)

    # 使用循环 来读取全部内容 方式1
    # with open(r"D:sh_fullstack_s6day8代码 est.txt",mode="r",encoding="utf-8") as f:
    # while True:
    # line = f.readline()
    # if not line: # 如果line为空则表示没有内容了
    # print(" 没有内容啦!")
    # break
    # print(line,end="")

    # 使用循环 来读取全部内容 方式2
    # with open(r"D:sh_fullstack_s6day8代码 est.txt",mode="r",encoding="utf-8") as f:
    # for line in f:
    # print(line,end="")

    # 一次性读取全部
    # with open(r"D:sh_fullstack_s6day8代码 est.txt",mode="r",encoding="utf-8") as f:
    # print(f.readlines()) # 会将每一行放入列表中


    3、关闭文件
    f.close()
    总结:open read close 等都是在给操作系统发送指令
    打开文件的语法二:在with 代码执行完毕后会自动调用close
    with open('test.txt') as f:
    data=f.read()


    参数1 文件路径 可以相对,也可以是绝对
    mode 打开文件的模式 r(只读)
    w(只写)

    # 注意在w模式下 一旦打开文件 立即清空原来的内容 如果文件不存在则创建新文件
    # 写入字符串时需要手动拼接换行符
    with open(r"D:sh_fullstack_s6day8代码 est.txt",mode="w",encoding="utf-8") as f:
    f.write("爱根 ")
    print(f.writable())
    f.writelines(" ".join(["abc","cba","nba"]))
    # f.writelines({"name":"bgon","age":20})
    pass



    #
    with open("新文件.txt",mode="w")as f:
    pass


    +(可读可写)了解即可

    + 表示可读可写模式
    w+ 清空原文件,如果不存在则创建
    r+ 如果不存在则报错
    a+ 如果不存在则创建,光标移动到最后
    可读可写:可用于文本处理,但对于写别的文件,一般不用,容易造成文件的破坏打不开
    Windows默认
    读取内容:可以用参数指定要读取的个数,默认为-1表示全部读取
    需要注意read(-1)仅限于文件较小时,如果内存过大会造成内存溢出
    data=f.read(2000)

    读取相关函数
    read()读取全部
    read(size)读取指定大小
    readlines ()读取全部
    readline()读一行
    readable()判断是否可读

    注意在w模式写,一旦打开文件 立即清空原来的文件,如果文件不存在则创建一个新文件 

    在操作非文本文件时,(读一个图片)必须明确指定模式为字节模式
    b 用来指定为字节模式
    b必须与r/w连用 rb/wb
    注意、
    b必须与r/w连用 rb/wb
    当模式为字节模式时,不能指定encoding参数
    默认情况下,读写文本模式,也就是t模式,同样需要与r/w连用

    t模式下python解释器会自动转码解码而b模式不会

    当模式为字节模式时单位为字节

    在b模式下只能写入字节

    print(data)
    f.close()
    print(f.readable())判断是否可读
    print(f.wrireable())判断是否可写

    a表示追加写入模式,不会清空原数据,会自动把光标移到最后
    with open (r'文件路径’,‘at’(文档模式)/'ab'(b模式),encoding='utf-8')

    控制文件的打开模式
    rwa+
    控制操作文件内容的模式
    t

    t必须与打开模式连用
    各种组合如下:
    rt、wt、at、rb、wb、ab、r+、w+、a+

    关于文件操作的常用函数
    read
    readline
    readlines
    readable

    write
    writelines
    writeable

    关于编码的两个函数
    encode 编码
    decode 解码




  • 相关阅读:
    HDU5792 World is Exploding(树状数组)
    POJ3415 Common Substrings(后缀数组 单调栈)
    POJ2406 Power Strings(KMP,后缀数组)
    HDU5489 Removed Interval(动态规划)
    HDU1899 Sum the K-th's(树状数组)
    Codeforces Round #363 Fix a Tree(树 拓扑排序)
    数组-07. 求一批整数中出现最多的个位数字
    数组-06. 找出不是两个数组共有的元素
    数组-05. 字符串字母大小写转换
    数组-04. 查找整数
  • 原文地址:https://www.cnblogs.com/tangda/p/10234363.html
Copyright © 2011-2022 走看看