python文件操作
计算机是基于电工作的 而电信号只有高低电平两种状态
也就是说计算机只认识两种状态 人为的定义为数字0和1即二进制
人类的字符与数字之间存在对应关系
相当于发电报彼此携带的密码本一样
1.一家独大
计算机是美国人发明的 想让计算机认识英文
ASCII码
内部记录了英文与数字的对应关系
2.群雄割据
中国人
GBK码
内部记录了英文 中文与数字的对应关系
韩国人
Euc_kr码
内部记录了英文 韩文与数字的对应关系
日本人
shift_JIS码
内部记录了英文 日文与数字的对应关系
3.天下一统
unicode码(万国码)
内部记录了各个国家文字与数字的对应关系
utf8(万国码优化版本)
目前默认使用该编码
(以后文本文件如果出现了乱码肯定是因为字符编码选错了
尝试着切换字符编码即可)
# 编码 按照指定的编码本将人类的字符编程成计算机能够识别的二进制数据 # 解码 按照指定的编码本将计算机的二进制数据解析成人类能够读懂的字符 """代码如何实现""" res = '年轻不是挥霍的资本 年轻应该实现更多的成就' # 编码 res1 = res.encode('gbk') print(res1) # 解码 res2 = res1.decode('gbk') print(res2)
相对路径
需要有一个参考系才可以
eg:在隔壁的老王要找Jason老师 你们说 在隔壁
aaa.txt
绝对路径
不需要有参考系 类似于全球GPS定位
eg:在隔壁的老王要找Jason老师 你们说
地球中国上海嘉定华江公路X号大厦3楼315
D:\pythonProject\day06\aaa.txt
在计算机的世界里斜杠与很多符号的组合有特殊的含义
\n换行符
\t制表符
有时候不想产生特殊含义我们可以取消转义
r
# 第一种(推荐使用) with open(文件路径,读写模式,字符编码) as 变量名: with子代码 # 第二种(不推荐使用) 变量名 = open(文件路径,读写模式,字符编码) 一系列操作 变量名.colse()
r 只读模式 1.文件路径不存在会直接报错 2.文件存在则打开并可读取文件内容 光标在文件开头 with open(r'aaa.txt', 'r', encoding='utf8') as f: print(f.read()) # 一次性读取文件内容 w 只写模式 1.文件路径不存在会自动创建 2.文件路径存在会先清空该文件内容然后再写入 with open(r'aaa.txt', 'w', encoding='utf8') as f: f.write('你好你好你好\n') a 只追加模式 1.文件路径不存在会自动创建 2.文件路径存在光标会移动到文件末尾 with open(r'aaa.txt', 'a', encoding='utf8') as f: f.write('你追我 如果你追到我 我就让你...') 补充知识 读取优化 with open(r'aaa.txt', 'r', encoding='utf8') as f: for line in f: # 一行行读取文件内容 能够避免内存溢出 print(line)
t模式
文本模式(也是上述三种读写模式默认的模式)
rt
wt
at
1.该模式只能操作文本文件
2.该模式下必须指定encoding参数
3.读写都是以字符串为单位
b模式
二进制模型
rb
wb
ab
1.该模式可以操作任意类型的文件
2.该模式下不需要指定encoding参数
3.读写都是以bytes(二进制)为单位
1.利用文件操作编写一个简易的文件拷贝系统
让用户输入需要拷贝的文件路径
然后再获取即将拷贝到哪儿的路径
source_file_path = input('source_path>>>:').strip() target_file_path = input('target_path>>>:').strip() with open(r'%s' % source_file_path, 'rb') as read_f, open(r'%s' % target_file_path, 'wb') as write_f: for line in read_f: write_f.write(line)
2.利用文件操作完成用户的注册 登录
userinfo.txt
基本要求
用户注册获取用户名和密码然后写入文件 jason|123
登录获取用户名和密码之后去文件中比对
# 上述操作完成一次就算成功
while True: print(""" 1.注册 2.登录 """) choice = input('请选择想要执行的功能>>>:').strip() if choice == '1': # 注册功能 # 1.获取用户用户名和密码 username = input('username>>>:').strip() password = input('password>>>:').strip() # 2.打开文件直接写入 with open(r'userinfo.txt', 'w', encoding='utf8') as f: f.write('%s|%s' % (username, password)) print('%s注册成功' % username) elif choice == '2': # 登录功能 # 1.获取用户用户名和密码 username = input('username>>>:').strip() password = input('password>>>:').strip() # 2.读取文件内容比对用户名和密码是否正确 with open(r'userinfo.txt', 'r', encoding='utf8') as f: # 由于目前文件内容就一行 可以直接使用read方法 data = f.read() # jason|123 # 切割字符串 获取正确的用户名和密码 real_name, real_pwd = data.split('|') # 先切割字符串得到一个列表['jason','123'] 在解压赋值给两个变量real_name real_pwd # 比对信息是否正确 if real_name == username and real_pwd == password: print('登录成功') else: print('用户名或密码错误') else: print('输入不合法 暂时没有该功能')
拔高练习
用户注册可以多次注册并且校验用户名是否重复
登录需要逐行比对
# 1.获取用户名和密码 flag = True while flag: username = input('username>>>:').strip() password = input('password>>>:').strip() # 2.先读取文件内容 校验用户名是否重复 with open(r'userinfo.txt', 'r', encoding='utf8') as f: # 循环读取每一行用户数据 for line in f: # 'jason|123' 'kevin|123' # 解析出用户名 real_name = line.split("|")[0] # 判断用户名是否重复 if real_name == username: print('用户名已存在') # for也可以结合break和continue作用与while一致 # 结束整个注册功能 flag = False if flag: # 如果for循环正常执行完毕没有被break 说明用户名没有冲突 with open(r'userinfo.txt', 'a', encoding='utf8') as f: f.write('%s|%s\n' % (username, password)) print('%s注册成功' % username) # 登录 # 1.获取用户名和密码 username = input('username>>>:').strip() password = input('password>>>:').strip() # 2.读取文件内容 循环获取一行行用户数据 with open(r'userinfo.txt', 'r', encoding='utf8') as f: for line in f: real_name, real_pwd = line.split("|") if username == real_name and password == real_pwd.strip('\n'): print('登录成功') break else: # for循环没有被break打断的情况下正常执行完毕之后就会执行else print('用户名或密码错误')