目录
一、文件
# 一、控制文件读写操作模式
'''
r:只读模式
w:只写模式
a:只追加模式,再原内容后补加内容
+:r+,w+,a+;这三种均可读可写 (+ 不可单独使用)
'''
# 二、控制文件读写内容的模式(不可单独使用)
'''
t模式:(默认格式)文本文件
读写都是以字符串(Unicode)为单位
需要给open指定参数encoding = 'utf -8'
b模式:bytes模式/二进制模式
'''
二、Python-转义字符
* 需要在字符中使用特殊字符时,Python 用反斜杠 \ 转义字符。
1、续行符:\【当一行写不下,再结尾输入反斜杠】
# 1、续行符:\
python
print("line1 \
line2 \
line3")
# 2、反斜杠:\\
print(f'反斜杠','\\')
# 3、单引号
print(f'单引号','\'')
# 4、双引号
print(f'双引号',"\"")
# 5、响铃 \a
print("\a")# 执行后电脑有响声。
# (windows平台上pycharm终端不会响,要用cmd终端或者pycharm的Terminal终端)
# 6、退格(Backspace):\b
print(f'退格',"Hello \b World!")
print(f'正常',"Hello World!")
# 7、空:\000
print(f'空',"\000") # 在不同终端效果不同
# 8、换行 \n
print(f'换行','哈哈\n哈哈')
# 9、纵向制表符:\v
print(f'纵向制表符','Hello \v World!') # 在不同终端效果不同
# 10、横向制表符:\t
print(f'横向制表符','Hello \t World!')
print(f'正常--正常',"Hello World!")
# 11、回车:\r
print(f'回车',"Hello\rWorld!")
print(f'回车','google runoob taobao\r123456')# 将\r后面的内容移到字符串开头,并逐一替换开头部分的字符,直至将\r后面的内容完全替换完成。
print(f'回车',"Hello World!\r")
# 12、换页:\f
print(f'换页',"Hello \f World!") # 在不同终端效果不同
运行结果:
ine1 line2 line3
C:\Users\ZhangXinQi\AppData\Local\Programs\Python\Python310\python.exe D:\__TC22008_VBF\FOTA-vFlash-AutoTest\demo.py
反斜杠 \
单引号 '
双引号 "
退格 Hello World!
正常 Hello World!
空
换行 哈哈
哈哈
纵向制表符 Hello World!
横向制表符 Hello World!
正常--正常 Hello World!
World!
123456
回车 Hello World!
换页 Hello World!
三、防止字符被转义
* 最后一个为绝对路径
四、打开操作关闭文件
# 1、打开文件
f = open('a.txt',mode='rt',encoding='utf-8')
# 2、操作文件 (读 写)
res = f.read()
print(res)
# 3、关闭文件
f.close()
五、with 语法
# with语法 (上下文管理器)
with open('a.txt', encoding='utf-8') as f:
res = f.read()
print(res)
# with语法,可以打开多个文件
with open('a.txt', encoding='utf-8') as f, \
open('b.txt', encoding='utf-8') as f2: # \表示换行
print(f.read())
print(f2.read())
六、t\b
''' t模式:(默认格式)文本文件 读写都是以字符串(Unicode)为单位 需要给open指定参数encoding = 'utf -8' b模式:bytes模式/二进制模式 '''
(1) rt
with open('a.txt',mode='rt',encoding='utf-8') as f:
print('第一次读'.center(80,'-'))
print(f.read()) # f.read() 文件指针是从头指向尾
print('第二次读'.center(80,'-'))
print(f.read()) # 在第二次读取的时候,文件指针此时是在文件的尾部,该次读取应为空
运行结果:--------------------------------------第一次读--------------------------------------
老大,老大,老大是不需要输入密码的
--------------------------------------第二次读--------------------------------------
实例:
前提:----之前表示账号,----之后表示密码
# 初步写法 username ='123456' password = '123' input_username = input('请输入账号:').strip() # strip 目的去掉空格 input_password = input('请输入M密码:').strip() if input_username ==username and input_password ==password: print('登录成功') else: print('账号或密码输入错误,请滚蛋')
1)单账户登录优化案例
# 登录案例优化
input_username = input('请输入账号:').strip() # strip 目的去掉空格
input_password = input('请输入M密码:').strip()
with open('user.txt', mode='rt', encoding='utf-8') as f:
res = f.read()
username, password = res.split('----') # 将账号和密码拆分出来
# print(res)
# print(username)
# print(password)
if input_username ==username and input_password ==password:
print('登录成功')
else:
print('账号或密码输入错误,请滚蛋')
运行结果:
请输入账号:123456
请输入M密码:123
账号或密码输入错误,请滚蛋
2)存多账户密码登录优化案例
前提:
# 多账户登录
input_username = input('请输入账号:').strip() # strip 目的去掉空白字符
input_password = input('请输入M密码:').strip()
with open('user.txt', mode='rt', encoding='utf-8') as f:
# 对多账户的处理
for line in f:
# print(line,end='') # txt 文档中,每行后面有换行符,print自己也加换行符;可以在print加上end='',消灭一个换行符
# 上面加end只去掉了print自带的换行符
# 现在要去掉txt文档里的换行符
line = line.strip('\n') # strip 去除字符串两端的’‘,默认去掉字符串两端的空白符号
username, password = line.split('----')
print(username, password)
if input_username == username and input_password == password:
print('恭喜登录成功')
break # r如果不加break,在第一次登录成功后,for依旧在循环
'''
else:
print('账号或密码输入错误,请滚蛋') # 如果这样写,每循环一行,均告诉输入错误
'''
# for 循环+ else,else模块会在for循环正常结束的情况下执行,如果for循环break,则不执行else模块
else:
print('账号或密码错误,bye bye')
运行结果:
请输入账号:fly
请输入M密码:222
d123456 123
fly 222
恭喜登录成功
(2)wt
注:
# 如果在文件路径下,文件不存在,会创建一个文件,文件指针也是指向开始的位置 # 若文件路径下包含文件且含有内容,会清空文件内容,文件指针指向开始的位置
with open('c.txt',mode='w',encoding='utf-8') as f:
f.write('野心是什么,褒义词或贬义词')
f.write('晓看天色暮看云\n') # 加上换行符,指针会指向下一行
f.write('行也思君坐也思君\n')
(3)at
注:
# 如果在文件路径下,文件不存在,会创建一个文件,文件指针也是指向开始的位置
# 若文件且包含内容,会在文件内容后追加内容
# line 分行是通过\n\r换行符来识别行数
with open('d.txt',mode='a',encoding='utf-8') as f:
f.write('低调\n')
f.write('向前一小步,进步一大步')
注册:【该代码有点问题】
(1)用户名均为数字或字母,密码均为数字
(2)文件已含有的用户名,不可注册
(3)下图为use.txt
username = input('请输入用户名:').strip()
password = input('请输入密码:').strip()
i = 0 # 增加计数器
# print(username.isalnum()) # 判断所有字符是否都是数字或者字母
# print(password.isdigit()) # 判断所有字符是否都是数字
# 数文件的行数
with open('user.txt', mode='r') as f:
for line in f:
i += 1 # 每循环一次,计数器加一
if username.isalnum() and password.isdigit(): # 判断用户名和密码是否合法
with (open('user.txt', mode='r', encoding='utf-8') as f):
# 判断user.txt是否已存在该用户名
for line in f:
username_inner, password_inner = line.strip('\n').split('----')
line = line.strip('\n').split('----')
print(username_inner, password_inner)
if username in username_inner:
if username_inner == username and password_inner == password:
print('登陆成功,欢迎您!')
break
elif username_inner == username and password_inner != password:
print('密码输入错误,请重新登录!')
break
else: # 用户名均未匹配,计数器-1
i-=1
if i ==0 : # for循环完成后,计数器为0
with open('user.txt', mode='a', encoding='utf-8') as f:
f.write(f'{username}----{password}\n') # 这里用到格式化字符串
print('恭喜你,注册成功,yep')
else:
print('您的用户名或密码格式不正确,请重新输入,PLEASE')
运行结果:
请输入用户名:jerry
请输入密码:109
d123456 123
fly 222
jay 333
andy 444
jerry 109
登陆成功,欢迎您!
七、文件拷贝
# 拷贝
old_path = input('请输入原文件路径:')
nwe_path = input('请输入新文件路径:')
with open(fr'{old_path}',mode='rt',encoding='utf-8') as f1,\
open(fr'{nwe_path}',mode='wt',encoding='utf-8') as f2: # f 用格式符,r防止被\转义
res1 = f1.read()
f2.write(res1)
请输入原文件路径:D:\__TC22008_VBF\FOTA-vFlash-AutoTest\user.txt
请输入新文件路径:D:\__TC22008_VBF\FOTA-vFlash-AutoTest\user(拷贝).txt
八、+模式
# r+:可读可写,以r为主,若文件不存在,会报错 # w+:可读可写,以w为主,若文件不存在,创建文件,若文件存在,清空文件 # a+:同理 # x:文件不存在,创建文件,文件存在,报错 with open('a.txt',mode='x',encoding='utf-8') as f: with open('a.txt',mode='w+t',encoding='utf-8') as f:
with open('d.txt',mode='r+t',encoding='utf-8') as f:
f.write('前面写入') # 文件指针指向第一个,将开头的覆盖掉
res = f.read()
print(res)
f.write('r+,也可以写呀') # read之后,文件指针指向最后,在末尾写入
readline,一次读一行;readlines,一次读很多行
writelines:
with open('data.txt',mode='wt',encoding='utf-8') as f:
f.writelines(['avc','drf','222'])
f.writelines(['avc\n', 'drf\n', '222\n'])
九、修改文件
第一种方式:文本编辑器修改文件的方式
# r+模式,文件指针在开头,a模式,文件指针在末尾
with open('data.txt',mode='rt',encoding='utf-8') as f:
res =f.read()
print(res)
l =list(res) # 将其转为列表
l.insert(3,'我是插入的')
print(l)
# 再将列表转回为字符串
new_res = ''.join(l)
print(new_res)
# 第二种方法
rep_res = res.replace('222avc','我是最新插入的')
print(rep_res)
with open('data.txt',mode='wt',encoding='utf-8') as f:
f.write(rep_res)
join的用法:
第二种方式:
# 第二种 修改文件
with open('a.txt',mode='rt',encoding='utf-8') as f,\
open('a.txt.swap',mode='wt',encoding='utf-8') as f1:
for line in f:
res = line.replace('老大','老大永远不能被替换')
f1.write(res)
# 删掉原文件,a.txt.swap修改文件名
import os
os.remove('D:\__TC22008_VBF\FOTA-vFlash-AutoTest\a.txt') #删除原文件
os.rename('D:\__TC22008_VBF\FOTA-vFlash-AutoTest\a.txt.swap','D:\__TC22008_VBF\FOTA-vFlash-AutoTest\a.txt')
走的再慢的人,只要他不丧失目标,也比漫无目的地徘徊的人走的快!