字符编码及文件操作

一、字符编

1.什么是字符编码:将人能识别的字符转换为计算机能识别的01二进制的过程就是字符编码,转换的规则就是字符编码表

2.常用的编码表:ASCII、GBK、Unicode、UTF-8
    了解:编码表的发展史

    1. ascii(ASCII):字母、数字、英文符号与计算机01标识符的对应关系
     思考:如何将128个字符用01完全标签
     二进制:11111111 => 255 => 1bytes(1字节) => 8个二进制位

    2.中国:研究汉字与计算机01标识符的对应关系:gb2312 => GBK(***) => GB18030
     日本:Shift_JIS
     韩国:Euc-kr

    3.万国码unicode
    优点:统一用2Bytes表示所有的字符(任何国家都能使用)
    例: a 0000 0000 0010 1010
    缺点:
    1.浪费存储空间
    2.io次数增加,程序运行效率降低(致命)
    现在的计算机
    内存都是unicode
    硬盘都是utf-8
    (需要掌握的)
    unicode的两个特点
    1.兼容万国字符
    2.其他国家编码的数据由硬盘读到内存的时候unicode与其他各个国家的编码都有对应关系
    (必须掌握的)
    数据由内存保存到硬盘
    1.内存中的Unicode二进制数字 >>>编码(encode)>>> utf-8格式的二进制数据
    硬盘中的数据由硬盘读到内存
    1.硬盘中的utf-8格式的二进制数据 >>>解码(decode)>>> 内存中unicode格式的二进制数据


    python2
   (将py文件按照文本文件读入解释器)默认使用ASCII码(因为再开发python2解释器的时候 unicode还没有盛行)
    python3
   (将py文件按照文本文件读入解释器)默认使用utf-8

    # 思考:unicode与utf-8什么关系
    unicode:用2个字节来存储汉字,用2个字节来存储英文字母,占有空间较多,读取效率极高
    utf-8:用3-6个字节来存储汉字,用1个字节来存储英文字母,占有空间较少,读取效率低
    总结:内存都是按unicode存储数据,硬盘和cpu采用utf-8来存取数据
    #“abc你好”

    unicode与utf-8采用的是一张unicode编码表,utf-8是unicode编码表体现方式,变长存储数据。
    变长优点:(大量数据都是以英文存在,所以utf-8空间更小)传输速度更快


3.编码操作:编码encode()、解码decode()
    s = '123呵呵'

    n_b = bytes(s, encoding='utf-8')
    print(n_b)

    b = b'123\xe5\x91\xb5\xe5\x91\xb5'
    n_s = str(b, encoding='GBK')
    print(n_s)

    在清楚原格式是字符串还是二进制时:

    # 将u字符串编码成b字符串

    print(u'你好'.encode('utf-8'))
    # 将b字符串解码成u字符串
    print(b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode('utf-8'))
    文件头:
    # coding:utf-8
    1.因为所有的编码都支持英文字符,所以文件头才能够正常生效

    python2存数据的时候可以
    x = u'上' # 前面加个u 就以unicode格式存数据
    print type(x)
    print x
    基于python2解释器开发的软件,只要是中文,前面都需要加一个u
    为了的就是将python2(当你不指定文件头的时候,默认用ASCII存储数据,如果指定文件头那么就按照文件头指定的格式存储)

    python3中字符串默认就是unicode格式的二进制数

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

    乱码:字符不能够正常显示 编码不一致
    (******)
    保证不乱码的关键:
    文本文件以什么编码编的就以什么编码解码
    八位二进制也叫8bit
    8bit = 1Bytes
    1024Bytes = 1KB
    1024KB = 1MB
    1024MB = 1GB
    1024GB = 1TB
    1024TB = 1PB


二、文件操作

1.什么是文件?
操作系统提供给用户操作复杂硬件(硬盘)的简易接口

2.为什么要操作文件?
人或者应用程序需要永久的保存数据

3.如何用?
通过python代码操作文件
r 取消转义
f.open
  r'D:\day 06\db.txt',encoding='utf-8'
  文件打开的模式
  r 只读模式
  w 只写模式
  a 追加模式
  操作文件单位的方式
  t 文本文件 t在使用的时候需要指定encoding参数 如果不指定 默认是操作系统的默认编码
  b 二进制操作 一定不能指定encoding参数

  1.应用程序要想操作计算机硬件 必须通过操作系统来简介的操作
   
 f = open(r'D:\day 06\db.txt',encoding='utf-8')  # 向操作系统发送请求 打开某个文件
    print(f)  # f是文件对象
    print(f.read())  # windows 操作系统默认的编码是gbk
    f.read()  # 想操作系统发请求 读取文件内容
    f.close()  # 告诉操作系统关闭打开的文件
    print(f.read())

  2.文件上下文操作
    with open(r'D:\day 06\db.txt',encoding='utf-8') as f:  # f仅仅是一个变量名
        print(f)
        print(f.read())

    mode 参数可以不写 不写的话默认是rt 只读文本文件 这个t不写默认就是t
    with open(r'D:\day 06\db.txt', mode='r' ,encoding='utf-8') as f:
        print(f.readable()) # 是否可读
        print(f.writable())  # 是否可写
        print(f.read())  # 一次性将文件内容全部都出

    with open(r'D:\day 06\1.jpg', mode='rb') as f:
        print(f.readable())  # 是否可读
        print(f.writable())  # 是否可写
        print(f.read())  # 一次性将文件内容全部都出

    3.r模式再打开文件的时候 如果文件不在 直接报错(*****)
    文件路劲可以写相对路径 需要注意该文件必须与执行文件在同一层文件下
    with open(r'db.txt', 'r' ,encoding='utf-8') as f:
        print(f.readable()) # 是否可读
        print(f.writable())  # 是否可写
        print('>>>>>:1')
        print(f.read())  # 一次性将文件内容全部都出
        print('>>>>>:2')
        print(f.read())  # 读完一次之后 文件的光标已经再文件末尾了,再读就没有内容可读了
        print(f.readlines()) # 返回的是一个列表 列表中的一个个元素对应的就是文本中一行行的内容
        for i in f:
            print(f)
        print(f.readline())  #  只读取文件一行
        print(f.readline())
        print(f.readline())
        print(f.readline())

    4.w模式:一定要慎用
      1.文件不存在的情况下,自动创建该文件
      2.当文件存在的情况下 先会清空文件内容再写入
    with open(r'jason.txt', 'w' ,encoding='utf-8') as f:
        print(f.readable()) # 是否可读
        print(f.writable())  # 是否可写
        print(f.write('鸡哥张江第一大帅逼\n'))
        print(f.write('鸡哥虹桥第一大帅逼\n'))
        print(f.write('鸡哥上海第一大帅逼\n'))
        l = ['鸡哥张江第er大帅逼\n','鸡哥虹桥第一大帅逼\n','鸡哥上海第一大帅逼\n']
        print(f.writelines(l))

    5.a模式
      1.文件不存在的情况下,自动创建该文件
      2.当文件存在的情况下 不清空文件内容,文件的光标会移动到文件末尾
    with open(r'jason.txt', 'a' ,encoding='utf-8') as f:
        print(f.readable()) # 是否可读
        print(f.writable())  # 是否可写
        f.write('鸡哥说:我是大帅逼\n')

 

  4.游标

    1. 如何使用游标:游标的相关方法
    2. 游标相关的读写操作
    3. 根据游标在大文件中取出多个指定位置的部分字节内容

    seek(偏移量, 偏移位置)
    偏移量以字节为单位
    偏移位置:
    0 -- 文件开头
    1 -- 当前位置
    2 -- 文件末尾
在rt模式下 read内的数字 表示的是字符的个数
初次之外,数字表示的都是字节
with open(r'test','r',encoding='utf-8') as f:
    print(f.read(5))

with open(r'test','rb') as f:
    res = f.read(10)  # 读的是三个字节bytes
    print(res)
    print(res.decode('utf-8'))


文件内光标的移动
"""
f.seek(offset,whence)
offset:相对偏移量  光标移动的位数
whence:
   0:参照文件的开头   t和b都可以使用
  1:参照光标所在的当前位置  只能在b模式下用
  2:参照文件的末尾  只能在b模式下使用
"""
with open(r'test','rt',encoding='utf-8') as f:
    print(f.read(1))
    # f.seek(6,0)  # seek移动都是字节数
    # f.seek(4,0)  # seek移动都是字节数
    # print(f.read(1))
    f.seek(0,0)
    print(f.read(1))
    f.seek(0, 0)
    print(f.read(1))
    f.seek(6,0)
    print(f.read())



with open(r'test','rb') as f:
    print(f.read(3).decode('utf-8'))
    f.seek(0,0)
    print(f.read(3).decode('utf-8'))
    f.seek(7,0)
    print(f.read(1).decode('utf-8'))
    # f.seek(6,0)  # seek移动都是字节数
    # f.seek(4,0)  # seek移动都是字节数

with open(r'test','rb') as f:
    print(f.read(3).decode('utf-8'))
    f.seek(3,1)
    print(f.read(1))
    f.seek(6,0)  # seek移动都是字节数
    f.seek(4,0)  # seek移动都是字节数


with open(r'test','rb') as f:
    print(f.read())
    f.seek(-4,2)
    print(f.read().decode('utf-8'))

with open(r'test','r+',encoding='utf-8') as f:
    f.seek(3,0)
    f.write('')
View Code
 

   5.其他模式补充

    r+/w+/a+  

with open(r'test',mode='r+',encoding='utf-8') as f:
    print(f.readable())
    print(f.writable())
    print(f.readline())
    f.write('嘿嘿嘿')



with open(r'test',mode='w+',encoding='utf-8') as f:
    print(f.readable())
    print(f.writable())
    print(f.readline())
    f.write('嘿嘿嘿')


with open(r'test',mode='r+b') as f:
    print(f.readable())
    print(f.writable())
    res = f.read()
    # print(res.decode('utf-8'))
    res1 = str(res,encoding='utf-8')
    print(res1)

  6.截断文件

截断前:
with open(r'test','a',encoding='utf-8') as f:
    f.truncate(6)  # 接收的字节的长度 整型
    # 保留0~6字节数 后面的全部删除(截断)
截断后:

错误案例:

with open(r'test','a',encoding='utf-8') as f:
f.truncate(4) # 每个汉字所占字节数为3位 如果不是3的倍数 则会出现乱码

 

 

  7.修改文件

'''
优点:任意时间硬盘上只有一个文件 不会占用过多硬盘空间
缺点:当文件过大的情况下 可能会造成内存溢出
'''


# 修改文件方式1:
with open(r'test','r',encoding='utf-8') as f:
    data = f.read()
with open(r'test','w',encoding='utf-8') as f:
    res = data.replace('jason','egon')
    f.write(res)

'''
优点:任意时间硬盘上只有一个文件 不会占用过多硬盘空间
缺点:当文件过大的情况下 可能会造成内存溢出
'''

# 修改文件方式2:
import os
with open(r'test','r',encoding='utf-8') as read_f,\
    open(r'base','w',encoding='utf-8') as write_f:
    for line in read_f:
        new_line = line.replace('egon','tank')
        write_f.write(new_line)
os.remove(r'test')
os.rename('base','test')

'''
优点:内存中始终只有一行内存  不占内存
缺点:在某一时刻硬盘上会同时存在两个文件
'''

 

转载于:https://www.cnblogs.com/linxidong/p/11139604.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值