上节课回顾
字符编码
什么是字符编码
二进制和字符的映射关系
字符编码的发展史
ascill码 --》美国人用
中国人也要用,gb2312;日本人也要用,shit……
早期,大家就是自己玩自己的,导致硬盘里各种编码的数据都有
但是有一天韩国人想看美国大片,就会导致乱码
所以说韩国人想统一世界的编码格式,最后美国人造出了unicode(内存)统一了
既然内存是unicode,那么保存按理来说也应该用unicode,但是unicode占用过多的内存空间
为了节省内存空间,保存用utf8
内存中是unicode,硬盘是utf8
未来硬盘,内存都将是utf8
gbk和gb2312
GB2312--->常用字
gbk--》所有字
总结:用什么编码写,就用什么编码读
python2和python3字符编码的区别
python解释器启动的流程
- python解释器相当于文本编辑器,读入字符 --》 字符编码
- python2默认是ascill码读入字符;python3默认utf8读入字符
- 如果在pycharm中的字符用的是gbk编码写入,如果你想用python正常读入字符,必须得加上
coding:gbk
- 解析字符(有语法和关键字的概念)--》报语法/逻辑错误
- 存储变量,输出(往终端打印)--》字符编码
- python2用两种方式存储变量
u'中文'
用unicode存储变量,用unicode存储变量,如果终端默认utf8格式的编码,不会乱码'中文'
用coding头指定的编码存储变量,假设coding头指定编码为gbk,如果终端默认utf8格式的编码,会乱码
- python3默认用unicode存储变量,用unicode存储变量,如果终端默认utf8格式的编码,不会乱码
- python2用两种方式存储变量
不可能会用到,只是了解(常识性的东西)
今日所学
文件处理
什么是文件处理:修改存储的信息
什么是文件:操作系统提供的虚拟单位,用二进制来存储信息
操作文件的流程
- 打开文件
- 修改/读取文件
- 保存文件
- 关闭文件
文件的三种打开方式和两种模式
- r 只读不可写
- w 清空后在写
- a 追加写
t模式,针对文本
b模式,针对二进制
w和a模式可以自动创建文件
绝对路径和相对路径
绝对路径
从盘符开始一直到文件的位置
相对路径
执行文件的文件夹下的文件名,执行文件和打开文件属于同一文件夹下
with管理文件上下文
with提供一个自动关闭文件的功能(接触了操作系统的占用)
文件的高级应用
仅作了解
- 可读可写 r+(光标在文件头部,覆盖后面的字符)
- 可读可写 w+ (和w没任何区别)
- 可写可读 a+ (默认光标在尾部)
移动光标的位置
seek
with open('test.py', 'rb') as fr:
fr.seek(5) # 移动了3个字节,一个中文,默认从开头开始
print(fr.read())
whence
规定只有0,1,2三种模式,0相当于从文件头开始,1相当于文件所在位置,2相当于从文件尾开始
tell
告诉你当前的位置
with open('test.py', 'rb') as fr:
fr.seek(3, 0)
print(fr.tell())
truncate:截断
with open('test.py', 'ab') as fa:
fa.truncate(2)
移动光标(以字符为单位)
read
with open('test.py', 'r', encoding='utf8') as fr:
print(fr.read(3)) # n表示n个字符,不加默认读取所有 # 中文和英文都属于一个字符
登录注册
# 注册
count = 0
while count < 3:
username_inp = input('请输入你的用户名:')
pwd_inp = input('请输入你的密码:')
re_pwd_inp = input('请在此输入你的密码:')
if not pwd_inp == re_pwd_inp:
print('两次密码输入不一致')
count += 1
continue
with open('user_info.txt', 'a', encoding='utf8') as fa:
fa.write(f'{username_inp}:{pwd_inp}\n') # :表示用户名和密码的分割;|用户和用户之间的分割
fa.flush()
break
# 登录
username_inp = input('请输入你的用户名:')
pwd_inp = input('请输入你的密码:')
with open('user_info.txt', 'r', encoding='utf8') as fr:
for user_info in fr:
username, pwd = user_info.split(':')
if username.strip() == username_inp and pwd.strip() == pwd_inp: # strip可以去掉两端的换行符
print('登录成功')
break
# else:
# continue # continue一般不写在最后一行
else:
print('登录失败')
# 一个项目从来都不会在知识点难倒你, 只会在逻辑方面难倒你(敲少了)
文件的修改
文件没有修改一说,只有覆盖
可以同时打开多个文件
with open('test.py', 'r', encoding='utf8') as fr, \
open('test_swap.py', 'w', encoding='utf8') as fw:
data = fr.read()
再大的文件都能修改