文件操作方法
1 读
with open(r'文件路径', 'r(只读模式)', encoding='utf8(万国表)') as f(参数):
print(f.read()) #一次性读取文件所有的内容
print(f.readline()) #m每次只读取文件一行内容
print(f.readlines()) #读取文件所有的内容 组织成列表,每个元素是文件的每行内容
print(f.readable()) #判断当前文件是否具备读的能力
2写
with open(r'文件路径', 'w(只写模式)', encoding='utf8(万国表)') as f(参数):
f.write('需要往文件内容写入文本的内容')
f.write('123') #写入的内容必须是字符串类型
f.writelines(['jason(参数)', 'kevin(参数)','tony(参数)']) #可以将列表中多个字符串元素全部写入
print(f.writable()) #Ture #判断当前文件是否具备写的能力
print(f.readable()) #False #判断当前文件是否具备读的能力
f.flush #直接将内存内的文件数据刷到硬盘 相当于ctrl+s
文件优化操作
with open(r'文件路径', 'r(只读模式)', encoding='utf8(万国表)') as f(参数):
print(f.raed()) #一次性获取读取文件所有的内容
print(f.raed()) #一次性获取读取文件所有的内容
print(f.raed()) #一次性获取读取文件所有的内容
"""
1.一次性读完之后,光标停留在了文件末尾,无法再次读取内容
2.该方法在读取大文件的时候,可能会造成内存溢出的情况
解决上述策略就是逐行读取文件内容
"""
for line in f: #文件变量名 f 支持 for 循环,相当于一行行读取文件内容
print(line)
"""
以后涉及到多行文件内容的情况一般都是采用for循环读取
"""
文件操作模式
t 文本模式
1.默认的模式
r w a >>> rt wt at
2.该模式所有操作都是以字符串基本单位(文本)
3.该模式必须要指定encoding参数
4.该模式只能操作文本文件
b 二进制模式
1.该模式可以操作任意类型的文件
2.该模式所有操作都是以bytes类型(二进制)基本单位
3.该模式不需要指定encoding参数
rb wb ab
练习题
单人注册功能
# 1先获取用户的用户名和密码
username = input('username>>>: ').strip()
password = input('password>>>: ').strip()
# 2.将用户名和密码组成一个字符串,为什么要转成字符串,那是因为用文件操作必须用字符串候装二进制,其他都不行
data = '%s|%s' % (username, password)
# 3.文件操作 写入数据
with open(r'userinfo.txt', 'w', encoding='utf8') as f:
# 3.1读取文件的所有内容
f.write(data)
# 用户用格式化打印
print('用户:%s 注册成功' % username)
多人注册功能
# 多人注册要用while循环 我们用while循环一下
while True:
# 1先获取用户的用户名和密码
username = input('username>>>: ').strip()
password = input('password>>>: ').strip()
# 2.将用户名和密码组成一个字符串,为什么要转成字符串,那是因为用文件操作必须用字符串候装二进制,其他都不行
data = '%s|%s\n' % (username, password)
# 2.1判断用户名是否存在
with open(r'userinfo.txt', 'r', encoding='utf8') as f1:
# 2.2循环要读取每一行的用户数据
for line in f1:
# 2.3用解压的方式进行解压获取每一行数据中的用户名
real_name, real_word = line.split('|')
# 2.4用循环判断是否一致
if username == real_name:
print('用户名已经存在')
break
else:
# 3.文件操作 写入数据
with open(r'userinfo.txt', 'a', encoding='utf8') as f:
# 3.1读取文件的所有内容
f.write(data)
# 用户用格式化打印
print('用户:%s 注册成功' % username)
单人登录功能
1.获取用户名和密码
username = input('username>>>: ').strip()
password = input('password>>>: ').strip()
# 2.获取文件内真实的用户数据
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
# 用read()可以获取全部的内容,所以我们可以直接取完
data = f.read() #data是右边获取内容定义的量名
"""with子代码执行完之后的结果是可以在外面使用的"""
# 3.用切割字符串的方式获取真实的用户名和密码
res = data.strip('|') #
'''这里也可以直接使用解压赋值的操作 real_name,real_pwd = data.split('|')'''
# 4.获取到了真实的账号和密码我们就可以进行比对数据
if username == res[0] and password == res[1]:#我们可以使用判断的方式来进行判断数据是否相等
print('登录成功') #如果一致 就获取成功
else:
print('用户名或密码错误') #如果不一致 获取失败
多人登录功能
# 如果需要多用户登录,那得需要循环
while True:
# 1.获取用户名和密码
username = input('username>>>: ').strip()
password = input('password>>>: ').strip()
# 2.获取文件内真实的用户数据
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
for lien in f:
# 3.用解压赋值的方式获取用户名和密码
real_name, real_world = lien.split('|') #
# 4.获取到了真实的账号和密码我们就可以进行比对数据
if username == real_name and password == real_world.strip(): #我们可以使用判断的方式来进行判断数据是否相等
print('登录成功') #如果一致 就获取成功
break #获取成功直接结束
else:
print('用户名或密码错误') #如果不一致 获取失败
代码整合
while True:
print("""
&&&&1.注册功能&&&&
&&&&2.登录功能&&&&
""")
choice = input('请输入您想要的功能编号>>>: ').strip()
if choice == '1':
# 1先获取用户的用户名和密码
username = input('username>>>: ').strip()
password = input('password>>>: ').strip()
# 2.将用户名和密码组成一个字符串,为什么要转成字符串,那是因为用文件操作必须用字符串候装二进制,其他都不行
data = '%s|%s\n' % (username, password)
# 2.1判断用户名是否存在
with open(r'userinfo.txt', 'r', encoding='utf8') as f1:
# 2.2循环要读取每一行的用户数据
for line in f1:
# 2.3用解压的方式进行解压获取每一行数据中的用户名
real_name, real_word = line.split('|')
# 2.4用循环判断是否一致
if username == real_name:
print('用户名已经存在')
break
else:
# 3.文件操作 写入数据
with open(r'userinfo.txt', 'a', encoding='utf8') as f:
# 3.1读取文件的所有内容
f.write(data)
# 用户用格式化打印
print('用户:%s 注册成功' % username)
if choice == '2':
# 1.获取用户名和密码
username = input('username>>>: ').strip()
password = input('password>>>: ').strip()
# 2.获取文件内真实的用户数据
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
for lien in f:
# 3.用解压赋值的方式获取用户名和密码
real_name, real_world = lien.split('|') #
# 4.获取到了真实的账号和密码我们就可以进行比对数据
if username == real_name and password == real_world.strip(): #我们可以使用判断的方式来进行判断数据是否相等
print('登录成功') #如果一致 就获取成功
break #获取成功直接结束
else:
print('用户名或密码错误') #如果不一致 获取失败
二进制模式读写操作
with open(r'a.txt', 'rb') as f:
#直接用 'b'的模式打印出来的是二级制
print(f.read()) #b'\xe6\x88\x91\xe5\x91\xbd\xe7\x94\xb1\xe6\x88\x91\xe4\xb8\x8d\xe7\x94\xb1\xe5\xa4\xa9'
#读取模式用 b 模式取出来的模式是二级制 而二级制是很难辨认 我们可以在打印的时候使用万国码 把它转换出来 这样容易我们辨认
print(f.read(6).decode('utf8')) #我命
"""
在b模式下表示字节个数
英文字符统一使用一个bytes来表示
中文字符统一使用三个bytes来表示
"""
with open(r'a.txt', 'r', encoding='utf8') as f:
#f是变量命 可以改 用read 是一次性把文件内容取完
# print(f.read()) #我命由我不由天
# f是变量命 可以改 用read 是一次性把文件内容取完 4是要取文件内容的字符个数 在t模式下表示字符个数 括号里几就表示要取几个字符
print(f.read(4)) #我命由我
"""
read() 括号内可以放数字
在t模式下表示字符个数
"""
文件内光标的移动
with open(r'b.txt', 'rb') as f:
#read一次性取所有的值()括号里值是想取的值
print(f.read(3).decode('utf8'))
# 查看光标移动多少字节
print(f.tell())
f.seek(3,1) #命由我不由天
print(f.read().decode('utf8'))
"""
控制文件内光标的移动 f.seek()
f.seek(offset,whence)
offset表示位移量
始终是以字节为最小单位
正数从左往右移动
负数从右往左移动
whence表示模式
0:以文件开头为参考系(支持tb两种模式)
1:只支持b模式 以当前位置为参考系
2:只支持b模式 以文件末尾为参考系
"""
文件的内容修改
# 方式1 覆盖
# with open(r'c.txt','r',encoding='utf8') as f:
# data = f.read()
# # print(type(data))
# with open(r'c.txt','w',encoding='utf8') as f1:
# new_data = data.replace('tony','jason')
# f1.write(new_data)
# 方式2 新建
import os
with open('c.txt', mode='rt', encoding='utf-8') as read_f, \
open('c.txt.swap', mode='wt', encoding='utf-8') as write_f:
for line in read_f:
write_f.write(line.replace('SB', 'kevin'))
os.remove('c.txt') # 删除原文件
os.rename('c.txt.swap', 'c.txt') # 重命名文件
浙公网安备 33010602011771号