2019-07-05 编码格式和文件操做

1、字符编码python

  字符编码针对的是文字,字符编码只跟文本有关,这里不须要考虑视频、音频等其余文件。windows

  人在操做计算机的时候输入的是人能看懂的字符,可是计算机只能识别010101这样的二进制数据,那么就须要用字符编码表来处理字符与数字的对应关系。编码

  最先的是ASCII表,用八位二进制表示一个英文字符,可是它只能表示英文和一些符号,不适合中文。因此中国本身出了一个GBK编码格式,用2Bytes表示一个中文字符。基于上面的推导,每一个国家的文字都不同,那么用的编码格式也不同,若是要相互使用就很方便。因此出了一个万国码unicode,统一用2Bytes表示全部字符。spa

  unicode有两个特色:1.由于全部字符都是用2Bytes表示字符,因此会浪费不少存储空间。2.io次数增长,程序运行效率下降(这个是致命的)操作系统

  后面针对这两个特色进行修改:当内存中的unicode编码格式数据存在硬盘的时候,会按照utf-8编码。将unicode的英文字符由原来的2Bytes变成1Bytes。将unicode中文字符由原来的2Bytes变成3Bytes。code

  如今的计算机:视频

    内存是unicode对象

    硬盘是utf-8blog

  须要掌握的:内存

    unicode的两个特色:

      1.在用户输入的时候,不管输入什么字符都可以兼容万国字符

      2.其余国家编码的数据由硬盘读到内存的时候unicode与其余国家的编码都有对应的关系。

    数据由内存存到硬盘:

      1.内存中的unicode格式二进制数据      >>>经过编码(encode)>>>      硬盘中utf-8格式的二进制数据

      2.硬盘中utf-8格式的二进制数据     >>>经过解码(decode)>>>      内存中unicode格式的二进制数据

    咱们要清楚文件为何会乱码:由于文件存的格式和读取的格式不同(******)

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(res)    #b'\xe4\xb8\x8a'
print(type(res))    #<class 'bytes'>
print(res.decode('utf-8'))    #

 

  这里有个python2和python3的不一样点:

  python2:将py文件按照文本文件读入解释器默认使用ASCII码

  python3:将py文件按照文本文件读入解释器中默认使用utf-8

文件头:# coding:utf-8   在py文件开头写这个文件头,编码格式会自动转为这个

 

补充:1.pycharm终端使用的是utf-8格式

   2.windows终端采用的是gbk

字符编码总结:

  咱们用代码来举例:

    x = '上'

    res1 = x.encode('utf-8')    #将unicode编码变成能够存储和运输的utf-8的二进制数据

    res2 = res1.decode('utf-8')  #将硬盘中utf-8格式的二进制数据解码成unicode格式的二进制数据

 

2、文件操做

    文件处理包括三个步骤:  打开(open) /读写(read,write)/  关闭(close) 

# 经过python代码操做文件
# r取消转义
 f = open(r'D:\Python项目\day07\a.txt',encoding='utf-8')  # 向操做系统发送请求  打开某个文件
# 应用程序要想操做计算机硬件 必须经过操做系统来简介的操做
 print(f)  # f是文件对象
 print(f.read())  # windows操做系统默认的编码是gbk
 f.read()  # 向操做系统发请求 读取文件内容
 f.close()  # 告诉操做系统 关闭打开的文件
 

    用open打开的文件必定要记得写close关闭

    上面的这种操做方法比较复杂,因此出了文件上下文操做

    with open  的方法,这个用法不用写close,还能够同时打开几个文件。

with open(r'D:\Python项目\day07\a.txt',encoding='utf-8') as f ,\
        open(r'D:\Python项目\day07\b.txt',encoding='utf-8') as f1:  # f仅仅是一个变量名 你把它当作是一个遥控器
    print(f)
    print(f.read())
    print(f1)
    print(f1.read())

    文件打开模式:

      r  只读模式     默认的模式

      w  只写模式

      a  追加写模式

    操做文件单位的方式:

      t    文本文件    默认的,能够不用写,在操做文本文件的时候,必定要指定encoding参数,若是不添加encoding参数默认是操做系统的默认编码(gbk)

      b   二进制数据文件(好比视频,音频文件)     若是用了这个就不要写encoding参数

    r   只读模式

      r模式在打开文件的时候,若是文件不存在直接报错

      有三种读取方式:read,readline,readlines

        read:一次性将文件所有读取,返回的数据是字符串格式,缺点是若是文件太大,会占满内存

        readline:读取文件内容的一行,返回的数据也是字符串格式

        readlines:每一行每一行的读,每一行当成一个字符串,全部数据放在一个大列表当中

 
#读取文本文件用rt
with open(r'D:\Python项目\day07\a.txt',mode='rt',encoding='utf-8') as f:
     print(f.readable())  # 是否可读
     print(f.writable())  # 是否可写
     print(f.read())  # 一次性将文件内容所有读出
   for i in f: #f能够被for循环 每for循环一次,就读取一行内容
      print(i) #这个方法能够解决一次性读取文件占用内存过大的问题
#读取二进制文件用rb with open(r'D:\Python项目\day07\1.jpeg',mode='rb') as f: print(f.readable()) # 是否可读 print(f.writable()) # 是否可写 print(f.read()) # 一次性将文件内容所有读出 print(f.read()) # 读完一次以后 文件的光标已经在文件末尾了,再读就没有内容了可读 print(f.readlines()) # 返回的是一个列表 列表中的一个个元素对应的就是文件的一行行内容

    w  只写模式(这个模式要慎用,若是文件自己有内容的话,写入的时候会被清空

        1.当文件不存在的时候,会自动建立文件

        2.当文件存在的时候,先清空文件内容,而后再写入

        有三种写入方式:write/writeline/writelines

 with open(r'xxx.txt',mode='w',encoding='utf-8') as f:
     print(f.readable())  # 是否可读
     print(f.writable())  # 是否可写
     f.write('不不不,你没有翻~\n')
     f.write('不不不,你没有翻~\n')
     f.write('不不不,你没有翻~\n')
     f.write('不不不,你没有翻~\r')
     f.write('不不不,你没有翻~')


     l = ['不sdffs,sdfs有翻~\n','不sdfsdf不,你sdfsf翻~\n','不sfad不,你没sa翻~\n']
     f.writelines(l)
     # 上下等价
     for i in l:
         f.write(i)

    a      追加模式

      1.在文件不存在的状况下,自动建立文件

      2.当文件存在的状况下,不清空文件内容,文件光标会移动到文件的最后,在原有的基础上追加

    a模式不可读,只能写

with open(r'yyy.txt',mode='a',encoding='utf-8') as f:
    print(f.readable())  # 是否可读   False
    print(f.writable())  # 是否可写   True
    f.write('我是小尾巴\n')

 

具体的详细内容能够参考:http://note.youdao.com/noteshare?id=17303322fcbc09a85d9bd5195dec25ae&sub=F9D47851E02B4CB7A341119637EC6BAE

相关文章
相关标签/搜索