文件的基本操作
1. 我们能够操作哪些类型的文件: .txt 没有后缀名的文件
# 我们现在不能操作word、Excel、PPT等文件暂时不能够操作但是可以用numpy、pandas等模块可以操作
2.操作文件:打开文件(open)、 读或者写和关闭文件
打开文件:open('要操作的文件路径', '读写模式', '字符编码')
#文件路径:也分为相对路径和绝对路径 # 'D:\Python27\day10\a.txt'# 当路径中出现了字母和斜杠的组合会产生一些特殊的含义,所以我们应该给去掉:r或//
返回的是文件句柄---文件句柄:f #打开和关闭文件都是操作系统打开,而f是操作系统给的
f= open(r'D:\Python27\day10\a.txt', 'r', encoding='utf-8') # \n \t
读取文件:print(f.read()) # 类似于是文件的内置方法
关闭文件:f.close()3.第二种方式来操作文件:
# with上下文管理器打开文件! 特点就:能够自动关闭文件,不用close
# as:起别名,赋给fwith open('a.txt', 'r', encoding='utf-8') as f : print(f.read()) # f=open('a.txt', 'r', encoding='utf-8') f.close()
文件的读写模式:r、w、a
r:只读模式
f = open('a.txt', 'r', encoding='utf-8') #当文件路径不存在的时候,会直接保错 print(f.read()) f.close()
w:只写模式
"""写模式的特征:
1. 当文件路径不存在的时候, 会新建出来一个文件,而不报错
2. 写模式会把原来的数据覆盖掉,从新写入新的数据(重要)3.在写模式没中断情况下可以在一直写
"""with open('b.txt', 'w', encoding='utf-8') as f: # pass 为了不全语法结构 f.write('hello') f.write('hahahahhah') f.write('jerry')
a(append):追加模式
"""追加模式:当路径不存在的时候,也会新建出来文件
记住:它是追加写,而不是覆盖原来的内容! ''''''with open('c.txt', 'a', encoding='utf-8') as f: f.write('hello world') f.write('hello world1') f.write('hello world2') f.write('hello world3') f.write('hello world4') f.write('hello world5')
读写操作相关的方法
# 读系列:
with open('a.txt', 'r', encoding='utf-8') as f: print(f.read()) # read方法是一次性读取文件中得所有数据 print(f.readline()) # helloworld1 一次读一行 print(f.readlines()) # 一次性读取文件的所有内容,返回的数据类型是:列表 """['hello/n', 'hello/n', 'hello/n']""" print(f.readable()) # able ation un multi ... 判断是否可读
# 写系列:
### 做后端程序员:最重要的是安全意识with open('a.txt', 'w', encoding='utf-8') as f: f.write('jerry say hello ') f.writelines(['hello\n', 'jerry\n', 'kevin\n', 'jason\n']) print(f.writable()) # 判断是否可写
文件的读操作优化
with open('a.txt', 'r', encoding='utf-8') as f: print(f.read()) # 一次性读取文件的所有数据,并且光标在文件的末尾,如果在去读,就读不到了 print(f.read()) # 第二次已经读不了了 """当数据比较多的时候,会出现内存溢出,这种情况是坚决不能出现的"""
如何优化以上操作: 文件句柄 f 是支持for循环的
with open('a.txt', 'r', encoding='utf-8') as f: for line in f: # line: 就是文件的一行内容 print(line) # 一行行读,不再一次性
# 了解的方法: f.flush() # 把数据从内存中立刻刷到磁盘
课堂练习题:注册登录功能
##练习1:
写一个简易版本的注册和登录功能
# 只需要实现一次注册和登录即可------------->单用户的注册
注册
# 注册的用户数据需要写在文件里面
登录
# 比较的用户名和密码要从文件中读取# 注册功能 username = input('username:').strip() password = input('password:').strip() # 需要用户名和密码 data = '%s|%s' % (username, password) # 组织成特殊的格式保存在文件里 with open('userinfo.txt', 'w', encoding='utf-8') as f: # 直接写数据到文件里 # 写文件的时候,写入的数据类型必须是字符串和二进制 f.write(data) print('%s注册成功' % username) # 单用户的登录功能 username = input('username:>>>').strip() password = input('password:>>>').strip() with open('userinfo.txt', 'r', encoding='utf-8') as f: data = f.read() real_username, real_password = data.split('|') # 可以直接使用解压赋值拿到真实的有用户名和密码 if username == real_username and password == real_password: print('登录成功') else: print('用户名或者密码错误')
##进阶练习2
多用户的注册功能和多用户数据情况下的登录功能
多用户的注册:
1. 可以在程序不结束的情况下注册多个用户
2. 需要验证用户名不能重复
3. 注册的多用户的用户名和密码如何存储? # 放在一个文件中,只不过是换行存储## 多用户注册 while True: username = input('username:').strip() password = input('password:').strip() with open('userinfo.txt', 'r', encoding='utf-8') as f: for line in f: # 逐行读取数据 real_username, real_password = line.split('|') if real_username == username: # 判断 print('用户名已经存在') break else: data = '%s|%s\n' % (username, password) # 组织数据成特殊的格式 with open('userinfo.txt', 'a', encoding='utf-8') as f: f.write(data) # 把用户名和密码写入到文件中 print('%s 注册成功' % username) ## 多用户登录 with open('userinfo.txt', 'r', encoding='utf-8') as f: for line in f: # line : jerry|123 real_username, real_password = line.split('|') # ['jerry', '123\n'] if real_username == username and password == real_password.strip('\n'): print('登录成功') break else: print('用户名或者密码不正确')
整合代码
代码启动之后,给用户展示功能编号:
1. 注册功能
2. 登录功能while True: print(""" 1. 注册功能 2. 登录功能 """) cmd = input('请输入你要执行的功能编号:').strip() if not cmd.isdigit():continue if cmd == '1': while True: username = input('username:').strip() # 1. 用户输入用户名和密码 password = input('password:').strip() with open('userinfo.txt', 'r', encoding='utf-8') as f: #验证用户名是否存在 for line in f: # 逐行读取数据 real_username, real_password = line.split('|') # line:kevin|123 if real_username == username: # 判断 print('用户名已经存在') break else: data = '%s|%s\n' % (username, password) # 2. 组织数据成特殊的格式 with open('userinfo.txt', 'a', encoding='utf-8') as f: f.write(data) # 3. 把用户名和密码写入到文件中 print('%s 注册成功' % username) elif cmd == '2': username = input('username:>>>').strip() password = input('password:>>>').strip() with open('userinfo.txt', 'r', encoding='utf-8') as f: for line in f: # line : jerry|123 real_username, real_password = line.split('|') # ['jerry', '123\n'] if real_username == username and password == real_password.strip('\n'): print('登录成功') break else: print('用户名或者密码不正确')
文件的操作模式
#文本模式:默认就是操作字符串,文本
t:text
# r w a =====> rt wt at
特征:1. encoding参数必须指定
2. 读取的所有的数据都是以字符串为单位的
3. t模式只能够读取文本或者字符模式# 二进制模式:b模式:binary
with open('userinfo.txt', 'rb') as f: pass
特征:1. encoding='utf-8'参数不能够指定
2. 读取的数据全部以字节为单位
3. 二进制模式可以读取任意类型的文件4.b模式中得b不能省略------------> rb wb ab
作业:拷贝功能
写一个建议版本的拷贝功能:
1. 代码运行之后输入被拷贝的文件路径
2. 代码运行只会还要在输入你把此文件拷贝到哪个位置去(思路再写)inter = input('请输入您的路径>>>') new_inter = input('请输入您想拷贝到的路径>>>') f = open(r'%s' %inter, 'rb') with open(r'%s' %new_inter, 'wb') as f1: for line in f: f1.write(line) print(----'您的文件已被拷贝---') break