Day 07 Day08 字符编码与文件处理

1.字符编码: 只针对文字    ***

  1.字符编码表发展史: ASCII 码表 >>>> 各国自己语言的字符编码表>>>>万国码(unicode)

  2: ASCII表:用8个比特位表示(1个字节)一个英文字符。 

  3:gbk: 用2个字节来表示一个中文字符,还是用一个bytes 表示一个英文字符

  4:unicode: 统一用2个字节表示所有字符,兼容各国编码

    特点:(1)用户在输入时无论输入什么字符都兼容万国字符

       (2)其他国家编码的数据由硬盘读取到内存的时候unicode与其他各个国家的编码都有对应关系

    缺点: (1)浪费存储空间

       (2)io次数增加,程序运行速度降低(致命)

  5:重点:

    1:现在计算机内存都是unicode,硬盘是utf-8,当内存中的unicode格式编码的数据存到硬盘是,会将Unicode转换位utf-8编码格式来保存,其中中文字符为3个字节,英文字符为1个字节

    2:过程:

      1 数据由内存保存到硬盘

        内存中的Unicode格式的二进制数据     >>> 编码(encode)>>>>  utf-8格式的二进制数据

      2 数据又硬盘读取到内存:

        硬盘中的utf-8格式的二进制数据 >>> 解码(decode)  >>> Unicode格式的二进制数据

  6 :编码, 解码:

    1. 保证不乱吗就在于文件以什么编码形式保存。就以什么编码形式打开    (以什么编码编就以是什么编码解)

    2. 在python2中,将py文件读到解释器时默认用的是ASCII码,在python3中。默认的是utf-8码

  7 :文件头:

    

# coding:utf-8  

    1.因为所有的编码都支持英文字符,所以文件头才能够正常生效

    2.基于Python解释器开发的软件,只要是中文,前面都需要加一个为了在python2当不指定文件头的时候,默认用ASCII存储数据,如果指定文件头那么就按照文件头的编码格式存储数据)

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

  8:注意:pycharm终端用的是utf-8格式,在windows终端用的是‘gbk'

  9:字节等关系:

        1B = 8Bytes

        1kb = 1024b

        1Mb = 1024 kb

        1GB = 1024 MB

        1TB = 1024 GB

        1PB = 1024 TB

2.文件处理:

  1.什么是文件:系统暴露给用户操作复杂硬件的简易接口

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

  3.通过Python代码来操作文件:  操作完必须关闭文件。close()

f = open(r'D:学习资料day08代码day08	est', mode='r', encoding='utf-8')
print(f.read())
f.close()

'''
通过python代码来操作文件
1.open() : 打开文件
2.r'  取消转义
3.'D:学习资料day08代码day08	est' 文件的绝对路径  (可以写文件的相对路径)
      相对路径:必须有一个参照物 通常是相对于执行文件所在的文件夹
      绝对路径:类似与GPS定位,文件所在的详细路径
4.mode 操作文件的方式。可省略不写,默认以’r'读的方式打开
5.encoding=‘utf-8'  : 操作文件的编码方式
6. f 变量名 一个对象 文件句柄
7. f.read()  :将文件一次性都出来读取出来,如果文件过大会导致内存溢出
8. f.close()  :告诉操作系统关闭打开的文件
'''

  4.  文件上下文管理:操作完自动关闭打开的文件

with open(r'D:学习资料day08代码day08	est',mode='r',encoding='utf-8') as f:
    print(f.read())

  5.文件的打开方式:(mode 参数)Day 07   Day08 字符编码与文件处理

  6:操作文件单位的方式:

     t :  文本文件。在使用的时候需要指定encoding参数,若不指定则以系统默认编码方式打开

    b :  二进制文件。 在使用时候哟东不能指定encoding参数,通常用于打开视频音频等文件,或者用与传输文件

  7:只读:(r)文件不存在的情况下 直接报错,文件存在的情况下 光标在文件开头

with open(r'D:学习资料day08代码day08	est',mode='r',encoding='utf-8') as f:
    print(f.readable())  # True 是否可读
    print(f.writable())  # False  是否可写
    print(f.read())  # ahjkjh
 哈佛看 
 围殴日哦 
 啊JFK蓝  将文件一次读出
    print(f.read())  # 没有内容  因为当文件读取完国标移动到末尾
    f.seek(0, 0)  # 将鼠标移动到开始
    print(f.readline())  # ahjkjh  一行一行的读取文件
    print(f.readline())  # 哈佛看
    f.seek(0, 0)  # 将鼠标移动到开始
    print(f.readlines())  # ['ahjkjh
', '哈佛看
', '围殴日哦
', '啊JFK蓝'] 返回的是一个列表,将文件中的一行行内容作为元素添加到列表中
with open(r'D:学习资料day08代码day08	est', mode='r', encoding='utf-8') as f:
    for line in f:  # f 可以被for循环,每次读取一行内容
        print(line)  # 可以解决读取大文件的问题,内存始终只有一行内容

   8:只写:(w)文件不存在的情况下 自动创建新文件,文件存在的情况下 先清空文件内容再执行写入

with open(r'D:学习资料day08代码day08	est', mode='w', encoding='utf-8') as f:
    f.write('hello')

  9. 只追加:(a)文件不存在的情况下 自动创建新文件,文件存在的情况下,不清空内容。光标移动到末尾

with open(r'D:学习资料day08代码day08	est', mode='a', encoding='utf-8') as f:
    f.write('你好')  # 末尾追加

  10.光标:(seek)    

    1.在rt模式下 read内的数字 表示的是字符的个数

    2.除此之外,数字表示的都是字节

    3.f.seek(offset,whence)

      offset:相对偏移量 光标移动的位

      whence:

        0:参照文件的开头   t和b都可以使用
    1:参照光标所在的当前位置 只能在b模式下用
    2:参照文件的末尾 只能在b模式下使用 
 
  11.截取片段
with open(r'test', 'a', encoding='utf-8') as f:
    f.truncate(6)  # 接收的字节的长度 整型
    # 保留0~6字节数 后面的全部删除(截断)

   12. 监测文件内容

with open(r'test01.txt', 'rb') as f:
    # 先将光标移动到文件末尾
    f.seek(0, 2)
    while True:
        res = f.readline()
        if res:
            print("新增的文件内容:%s" % res.decode('utf-8'))
            # 说明有人操作当前文件
     

  13.修改文件:

    1:

# 将数据读取到内存中
# 在内存中修改
# 覆盖原文件
with open(r'D:学习资料day08代码day08
es', 'r', encoding='utf-8') as f:
    content = f.read()

with open(r'D:学习资料day08代码day08
es', 'w', encoding='utf-8') as f1:
    new_content = content.replace('小明', '小红')
    f1.write(new_content)

    2:

# 创建一个新文件
# 将源文件循环修改然后写到新文件中
# 删除原文件,将新文件命名成原文件名

import os

with open(r'D:学习资料day08代码day08
es', 'r', encoding='utf-8') as f, 
        open(r'D:学习资料day08代码day08
es.bar', 'a', encoding='utf-8') as f1:
    for line in f:
        f1.write(line.replace('小红', '小明'))
os.remove(r'D:学习资料day08代码day08
es')  # 删除原文件
os.rename(r'D:学习资料day08代码day08
es.bar', r'D:学习资料day08代码day08
es')  # 重命名文件