'''上周回顾内容
1Bytes=8bit
1KB=1024Bytes
1MB=1024KB
1GB=1024MB
1TB=1024GB
1PB=1024TB
字符编码
字符编码的发展史
字符编码表
ASCII码 只有英文字母和符号与数字的对应关系
用8位二进制(1bytes)表示一个英文字符
GBK:中文 英文 符号与数字对应关系
用2bytes表示一个中文符号 兼容英文字符
乱码: 编码与解码不一致
内存中unicode >>>编码(encode) 硬盘中utf-8编码
硬盘中utf-8编码 >>>解码(decode) 内存中的unicode
计算机内存统一使用的编码是Unicode
Unicode两大特点:
1,用户输入的任意字符都能正常显示(兼容万国)
2,与任意国家的编码都有对应关系
文件头
#coding:gbk
指定python解释器读取该文件使用gbk编码,而不再用默认的
#python2在读取文件时默认使用ASCII码
python3在读取文件时默认使用utf-8码
识别python语法执行python代码
python2
如果不指定文件头 中文无法储存 因为python2解释器识别语法储存数据的时候默认使用的是ASCII
如果指定了文件头 python2解释器识别语言储存数据的时候用文件头指定的编码
python2中通常都在中文的字符串前面加一个u,告诉python2解释器上将数据储存为unicode形式
python3
字符串默认存储为unicode(******)
保证不乱码的核心:存的时候使用的编码(encode),取的时候就用该编码(decode)
x = '上' # 第一种转换方式 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. 通过句柄对文件进行操作
#3. 关闭文件
python代码操作文件 f = open(文件路径,mode='读写模式',encoding='utf-8') f.close() print(f)
f:遥控器 文件句柄
文件的上下文管理
with open(....) as f:
文件操作
文件路径
相对路径:必须有一个参照物 通常是相对于执行文件所在的文件夹
绝对路径:类似于GPS全球定位,不需要有任何的参照物
r用来取消转义
r'D:av\ttt\xxx\ooo\rrr'
mode不写默认用的是rt
encoding参数只在mode位文本模式的情况下才加
文件读写模式 r:只读模式 1.文件不存在的情况下 直接报错 2.文件存在的情况下 光标在文件开头 w:只写模式 1.文件不存在的情况下 自动创建新文件 2.文件存在的情况下 先清空文件内容再执行写入 a:只追加模式(只能在文件末尾添加内容) 1.文件不存在的情况下 自动创建新文件 2.文件存在的情况下 光标直接在文件末尾
文件操作单位
t:文本模式
只能和r/w/a连用 并且不写的情况下 默认就是t
b:原生的二进制数据
只能和r/w/a连用
该模式通常用来处理非文本文件
直接存储网络上传输过来的二进制数据
f.read() 一次性将文件内容全部读到内存
当文件过大的情况下该方法可能会导致内存溢出
f.readline():一行行的读取内容
文件句柄f可以直接被for循环 每次for循环拿出来的就是文件一行行的内容
for line in f: print(line) \r\n:换行符 现在做了优化 可以只写\r或者\n f.readlines():将文件一行行的内存放是列表中 成为一个个元素 f.readable():是否可读 f.write() 写文件 f.writeable() 是否可写 f.writelines() 要接收一个容器类型 for i in l: f.write(i) f.writeline() 写一行
r
w
a
将上面的三个模式称为纯净模式
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)
# 在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('过') import time res = time.strftime('%Y-%m-%d %X') # print(res,type(res)) # with open(r'test01.txt','a',encoding='utf-8') as f: f.write('%s egon给jason发了1个亿的工资\n'%res) with open(r'test01.txt','rb') as f: # 先将光标移动到文件末尾 f.seek(0,2) while True: res = f.readline() # 查看光标移动了多少位 bytes # print(f.tell()) if res: print("新增的文件内容:%s"%res.decode('utf-8')) # 说明有人操作当前文件 # else: # # 说明文件没有被任何人操作 # print('暂无其他人操作该文件') with open(r'test','a',encoding='utf-8') as f: f.truncate(6) # 接收的字节的长度 整型 # 保留0~6字节数 后面的全部删除(截断)
# 文件修改方式2
# 创建一个新文件
# 循环读取老文件内容到内存进行修改 将修改好的内容写到新文件中
# 将老文件删除 将新文件的名字改成老文件名
import os
with open(r'test02.txt','r',encoding='utf-8') as read_f,\ open(r'test02.swap','a',encoding='utf-8') as write_f: for line in read_f: new_line = line.replace('jason','egon') write_f.write(new_line) os.remove('test02.txt') os.rename('test02.swap','test02.txt')
优点:内存中始终只有一行内容 不占内存
缺点:再某一时刻硬盘上会同时存在两个文件
s = 'hello' # print(len(s)) # 假设没有len了 # 函数体代码定义截断只检测语法 不执行代码 def test(): hdhfd sdafsd sdafjsldakj sdfljsda;lf;lskdf;l print(test())
"""
可以通过变量名找到变量对应的值
可以通过函数名+括号 找到函数体所对应的代码并执行
"""
# 函数名的命名规则跟变量名一模一样
# 函数就是工具,并且函数必须先定义后调用(函数名+括号)
def my_len(): n = 0 for i in s: n += 1 print(n) my_len() my_len() my_len() l = [1,2,3,4,5] m = 0 for j in l: m += 1 print(m)
# 将for循环的代码放到某一个地方 谁要用谁就拿
'''