1,字符编码
2,文件操作
1024TB = 1PB
字符编码 用8位二进制(1bytes)表示一个英文字符
GBK:中文 英文 符号与数字对应关系
用2bytes表示一个中文符号 兼容英文字符
shift
euck
乱码: 编码与解码不一致
内存中unicode >>>编码(encode) 硬盘中utf-8编码
硬盘中utf-8编码 >>>解码(decode) 内存中的unicode
现在的计算机内存中统一用的都是unicode
unicode两大特点:
1.用户无论输入哪个国家的字符都能够正常显示(兼容万国)
2.与任意国家的编码都有对应关系
文件头
# coding:gbk
指定python解释器读取该文件使用gbk编码,而不再用默认的
python2在读取文件默认使用的是ASCII码
python3在读取文件默认使用的是utf-8码
识别python语法执行python代码 x = '上'
python2 如果不指定文件头 中文没法存储 那是因为python2解释器识别语法存储数据的时候默认使用的是ASCII
如果指定了文件头 python2解释器识别语法存储数据的时候使用文件头指定的编码
python2中通常都会在中文的字符串前面加一个u
x = 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'))
文件处理
一套完整的计算机系统
应用程序
操作系统
计算机硬件
什么是文件
操作系统暴露给用户操作复杂硬盘的简易接口
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连用
该模式通常用来处理非文本文件
直接存储网络上传输过来的二进制数据
有钱就买Mac
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+
文件内光标移动
在rt模式下read内n表示的读取字符的个数
其他情况及其他方法内n表示都是字节数
f.read(n)
f.seek(offset,whence)
offset:指定光标的偏移量
whence:模式
0:相对于文件开头 t和b下都可以正常使用
1:相对于光标所在的当前位置 只能在b模式下使用
2:相对于文件末尾 只能在b模式下使用
牢记:中文在utf-8中用3个bytes表示,英文用一个bytes
检测文件是否被修改
打开文件 利用f.seek(0,2)将光标移动到文件末尾
利用while循环
再利用readline()来读取末尾内容
在通过if判断看readline()是否有值,有值说明文件新增了内容
通过字符串的格式化输出将新增的文件内容输出给检测程序
查看当前光标移动了多少字节
f.tell()
截断文件内容
f.truncate() 括号内输入的数字 表示的是字节数
将内存中的文件内容直接刷到硬盘
f.flush()
硬盘删除的数据原理
文件修改
两种方式
第一种将文件内容先读取到内存在内存中完成修改,然后重新覆盖原文件
优点:硬盘上始终只有一个文件
缺点:内存很有可能会溢出 当文件内容过大的情况下
第二种重新创建一个新的文件,将老文件的内容一行行读入内存完成修改
直接写到新的文件中,利用os模块将原文件删除,将新文件的名字改为来文件的名字
优点:内存中始终只有文件的一行内容 不占用内存
缺点:硬盘上在某一时刻会出现两个文件
函数
什么是函数
函数就是具有某个具体功能的工具
为什么要用函数
提供开发效率
减少代码冗余
提高程序的扩展性
定义一个函数
def是定义函数的关键字
函数名:函数名的命名规则与变量名一致
1.不能以关键字(******)
2.函数也应该做到见名知意
函数在定义的时候只检测函数体语法 不执行函数体代码
def func():
print('hello')
调用函数的固定格式
函数名+括号
函数名只要遇到括号会立即执行函数体代码
代码中遇到函数名加括号 优先级最高
先去执行函数 再看下面的代码