1, 什么是文件
? 文件是操作系统提供给用户 / 应用程序操作硬盘的一种虚拟的概念 / 接口
? 用户 / 应用程序 (open())
? 操作系统 (文件)
? 计算机硬件 (硬盘)
2, 为何要用文件
? 用户 / 应用程序可以通过文件将数据永久保存的硬盘中
? 用户 / 应用程序直接操作的是文件, 对文件进行的所有的操作, 都是在向操作系统发送系统调用, 然后再由操作将其转换成具体的硬盘操作
3, 如何用文件: open()
1, 打开文件
Windows 路径分隔符问题
open('C:\a.txt\nb\c\d.txt')
解决方案一: 推荐
open(r'C:\a.txt\nb\c\d.txt')
解决方案二:
open('C:/a.txt/nb/c/d.txt')
相对路径和绝对路径: 就是基于这个目录和根目录的区别
## 2, 操作文件:
读 / 写文件, 应用程序对文件的读写请求都是在向操作系统发送系统调用, 然后由操作系统控制硬盘把输入读入内存, 或者写入硬盘.
res=f.read() 等
3, 关闭文件
- f.close() # 回收操作系统资源
- del f # 回收应用程序资源
4, 子代码块
- whit open() as f:
- ...
open 返回对象称为文件对象又称为文件句柄
- with open('a.txt',mode='rt') as f1: # f1=open('a.txt',mode='rt')
- res=f1.read()
- print(res)
- # 模板
- with open('a.txt',mode='rt') as f1, open('b.txt',mode='rt') as f2:
- ...
5, 文件操作相关字符编码
? 强调: t 和 b 不能单独使用, 必须跟 r/w/a 连用
? t 文本 (默认的模式)
? 1, 读写都以 str(unicode) 为单位的
? 2, 文本文件
? 3, 必须指定 encoding='utf-8'
没有指定 encoding 参数操作系统会使用自己默认的编码
内存: utf-8 格式的二进制 ----- 解码 ----->unicode
硬盘 (c.txt 内容: utf-8 格式的二进制)
Linux\Mac 系统默认 utf-8
Windows 系统默认 gbk
- with open('c.txt',mode='rt',encoding='utf-8') as f:
- res=f.read() # t 模式会将 f.read() 读出的结果解码成 unicode
- print(res,type(res))
6, 操作模式
以 t 模式为基础进行内存操作
1,r(默认的操作模式): 只读模式, 当文件不存在时报错, 当文件存在时文件指针跳到开始位置
- with open('c.txt',mode='rt',encoding='utf-8') as f:
- print('第一次读'.center(50,'*'))
- res=f.read() # 把所有内容从硬盘读入内存
- print(res)
- with open('c.txt', mode='rt', encoding='utf-8') as f:
- print('第二次读'.center(50,'*'))
- res1=f.read()
- print(res1)
登录操作
=============== 案例 ==================
- inp_username=input('your name>>:').strip()
- inp_password=input('your password>>:').strip()
- # 验证
- with open('user.txt',mode='rt',encoding='utf-8') as f:
- for line in f: # 按每行顺序一次读入的循环
- # print(line,end='') # egon:123\n, 所以要用到 strip() 功能
- username,password=line.strip().split(':')
- if inp_username == username and inp_password == password:
- print('login successfull')
- break
- else:
- print('账号或密码错误')
2,w: 只写模式, 当文件不存在时会创建空文件, 当文件存在会清空文件, 指针位于开始位置
- with open('d.txt',mode='wt',encoding='utf-8') as f:
- f.read() # 报错, 不可读
- f.write('擦勒 \ n')
强调 1:
在以 w 模式打开文件没有关闭的情况下, 连续写入, 新的内容总是跟在旧的之后
- with open('d.txt',mode='wt',encoding='utf-8') as f:
- f.write('擦勒 1\n')
- f.write('擦勒 2\n')
- f.write('擦勒 3\n')
强调 2:
如果重新以 w 模式打开文件, 则会清空文件内容
- with open('d.txt',mode='wt',encoding='utf-8') as f:
- f.write('擦勒 1\n')
- with open('d.txt',mode='wt',encoding='utf-8') as f:
- f.write('擦勒 2\n')
- with open('d.txt',mode='wt',encoding='utf-8') as f:
- f.write('擦勒 3\n')
案例: 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)
3,a: 只追加写, 在文件不存在时会创建空文档, 在文件存在时文件指针会直接调到末尾
- with open('e.txt',mode='at',encoding='utf-8') as f:
- # f.read() # 报错, 不能读
- ? f.write('擦嘞 1\n')
- ? f.write('擦嘞 2\n')
- ? f.write('擦嘞 3\n')
强调 w 模式与 a 模式的异同:
1 相同点: 在打开的文件不关闭的情况下, 连续的写入, 新写的内容总会跟在前写的内容之后
2 不同点: 以 a 模式重新打开文件, 不会清空原文件内容, 会将文件指针直接移动到文件末尾, 新写的内容永远写在最后
案例: a 模式用来在原有的文件内存的基础之上写入新的内容, 比如记录日志, 注册
注册功能
- name=input('your name>>:')
- pwd=input('your name>>:')
- with open('db.txt',mode='at',encoding='utf-8') as f:
- f.write('{}:{}\n'.format(name,pwd))
了解:+ 不能单独使用, 必须配合 r,w,a
- with open('g.txt',mode='rt+',encoding='utf-8') as f: # 读的条件下又增加了写
- # print(f.read())
- f.write('中国')
- with open('g.txt',mode='w+t',encoding='utf-8') as f: # 写的条件下又增加了读
- f.write('111\n')
- f.write('222\n')
- f.write('333\n')
- print('====>',f.read())
- with open('g.txt',mode='a+t',encoding='utf-8') as f: # 写的条件下又增加了读
- print(f.read())
- f.write('444\n')
- f.write('5555\n')
- print(f.read())
来源: http://www.bubuko.com/infodetail-3459772.html