字符编码和文件处理

  """
1.运行程序的三个核心硬件
cpu
内存
硬盘

任何一个程序要想运算,必选先有硬盘加载到内存,然后cpu去内存取指执行
运行着的应用程序产生的数据 必先存在内存

2.python解释器运行一个py文件(xxx.py)步骤
1.将python解释器的代码由硬盘读到内存
2.将xxx.py以普通文本文件形式读到内存
3.python读取文件内容 识别python语法 执行相应操作
ps:普通的文本编辑器与python解释器前两步都是一样的

"""
一、字符编码:
 
 
1.字符编码针对的是文字,也就意味只和文本文件有关,和视频、音频文件无关。
  
  2、文本编辑器的输入和输出是两个过程。

    人在操作计算机的时候输入的是人能够看懂的字符,
但是计算机只能识别010101这样的二进制数据,
    那么输入的字符   >>>(字符编码表)>>>   二进制数字
  
  3、字符编码表就是字符与数字的对应关系

  
  4、

     ASCII码表  用八位二进制表示一个英文字符 所有的英文字符+符号最多也就在125位左右
     GBK     用2Bytes表示一个中文字符 还是用1Bytes表示一个英文字符  最多能表示65535个字符
     万国码unicode 统一用2Bytes表示所有的字符
     缺点:1.浪费存储空间;2.io次数增减,程序运行效率降低(致命)
  
  5、当内存中的unicode编码格式数据存到硬盘的时候,会按照utf-8编码(unicode transformation format)

    unicode的两个特点 (需要掌握)
      1、用户在输入的时候,无论输什么字符都能够兼容万国字符
      2、其他国家编码的数据由硬盘读到内存的时候unicode与其他各个国家的编码都有对应关系
     数据由内存保存到硬盘(必须掌握)
      内存中的unicode格式二进制数字 >>>编码(encode)>>>  utf-8格式的二进制数据    
     硬盘中的数据由硬盘读到内存  >>>解码(decode)>>>   内存中unicode格式的二进制数据
   ps:保证不乱码在于  >>>  文本文件以什么编码编的就以什么编码解   
      python2 解释器默认使用ASCII码
      python3 解释器默认使用utf-8
    
6、文件名

      # coding:utf-8
        1、因为所有编码都支持英文字符,所以文件头才能正常生效
      给予python解释器开发的软件,只要是中文,前面都需要加一个u,
      为了的就是讲Python2(当你不指定文件头的时候,默认ASCII存储数据,如果指定文件头那么就按照文件头的编码格式存储数据)

      python3中字符串默认就是unicode编码的二进制数
    补充:
       1、pycharm终端用的是utf-8格式
       2、Windows终端采用的是GBK
    ps:乱码的原因:字符不能够正常显示,多数编码不一致。
      八位二进制也叫8bit(******)       8bit = 1Bytes       1024Bytes = 1KB       1024KB = 1MB       1024MB = 1GB       1024GB = 1TB       1024TB = 1PB       ....
  重点:
    字符编码表总结
x = ''
res1 = x.encode('gbk')  # 将unicode编码成可以存储和传输的utf-8的二进制数据
print(res1)  # b'\xe4\xb8\x8a'
# bytes类型  字节串类型  你就把它当成二进制数据即可
res2 = res1.decode('gbk')  # 将硬盘中的utf-8格式的二进制数据解码成unicode格式的二进制数据
print(res2)   
# 第一种转换方式
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(type(res))
print(res.decode('utf-8'))

二、文件处理:

  1、什么是文件?

    操作系统提供给用户操作复杂硬件(硬盘)的简易的接口

  2、为什么操作文件

    人或者应用程序需要永久的保存数据

  ps:python代码操作文件

    f = open(文件路径,mode='读写模式' , encoding='utf-8')

    f.close()

    print(f)

    f:遥控器     文件句柄

  3、如何用?

    f = open()

    f.read()

    f.close()

'''
通过python代码操作文件
 r 取消转义
 f = open(r'文件路径',encoding='utf-8')  # 向操作系统发送请求  打开某个文件
# # 应用程序要想操作计算机硬件 必须通过操作系统来简介的操作
print(f)  # f是文件对象
print(f.read())  # windows操作系统默认的编码是gbk
f.read()  # 向操作系统发请求 读取文件内容
f.close()  # 告诉操作系统 关闭打开的文件
print(f)
print(f.read())
'''
# 文件上下文操作
with open(r'文件路径',encoding='utf-8') as f ,\
        open(r'文件路径,encoding='utf-8') as f1:  # f仅仅是一个变量名 你把它看成是一个遥控器
    print(f)
    print(f.read())
    print(f1)
    print(f1.read())

  4、

  4.1、文件的上下文管理

      with open(....) as f:        

    文件操作文件路径:

      相对路径:必须有一个参照物 通常是相对于执行文件所在的文件夹

      绝对路径:类似于GPS全球定位,不需要有任何的参照物

    r用来取消转义:

      r'D:av\ttt\xxx\ooo\rrr'

    mode不写默认用的是rt  (下文操作方式有写)

    encoding参数只在mode位文本模式的情况下才加

  4.2、文件打开的模式:

    r 只读模式:

      r 模式在打开文件的时候, 如果文件不存在 ,直接报错。

    w 只写模式:

       w模式一定要慎用

      1.文件不存在的情况下, 自动创建该文件。

      2.当文件存在的情况下, 会先清空文件内容再写入。

    a 追加模式:

      1.当文件不存在的情况下 自动创建该文件。

      2.当文件存在的情况下,不清空文件内容, 文件的光标会移动文件的最后

  5、操作文件单位的方式

    t 文本文件  t 在使用的时候需要只读encoding参数 ,如果不指定,默认是操作系统的默认编码。

    b 二进制文件   一定不能指定encoding参数

    mode参数 可以不写 ,不写的话默认是r t (只读文本文件)  这个t不写默认就是t

   例如: 
with open(r'文件索引',mode='r',encoding='utf-8') as f:
        print(f.readable())  # 是否可读
        print(f.writable())  # 是否可写
        print(f.read())  # 一次性将文件内容全部读出
    
        print(f.readlines())  # 返回的是一个列表  列表中的一个个元素对应的就是文件的一行行内容
        for line in f:  # f 可以被for循环 每for循环依次 读一行内容
        print(line)  # 这个方法 就可以解决大文件一次性读取占用内存过高的问题
        print(f.readline())  # 只读取文件一行内容                  

   6、文件内光标移动:

    ps:在rt模式下,read内的数字,表示的是字符的个数,除此之外,数字表示的都是字节。

    1、f.seek(offset,whence)
      offset:相对偏移量 光标移动的位数
      whence:
        0:参照文件的开头,t和b都可以使用
        1:参照光标所在的当前位置,只能在b模式下使用
        2:参照文件的末尾,只能在b模式下使用 ps:(-5,2)表示倒着读5个Bytes
with open(r'test','rt',encoding='utf-8') as f:
    print(f.read(1))
    f.seek(6,0)  # seek移动都是字节数 表示6个字节
    f.seek(3,0)  # seek移动都是字节数 从头开始读3个字节
    print(f.read(1))    # 往后读一位文本字符

        ps:换行占2个字节(Bytes);

     2、f.truncate()  截断文件内容     # 接受的字节的长度,整型。

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

     3.检测文件是否被修改

      打开文件,利用f.seek(0,2)将光标移动到文件末尾

      利用while循环

        再利用readline()来读取末尾内容

        通过if判断看readline()是否有值 ,有值说明文件新增了内容

        通过字符串的格式化输出将新增的文件内容输出给检测程序

      ps:  查看当前光标移动了多少字节            f.tell()

        将内存中的文件内容直接刷到硬盘          f.flush()

      

      





原文地址:https://www.cnblogs.com/xiaowangba9494/p/11139653.html