"""
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()