今日学习目标:
- 熟悉文件操作,理解和运用文件操作方法
今日学习内容:
内容简要:
- 字符编码的实际应用
- 文件操作简介
- 文件的读写模式
- 文件的操作方法
- 文件补充说明
内容详细:
字符编码的实际应用
编码与解码
-
1.为什么要进行编码与解码
举个例子,这里我们不妨将人类可以很容易理解的字符作为“明文”,将人类的明文加密成不易懂但是更易于存储和传输的消息字节作为“密文”。那么编码和解码的关系如下: 明文就是人类可以直接一眼就看得懂的字符,密文就是明文被加密后一般人无法立马看懂的字节。
所以人类看的懂的字体符号简称字符,要想让机器看的懂并且按照我们的命令去执行,那就得先编码成机器看的懂的话,也就是编译成字节码,把字符编译成字节的过程叫做编码。
反过来,机器看的懂的话,或者机器按人类的命令操作返回了一些结果,人类看不懂啊,也得进行一次解码,解码成人类看的明白的字体符号(字符),把字节转为人类看的懂的现实生活里面的字符过程就是解码。
总结:
-
编码:
将人类能够读懂的字符编码成计算机能够直接读懂的字符
-
解码:
将计算机能够直接读懂的字符解码成人类能够读懂的字符
名称 方式 编码 encode 解码 decode 举例
s1 = '周一了,继续奋斗' #编码 encode print(s1.encode('gbk')) """ 字符串前面如果加了字母b 表示该数据类型为 bytes类型 bytes类型可以看成是二进制 """ # 解码 decode res=b'\xd6\xdc\xd2\xbb\xc1\xcb\xa3\xac\xbc\xcc\xd0\xf8\xb7\xdc\xb6\xb7' print(res.decode('gbk')) """ 基于网络传输数据 数据都必须是二进制格式 所以肯定涉及到编码与解码 """
运行结果:
-
-
2.如何解决乱码的问题
现在我们了解如何编码和解码,但是当我们遇到一些乱码的情况时要如何处理方法:
出现乱码的原因主要是因为在进行编码和解码的过程中使用的编码表不同导致的 所以当初数据以什么编码编的就以什么编码解即可
-
3.python解释器层面
因为现阶段python解释器开发时间不同,所以导致对于编码问题的处理就有了不同的方法。(这也与编码表的发展有关)
本 方法 python2.x 默认的编码是ASCII码
1.必须在文件的开头告诉解释器使用指定的编码2.在使用python2解释器的环境下定义字符串习惯在前面加uython3.x 解释器默认的编码是 utf-8
文件操作简介
-
1.什么是文件
文件就是把一些数据存起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力。
-
2.代码操作文件的流程
-
2.1.打开文件、创建文件
在python中,使用open函数,可以打开已经存在的文件,或者创建一个新文件,open(文件路径,访问模式,文件的编码)举例:
W = open(‘a.txt’,’w’) #没有找到‘a.txt’文件,所以新建了‘a.txt’文件
补充:
close()关闭文件
举例:
f = open(“a.txt”,”w”) f.colse()#关闭这个文件
上述操作open完最后都需要执行close 而close这一行很任意被遗忘
# with上下文管理(推荐使用) with open(r'a.txt', 'r', encoding='utf8') as f: # f = open() data = f.read() print(data)
-
-
2.编辑文件内容
访问模式 说明 r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 -
2.1.1.读数据(read)
1.使用read(num)可以从文件中读取数据,num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中的所有数据
2.如果文件在路径中不存在:直接报错示例
with open(r'a.txt', 'r', encoding='utf8') as f: content = f.read(5) # 一次读五个字符 print(content) print('-' * 30) content = f.read() print(content)
运行结果
-
2.1.2. 读数据(readlines)
就像read没有参数时一样,readlines可以按照行的方式把整个文件中的内容进行一次性的读取,并且返回的是一个列表,其中每一行的数据为一个元素
示例
with open(r'a.txt', 'r', encoding='utf8') as f: content = f.readlines() # 一次性读取全部文件为列表,每行一个字符串 print(content) # ['hello world,I am here!\n', 'hello world,I am here!\n', 'hello world,I am here!\n', 'hello world,I am here!\n'] i = 1 for temp in content: print("%d:%s" % (i, temp)) i += 1
运行结果
-
2.1.3 读数据(readline)
readline一次读取一行
示例
with open(r'a.txt', 'r', encoding='utf8') as f: content = f.readline() # 1:hello world,I am here!--1 print("1:%s" % content) content = f.readline() # 2:hello world,I am here!--2 print("2:%s" % content)
运行结果
-
2.2.1.写数据(write)
1.如果文件在路径中不存在,自动创建文件
2.路径存在:先清空文件内容 之后再写入数据示例
with open(r'a.txt', 'w', encoding='utf8') as f: f.write("hello world,I am here!") # 将字符串写入文件中
运行结果
-
2.2.2.写数据(write(a模式))
1.如果文件在路径中不存在,自动创建文件
2.路径存在:不会清空文件内容 而是在文件末尾等待新内容的添加示例
with open(r'a.txt', 'a', encoding='utf8') as f1: f1.write('哈哈哈哈或或或或或')
运行结果
-
3.文件补充说明
访问模式 说明 flush() 相当于主动按了ctrl+s(保存) readable() 判断当前文件是否可读 writable() 判断文件是否可写
今日学习时间:
这里统计计划学习的时间
1、 上午8:30~12:30
2、 下午2:30~5:30
3、 晚上6:30~9:30
今日学习产出:
这里统计学习计划的总量
- 1、 技术笔记 1遍
- 2、CSDN 技术博客 1篇
- 3、每日录音
- 4、课后作业
1.编写一个简易版本的拷贝程序
路径全部自定义
url = input('请输入文件路径>>>:').strip()
url1 = input('请输入文件要复制到的路径>>>:').strip()
with open(fr'{url}', 'rb') as f:
txt = f.read()
with open(fr'{url1}', 'wb') as f:
f.write(txt)
2.结合文件编写用户注册登录功能
#提前先创建一个空的userinfo.txt
用户注册 数据保存到文件中
用户登录 数据来源于文件
1.必须给我写出来
单用户注册登录
2.拔高练习
多用户注册登录
is_tag = True
count = 1
while is_tag:
# 三次错误后提示,以及询问是否需要重新注册
if count == 4:
ask = input('您已经尝试了三次 是否继续(y/n) 或者您是否需要重新注册一个账号(z)>>>:')
if ask == 'y':
count = 1
# 注册功能实现
elif ask == 'z':
username = input('请输入您的用户名>>>:').strip()
# 判断用户输入是否为空
if len(username) == 0:
print('用户名不能为空')
continue
password = input('请输入您的密码>>>:').strip()
# 判断用户输入是否为空
if len(password) == 0:
print('密码不能为空')
continue
print(f'您的用户名:{username},密码:{password}')
# 格式化用户输入的用户名和密码,并存入列表‘source_data’
with open(r'userinfo.txt', 'a', encoding='utf8') as f:
f.write(f'{username}|{password}\n')
count = 1
else:
print('拜拜了您嘞!!')
break
# 提示用户输入,以及询问是否需要注册
username = input('请输入您的用户名[您是否需要注册用户名和密码(y)]>>>').strip()
# 判断用户输入是否为空
if len(username) == 0:
print('用户名不能为空')
continue
# 注册功能实现
if username == 'y':
username = input('请输入您的用户名>>>:').strip()
# 判断用户输入是否为空
if len(username) == 0:
print('用户名不能为空')
continue
password = input('请输入您的密码>>>:').strip()
# 判断用户输入是否为空
if len(password) == 0:
print('密码不能为空')
continue
# 格式化用户输入的用户名和密码,并存入列表‘source_data’
print(f'您的用户名:{username},密码:{password}')
with open(r'userinfo.txt', 'a', encoding='utf8') as f:
f.write(f'{username}|{password}\n')
continue
password = input('请输入您的密码>>>:').strip()
# 判断用户输入是否为空
if len(password) == 0:
print('密码不能为空')
continue
# 格式化用户输入的用户名和密码,用成员运算判断该用户名和密码是否正确
count01 = f'{username}|{password}\n'
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
content = f.readlines()
if count01 in content:
print('登录成功')
# 用户指令功能实现
while is_tag:
cmd = input('输入您的指令>>>:').strip()
print(f'正在执行您输入的命令({cmd})....')
if cmd == 'byb':
print('下次再见!')
is_tag = False
else:
print('用户名或密码错误!')
count += 1