一丶文件
1.什么是文件
文件是操作系统提供给用户/应用程序操作硬盘的一种虚拟的概念/接口
用户/应用程序(open())
操作系统(文件)
计算机硬件(硬盘)
2.为什么要有文件
用户/应用程序可以通过文件将数据永久保存的硬盘中
即操作文件就是操作硬盘
用户/应用程序直接操作的是文件,对文件进行的所有的操作,都是
在向操作系统发送系统调用,然后再由操作将其转换成具体的硬盘操作
3.如何使用文件:
# 1.打开文件和文件路径的问题 # 由应用程序向操作系统发起系统调用open(...) f的值是一种变量,占用的是应用程序的内存空间 f = open(r'a.txt',mode='r') # windows路径分隔符问题 # open('C:a.txt bcd.txt') # 解决方案一:推荐 # open(r'C:a.txt bcd.txt') # 解决方案二: # open('C:/a.txt/nb/c/d.txt') # 2.操作文件:读/写文件,应用程序对文件的读写请求都是在向操作系统发送系统调用,然后由操作系统控制硬盘把输入读入内存、或者写入硬盘 res=f.read()# 读取所有内容,执行完该操作后,文件指针会移动到文件末尾 # 3、关闭文件 f.close() # 回收操作系统资源 del f # 回收应用程序资源
二丶文件的基本操作
2.1 资源回收和with上下文管理
在上文我们提到了文件的打开和关闭,而打开一个文件会有两部分资源:应用程序的变量f和操作
系统打开的文件。在操作完毕时我们必须要回收,否则内存就会溢出,而回收方式就是上文提到的两个关闭,
def f一定要跟在f.close()之后,但是python的回收机制让我们不用写def f,只写f.close()就行,
但还是有人会忘记,所以就有了with这个管理方法。
# 1、在执行完子代码块后,with 会自动执行f.close() with open('a.txt',mode='r') as f: pass # 2、可用用with同时打开多个文件,用逗号分隔开即可 with open('a.txt','r') as read_f,open('b.txt','w') as write_f: pass # 下面的代码和上面的意思一样 的存在只是为了让代码分行 with open('a.txt',mode='r') as f1, open('b.txt',mode='r') as f2: pass
2.2 指定文本文件的字符编码:
强调:t(文本)和b(二进制)不能单独使用,必须跟r/w/a连用
在打开t(文本)文件时会有乱码问题,这就用到open()中一个重要的参数 :encoding=字符编码
如果没有设置encoding那操作系统就会使用默认的编码格式 window为gbk linux为utf-8
上节课我们也学到了用什么编码存 就用什么编码取
with open('c.txt',mode='rt',encoding='utf-8') as f: res=f.read() # t模式会将f.read()读出的结果解码成unicode
2.3 以t模式为基准进行内存操作
2.3.1 r模式的使用:
# r(默认的操作模式):只读模式,当文件不存在时报错,当文件存在时文件指针跳到开始位置 with open('c.txt',mode='rt',encoding='utf-8') as f: res=f.read() # 会将文件的内容由硬盘全部读入内存,赋值给res 练习:判断用户登入功能 inp_username = input('输入账号:') inp_password = input('输入密码:') with open('a.txt',mode='rt',encoding='UTF-8') as f: for line in f: username,password = line.strip().split(':')# if username == inp_username and password == inp_password: print('登入成功') break else: print('账号密码错误')
2.3.2 w模式的使用:
# w:只写模式,当文件不存在时会创建空文件,当文件存在会清空文件,指针位于开始位置 # with open('d.txt',mode='wt',encoding='utf-8') as f: # f.read() # 报错,不可读 # f.write('aaa ') #强调: # 1 在文件不关闭的情况下,连续的写入,后写的内容一定跟在前写内容的后面 with open('d.txt',mode='wt',encoding='utf-8') as f: f.write('a ') f.write('b ') f.write('c ') # 2 如果重新以w模式打开文件,则会清空文件内容 with open('d.txt',mode='wt',encoding='utf-8') as f: f.write('a ') with open('d.txt',mode='wt',encoding='utf-8') as f: f.write('b ') # 案例:w模式用来创建全新的文件 # 文件文件的copy工具 src_file=input('源文件路径>>: ').strip() dst_file=input('源文件路径>>: ').strip() with open(r'{}'.format(src_file),mode='rt',encoding='utf-8') as f1, open(r'{}'.format(dst_file),mode='wt',encoding='utf-8') as f2: res=f1.read() f2.write(res)
2.3.3 a模式的使用:
# a只追加写模式: 在文件不存在时会创建空文档,文件存在会将文件指针直接移动到文件末尾 with open('c.txt',mode='a',encoding='utf-8') as f: # f.read() # 报错,不能读 f.write('sdfsd ') f.write('sdf ') #强调 w 模式与 a 模式的异同: # 1 相同点:在打开的文件不关闭的情况下,连续的写入,新写的内容总会跟在前写的内容之后 # 2 不同点:以 a 模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后 # 小练习:实现注册功能: name=input('输入姓名: ').strip() pwd=input('输入密码: ').strip() with open('q.txt',mode='a',encoding='utf-8') as f: f.write('{}:{} '.format(name,pwd))
了解:r+ w+ a+ :可读可写 在平时工作中,我们只单纯使用r/w/a,要么只读,要么只写,一般不用可读可写的模式