python-文件操作(二)
1. 文件操作方法
1.1 读方法
with open(r'a.txt','r', encoding='utf8') as f:
print(f.read()) # 一次性读取文件所有的内容
print(f.readline()) # 每次值读文件一行内容
print(f.readlines()) # 读取文件所有内容,组织成列表,每个元素是文件的每行内容
print(f.readable()) # 判断当前文件是否可读,返回布尔值
1.2 写方法
with open(r'a.txt', 'w', encoding='utf8') as f:
f.write('这是写入的内容') # 向文件写入内容
f.write(123) # 写入的内容必须是字符串,这句会报错
f.writelines(['jason', 'tom', 'Bob']) # 将列表中的每个字符串元素写入文件
print(f.writable()) # 判断忘记拿是否可写
f.flush() # 将内存文件数据刷到硬盘
2. 文件优化操作
with open(r'a.txt','r',encoding='utf8') as f:
print(f.read())
read() 会一次性读取文件内所有的内容
弊端:
1.一次性读完内容之后,光标停留在文件末尾,无法再次读取内容
2.该方法在读取大文件的时候,可能会造成内存溢出的情况
解决:逐行读取文件内容
with open(r'a.txt', 'r', encoding='utf8') as f:
for line in f:
print(line)
# 涉及到文件多行内容读取的情况一般采用for循环读取
3. 文件操作模式
3.1 文本模式
t 文本模式
1.默认的模式, r w a 其实是rt wt at
2.该模式所有操作都是以字符串为基本单位(文本)
3.该模式必须要指定encoding参数
4.该模式只能操作文本文件
3.2 二进制模式
b 二进制模式
1.该模式可以操作任意类型的文件
2.该模式所有操作都是以bytes类型(二进制)基本单位
3.该模式不需要指定encoding参数
指定模式的时候就需要rb wb ab
eg:
读:
with open(r'a.txt', 'rb') as f:
data = f.read()
print(data, type(data)) # 英文正常显示,中文是一串字符, 类型是bytes
写:
with open(r'a.txt', 'ab') as f:
data = '您好'
res = data.encode('utf8') # 将中文进行编码
f.write(res) # 编码之后再写入,文本中正常写入
4. 练习
4.1 文件版登录注册功能
注册功能
# 要求用户输入用户名和密码
username = input("请输入用户名>>>: ").strip()
password = input("请输入密码>>>: ").strip()
# 格式化输入的信息,添加分隔符和换行符
msg = "%s|%s\n" % (username, password)
with open(r'user.txt', 'r', encoding='utf8') as f_reg:
# for循环读取文件内容
for line in f_reg:
# 取到用户名的值
name = line.split("|")[0]
# 如果用户输入的用户名与存在的用户名一致就退出
if name == username:
print("用户名已存在!")
break
else:
# 否则就将用户输入的信息写入到文件
with open(r'user.txt', 'a', encoding='utf8') as f_reg_insert:
f_reg_insert.write(msg)
print("%s注册成功" % username)
登录功能
# 接收输入的用户名和密码
name = input("请输入用户名>>>: ").strip()
pwd = input("请输入密码>>>: ").strip()
with open(r'user.txt', 'r', encoding='utf8') as f_log:
# for循环读取文件每行内容
for line in f_log:
# 将文件中的用户名与密码处理出来并解压赋值
u_name, passwd = line.split("|")
# 判断用户输入的用户名密码和文件存在的用户密码是否相等,密码后面有换行符也进行处理
# 如果相等就登录成功,否则就显示登录失败
if u_name == name and passwd.strip("\n") == pwd:
print("登录成功!")
break
else:
print("登录失败,用户名或密码错误!")
整体功能实现
while True:
print('''
1.用户注册
2.用户登录
3.退出系统
''')
# 接收用户想要的功能编号
options = input("请输入选项>>>: ").strip()
# 当编号为1的时候,实现用户注册功能
if options == '1':
# 要求用户输入用户名和密码
username = input("请输入用户名>>>: ").strip()
password = input("请输入密码>>>: ").strip()
# 格式化输入的信息,添加分隔符和换行符
msg = "%s|%s\n" % (username, password)
with open(r'user.txt', 'r', encoding='utf8') as f_reg:
# for循环读取文件内容
for line in f_reg:
# 取到用户名的值
name = line.split("|")[0]
# 如果用户输入的用户名与存在的用户名一致就退出
if name == username:
print("用户名已存在!")
break
else:
# 否则就将用户输入的信息写入到文件
with open(r'user.txt', 'a', encoding='utf8') as f_reg_insert:
f_reg_insert.write(msg)
print("%s注册成功" % username)
# 当用户输入编号为2时,就是登录功能
elif options == '2':
# 接收输入的用户名和密码
name = input("请输入用户名>>>: ").strip()
pwd = input("请输入密码>>>: ").strip()
with open(r'user.txt', 'r', encoding='utf8') as f_log:
# for循环读取文件每行内容
for line in f_log:
# 将文件中的用户名与密码处理出来并解压赋值
u_name, passwd = line.split("|")
# 判断用户输入的用户名密码和文件存在的用户密码是否相等,密码后面有换行符也进行处理
# 如果相等就登录成功,否则就显示登录失败
if u_name == name and passwd.strip("\n") == pwd:
print("登录成功!")
break
else:
print("登录失败,用户名或密码错误!")
# 当用户输入3就退出整个循环
elif options == '3':
print("退出系统!!!")
break
else:
print("输入的选项不正确,请重新输入!")
4.2 简易拷贝功能
src_path = input('源文件绝对路径: ').strip()
dst_path = input('目标文件绝对路径: ').strip()
with open(r'%s' % src_path, 'rb') as f:
with open(r'%s' % dst_path, 'wb') as copy_f:
for line in f:
copy_f.write(line)