字符编码 文件处理

1.运行程序的三个核心硬件

  cpu 内存 硬盘

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

2.python解释器运行一个py文件(xxx.py)步骤

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

字符编码

  字符编码针对的是文字,字符编码只跟文本文件有关

  文本编辑器的输入和输出是两个过程,人在操作计算机的时候将字符通过字符编码表转化为二进制数

  字符编码表示字符与数字之间的关系

ASCII码表:          用八位二进制数表示一个英文字符,所有英文字符、数字、符号加起来差不多125个

GBK:            用2Bytes表示一个中文字符,用1Bytes表示一个英文字符

万国码(unicode):      统一用四个字节表示所有的字符.      缺点:浪费存储空间  、程序运行效率降低

UTF8:        当内存中的unicode编码格式数据存到硬盘的时候,会按照utf-8编码,  将unicode的英文字符由原来的4Bytes变为1Bytes,  将unicode的中文字符由原来的4Bytes变为3Bytes,   现在的计算机内存都是unicode,  硬盘都是utf-8

unicode的两个特点

  1.用户在输入任何字符的时候,都能兼容万国符(unicode)

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

数据由内存保存到硬盘

  内存中的unicode格式二进制数         编码           硬盘中的utf-8格式的二进制数据

数据由硬盘读到内存

  硬盘中的utf-8格式的二进制数据        解码          内存中的unicode中的二进制数据

保证不乱码在于文本文件以什么编码编就以什么编码解

python2

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

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

文件头   # coding:utf-8   

  1.因为所有的编码都支持英文字符,所以文件头才能够正常生效,  基于Python解释器开发的软件,只要是中文,前面都需要加一个u,python2不指定文件头,默认ASCII存储数据,中文无法存,如果指定文件头,就按照文件头的编码格式存储数据,  python3中字符串默认是unicode编码的二进制数,  pycharm终端用的utf-8格, windows终端采用的是gbk

上下文管理协议

  实现了__enter__() 和__exit__()方法,也就是实现了上下文管理协议上下文表达式必须要返回一个上下文管理器对象

class Context():
    def __init__(self,filename,fileMode='w'):
        self.obj = open(filename, fileMode)
    def __enter__(self):
        return self.obj
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.obj.close()

with Context("1.txt") as f:
    f.write("hello")

Context类实现了__enter__和__exit__两个上下文管理器协议,当Context被调用或实例化的时候,创建了上下文管理器

  配合with语句使用的时候,上下文管理器会自动调用__enter__方法,然后进入运行时上下文环境,并将__enter__函数返回值赋值给as从句变量 f

  当f.write("something")执行完毕退出with语句块或者是出现异常导致程序退出时,会执行__exit__方法,并把异常信息传递给后面的参数exc_type, exc_value, exc_db

  如果__exit__方法返回True,则with语句块不会显示的抛出异常,程序终止

  如果__exit__方法返回None或者False,异常会被主动抛出,程序终

什么是文件?
  操作系统提供给用户操作复杂硬件(硬盘)的简易的接口
为什么操作文件
  人或者应用程序需要永久的保存数据
如何用:   f = open()      f.read()      f.close()

#   r取消转义

with open(r'D:python_workspaceday7a',encoding = 'utf-8') as f,
        open(r'D:python_workspaceday7',encoding = 'utf-8') as f1:  # 应用程序想要操作计算机硬件,必须通过操作系统来简便的操作,f是文件对象,在应用程序上
    print(f)
    print(f.read())
    print(f1)
    print(f1.read())
文件打开的模式
  r 只读模式
  w 只写模式
  a 追加写模式
操作文本单位的方式
  t 文本文件 t在使用的时候需要指定encoding参数,如果不指定就用操作系统默认编码
  b 二进制 一定不能指定encoding参数
# mode参数 可以不写,默认rt,t不写默认是t
with open(r'D:python_workspaceday7a',mode = 'r',encoding = 'utf-8') as f:
    print(f.readable())  # 是否可读
    print(f.writable())  # 是否可写
    print(f.read())  # 一次性将文件内容全部读出
r模式
  在打开文件的时候,如果文件不存在,直接报错
  文件路径可以写相对路径,该文件必须与执行文件在同一层文件下
with open(r'a','r',encoding='utf-8') as f1:  #mode关键字可以不写
    print(f1.readable())  # 是否可读
    print(f1.writable())  # 是否可写
    print(">>>1:")
    print(f1.read())  # 一次性将文件内容全部读出
    print('>>>2:')
print(f1.read()) # 读完一次之后,文件的光标已经在文件的末尾了,在读就没有内容了
print(f.readlines()) # 返回的是一个列表,列表中的元素就对应的是一行行的内容
print(f.readline()) # 只读取文件的一行

w模式:

  文件不存在的情况,会自动创建该文件

  当文件存在的情况,会先清空文件内容在写入

with open(r'D:python_workspaceday7a', mode='w', encoding='utf-8') as f:
    print(f.readable())  # 判断可读
    print(f.writable())  #判断可写
    f.write('不不不,我没有翻车
')  # 将a文本文档清空,写入该字符串。
l = ['不sdffs,sdfs有翻~ ','不sdfsdf不,你sdfsf翻~ ','不sfad不,你没sa翻~ ']
f.writelines(l) # 先清空,在将列表中的元素添加到a文本文档

a模式

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

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

with open(r'D:python_workspaceday7a', mode='a', encoding='utf-8') as f:
    print(f.readable())
    print(f.writable())
    f.write('哈哈哈哈
'
dayehui
原文地址:https://www.cnblogs.com/zrh-960906/p/11140431.html