Python中的File(文件)操作
针对磁盘中的文件的读写。文件I/O I 输入(input) O输出(Output)
文件操作步骤:1.打开文件 2.读写文件 3.关闭文件
写入文件的操作:(把大象装进冰箱)
- 打开文件 open() ==> 打开冰箱
- 写入内容 write() ==> 把大象装进冰箱
- 关闭文件 close() ==> 关闭冰箱门
读取文件的操作:(把大象从冰箱中取出)
- 打开文件 open() ==> 打开冰箱门
- 读取内容 read() ==> 把大象拿出来
- 关闭文件 close() ==> 关闭冰箱门
文件操作相关函数
open() 打开文件
格式: open(文件的路径,打开的方式,[字符集])
Seek() 设置文件指针的位置
fp.seek(0) # 把文件指针设置到文件的开头位置 fp.seek(10) # 设置文件指针的位置 fp.seek(0,2) # 0,2是把文件指定设置在文件的末尾
write() 写入内容
格式:文件对象.write(字符串)
writelines() 写入容器类型数据
格式:文件对象.write(容器类型数据)
注意:容器类型数据中的元素也必须是可写入的字符串类型
read() 读取内容
格式:文件对象.read() 从当前指针位置读取到最后
格式:文件对象.read(读取的字节数) 可以读取指定长度的字符
readline() 读取一行
格式: 文件对象.readline() 一次读取一行
格式: 文件对象.readline(字节数) 一次读取一行中指定长度的字节
readlines() 读取所有行
格式: 文件对象.readlines() 读取所有行,每一行作为一个元素,返回了一个列表
格式:文件对象.readlines(6) 按照行进行读取,可以设置读取的字节数,设置的字节数不足一行按一行算
close() 关闭文件
格式:文件对象.close() 关闭打开的文件
文件操作的高级便捷写法
# 文件操作的 高级写法
'''
with open(文件路径,打开模式) as 变量:
变量.操作()
'''
with open('./1.txt','r+',encoding='utf-8') as fp:
res = fp.read()
print(res)
文件的路径:
文件路径 路径 url 统一资源定位符
#相对路径: 就像给别人指路一样: 在某某大厦的对面。。。
针对文件的相对路径的表示,从当前目录开始计算
1.txt ==> 具体文件前没有任何表示时,默认为当前目录 和 ./1.txt 是一个位置
./1.txt ==> ./ 代表当前目录中的 1.txt
../1.txt ==> ../ 代表当前目录中的 上一级目录中的1.txt
#绝对路径: 就像买东西写收货地址一样: 北京市海淀区中关村大街128号xxx小区,xxx号楼xx单元xx室
windows: c:/users/appdata/1.txt
Linux: /user/home/yc/1.txt
打开的模式:
#一,基础模式: w r x a
w w模式 write 写入模式
1。 文件如果不存在,则创建这个文件
2。 文件如果存在,则打开这个文件,并且清空文件内容
3。 文件打开后,文件的指针在文件的最前面
r r模式: read 读取模式
1。 如果文件不存在,则报错
2。 文件如果存在,则打开文件
3。 文件指针在文件的最前面
x x模式: xor 异或模式
1。文件不存在,则创建这个文件
2。文件已存在,则报错(防止覆盖)
3。文件的指针在文件的最前面
a a模式: append 追加模式
1。文件不存在,则创建文件
2。文件如果存在,则打开文件 (和w模式的区别在于。a模式打开文件后不会清空)
3。文件指针在当前文件的最后
#二,扩展模式:
b b模式 bytes 二进制
+ +模式 plus 增强模式(可读可写)
#三,文件操作模式的组合:
w,r,a,x
wb,rb,ab,xb,
w+,r+,a+,x+
wb+,rb+,ab+,xb+
参数 encoding 可选参数,设置文件的字符集,
如果是一个二进制的文件时,不需要设置字符集
encoding='utf-8'
# 写入文件操作
# 1。打开文件
fp = open('./1.txt','a',encoding='utf-8')
# 2。写入 文件
fp.write('\n你好')
# 3。关闭文件
fp.close()
# 读取操作
# 1。打开文件
fp = open('./1.txt','r',encoding='utf-8')
# 2。读取文件
res = fp.read()
# 3。关闭文件
fp.close()
print(res)
# 文件操作的 高级写法
'''
with open(文件路径,打开模式) as 变量:
变量.操作()
'''
# w+ 即可读又可写 注意w模式的特点,是打开文件后直接清空了文件
# r+ 即可读又可写
# a+ 追加写,并且可读
# x+ 异或
with open('./1.txt','r+',encoding='utf-8') as fp:
# 设置指针的位置
fp.seek(20) # 设置当前指针的位置
fp.write('cc')
fp.seek(0) # 设置当前指针的位置 seek(0),最开始的位置
res = fp.read()
print(res)
# 写入相关函数
vars = 5211 # int类型无法写入
vars = ['hello','world','1','2']
vars = {'name':'zs','age':'22'}
with open('./test/4.txt','w',encoding='utf-8') as fp:
# fp.write(vars) # 只能写入字符串类型数据
fp.writelines(vars) # 可以写入容器类型数据,注意容器中的元素也必须是字符串类
# 读取相关函数
with open('./test/4.txt','r',encoding='utf-8') as fp:
fp.seek(3) # 设置指针的位置
res = fp.read() # 默认从当前指针开始读取到最后
res = fp.read(3) # 设置读取的字节长度
res = fp.readline() # 一次只读取一行内容
print(res)
res = fp.readline(3) # 可以读取当前行中的指定字节数
res = fp.readlines() # 一次读取多行数据,每一行作为一个元素,返回一个列表
res = fp.readlines(6) # 按照行进行读取,可以设置读取的字节数,设置的字节数不足一行按一行算
print(res)
# seek() 设置文件指针位置
with open('./test/4.txt', 'r+', encoding='utf-8') as fp:
# a+模式,指针默认在文件的最后,所以直接读是读取不到内容的
fp.seek(0) # 把文件指针设置到文件的开头位置
fp.seek(10) # 设置文件指针的位置
fp.seek(0,2) # 0,2是把文件指定设置在文件的末尾
fp.write('\n00000')
res = fp.read()
# truncate() 截断文件内容
with open('./test/4.txt','r+',encoding='utf-8') as fp:
res = fp.truncate(5)
# 默认从文件的首行的首个字符开始进行截断,截断的长度为size个字节数,
# size如果为0,则从当前位置截断到最后
print(res)
练习题:注册与登录
注册功能
1。需要用户名和密码以及确认密码
2。注册时如果用户名已经存在,则不能再次注册
登录功能
1。需要使用已经注册的用户信息登录
2。密码输入错误3次后,锁定账户信息(不能再使用这个账户进行登录操作)
# 登录和注册功能的合并
# 专门定义数据变量,存放已经注册的用户信息
userlist = [] # 存放所有的用户名
pwdlist = [] # 存放所有的用户密码
blacklist = [] # 存放所有的黑名单用户
# 读取所有数据的方法
def readallusers():
# 读取所有的注册信息 使用a+模式打开文件,在调整指针位置,防止文件不存在时报错
with open('./user.txt','a+',encoding='utf-8') as fp:
fp.seek(0) # 调整当前的的指针位置到文件头部
res = fp.readlines() # 按照每一行读取所有的用户数据
for i in res: # 循环读取的每一行数据
r = i.strip() # 处理每一个换行 admin:123\n ==> admin:123
arr = r.split(':') # admin:123 ==> ['admin','123']
userlist.append(arr[0]) # 把用户名追加到 用户名列表中
pwdlist.append(arr[1]) # 把用户对应的密码 追加到 用户密码 列表中
# 获取黑名单数据
with open('./black.txt','a+',encoding='utf-8') as fp:
fp.seek(0)
res = fp.readlines()
for i in res:
blacklist.append(i.strip())
# 封装一个函数 完成注册功能
def register():
# 定义一个变量。用于控制外循环
site = True
# 循环执行 用户名输入操作
while site:
# 用户输入用户名
username = input('欢迎注册,请输入用户名:')
# 用户名需要检测是否已经存在
if username in userlist:
print('当前用户名已经存在,请更换用户名')
else:
# 循环输入密码,如果都正确,循环结束,
while True:
# 输入密码
pwd = input('请输入密码:')
# 检测密码从长度不能低于3位
if len(pwd) >= 3:
# 输入确认密码
repwd = input('请输入确认密码:')
# 检测确认密码是否和密码一致
if pwd == repwd:
# 用户名和密码都正确,就可以写入文件 用户名:密码
# 打开文件,写入数据
with open('./user.txt','a+',encoding='utf-8') as fp:
fp.write(f'{username}:{pwd}\n')
print(f'注册成功:用户名:{username}')
# 结束循环
# 结束外循环
site = False
# 结束内循环
break
else:
print('两次密码不一致,请重新输入')
else:
print('密码格式不正确')
# 封装函数实现登录功能
def login():
# 定义变量 控制登录的外循环
islogin = True
# 定义变量,用户密码的错误次数的检测
errornum = 3
# 循环执行用户的登录
while islogin:
# 获取用户登录时输入的用户名
username = input('欢迎登录,请输入您的用户名:')
# 检测当前用户名是否存在
if username in userlist:
# 检测用户是否属于锁定状态? 判断是否在黑名单中
if username in blacklist:
print('当前用户属于锁定状态,不可登录,请去忏悔把。。。')
else:
# 定义循环,执行密码输入
while True:
# 让用户输入密码
pwd = input('请输入您的密码:')
# 获取用户名在用户列表中的索引。
inx = userlist.index(username)
# 检测用户输入的密码是否正确
if pwd == pwdlist[inx]:
print('登录成功')
# 结束循环
islogin = False # 结束外循环变量
break # 结束内循环
else:
# 密码错误,则修改次数变量
errornum -= 1
# 判断当前的密码错误次数 == 0
if errornum == 0:
print('曾经有那么几次机会摆在你的面前。你没有把握住,恭喜你,成功的锁定了你的账户,请联系相关人员进行忏悔把!')
# 如何才能锁定账户信息? 把需要锁卡的用户拉入黑名单
with open('./black.txt','a+',encoding='utf-8') as fp:
fp.write(username+'\n')
# 结束循环
islogin = False # 结束外循环变量
break # 结束内循环
else:
print(f'密码输入错误,请重新输入密码,你还有{errornum}次机会')
else:
#用户名不存在
print('用户名错误,请重新输入')
# 判断当前的脚本是否作为一个主进程脚本在执行
if __name__ == '__main__':
# 这里的代码,只有在使用python解释器直接运行时才执行
# 如果当前的脚本。作为了一个模块被其它的文件导入后使用,那么这个地方的代码不会执行
# 因此这个地方的代码 适合写当前脚本中的一些测试,这样不会影响其它脚本
# 调用初始化方法,加载数据
readallusers()
while True:
vars = '''
***************************************
** 登录(1) 注册(2) 退出(任意内容) **
***************************************
'''
print(vars)
# 让用户选择对应的操作
num = input('请输入对应的序号,体验功能:')
if num == '1':
login()
elif num == '2':
register()
else:
print('欢迎下次体验。。。')
break
# 扩展题: 可以实现 购物,定义一些商品和对应的价格,每个用户有100原,完成购物即扣款
文章出处登录后可见!
已经登录?立即刷新