python笔记day11
open()功能的使用
- 模式介绍
控制文件读写内容的模式
t文本
b二进制/bytes
控制文件读写草错的模式
r只读模式
w只写模式
a之追加写模式
+:r+,w+,a+ - 基本操作流程
打开文件
读/写文件
关闭文件 - 资源回收与with语法
- 详细介绍文件模式
- 文件操作其他方法
- 文件的高级操作:控制文件指针的移动
- 文件修改的两种方式
文件
-
什么是文件
操作系统提供给用户、应用程序操作硬盘的一种虚拟概念、接口
用户 应用程序
操作系统(文件)
计算机硬件(硬盘) -
问什么要用文件
用户、应用程序可以通过文件将数据永久保存在硬盘中
即操作文件就是操作硬盘用户、应用程序直接操作的是文件,对文件进行的所有操作都是在向操作系统发送系统调用,然后再由其操作将其转换为具体的硬盘操作
-
如何用文件 open()
控制文件读写内容的模式:t和b
t和b不能单独使用,应和r/w/a连用
t文本(默认模式)
1.读写都已str(Unicode)为单位
2.文本文件
3.必须指定encoding='utf_8'
b二进制/bytes
控制文件读写草错的模式
r只读模式
w只写模式
a之追加写模式
+:r+,w+,a+
# 打开文件
#widows分隔符问题-反斜杠有转义
#解决法案1推荐:
#open(r'E:\python\day11\yoyo.txt')
#解决方案2:
#open('E:/python/day11/yoyo.txt')
#1.绝对路径和相对路径(从当前文件夹找)
f=open('test/a.txt',mode='rt')#向操作系统申请打开文件-映射到具体的空间上
print(f)#返回文件类型 f的值是一种变量,占用的是应用程序的内存空间
#2.操作文件-向操作系统发送系统调用,然后操作系统控制硬盘把输入读入内存,或者写入硬盘
res=f.read()
print(res)
#3.关闭文件-回收操作系统资源
f.close()
print(f)#f变量没有被回收,但已经没有意义了-不能再读写
del f#引用计数自动考虑
<_io.TextIOWrapper name='test/a.txt' mode='rt' encoding='utf-8'>
dffddf
<_io.TextIOWrapper name='test/a.txt' mode='rt' encoding='utf-8'>
with上下文管理
子代码执行后自动关闭文件
同时打开多个文件
#文件对象-又称文件句柄-用来控制文件
with open(r'yoyo.txt',mode='rt') as f1, open(r'test\a.txt',mode='rt') as f2:
res=f1.read()
print(res)
res=f2.read()
print(res)
嘤嘤嘤ixixixixi]
哈哈哈哈
嘻嘻哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤哈哈哈
dffddf
指定字符编码
t文本(默认模式)
1.读写都已str(Unicode)为单位
2.文本文件
3.必须指定encoding='utf-8'
#a.txt在硬盘上是utf-8格式的二进制
#内存 utf-8格式二进制-----------》t模式解码》---------unicode(str的默认格式)
#linux mac 默认utf-8
#windows 默认gbk-win10好像不是哈这里也没报错可能都改成utf-8了
with open('yoyo.txt',mode='r+t',encoding='utf-8')as f:
res=f.read()#t模式将读出结果解码成unicode #没有指定时会使用自己默认的编码
print(res,type(res))
f.write('哈哈哈')#参照encoding指定编码
res=f.read()#t模式将读出结果解码成unicode #没有指定时会使用自己默认的编码
print(res,type(res))
#t模式仅适用文本文件
嘤嘤嘤ixixixixi]
哈哈哈哈
嘻嘻哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤哈哈哈 <class 'str'>
<class 'str'>
文件操作模式详解
1. rt-案例-登录
默认操作模式 只读模式
当文件不存在时报错
默认打开文件时指针在开头
f.read()一次性时从头读到结尾
with open ('yoyo.txt',mode='rt',encoding='utf-8') as f:#bu'cubucu
print('first read')
res=f.read()
print(res)
print('second read')
res=f.read()#指针已经在结尾
print(res)
with open ('yoyo.txt',mode='rt',encoding='utf-8') as f:#重新打开指针又回到开头
print('next read')
res=f.read()
print(res)
first read
嘤嘤嘤ixixixixi]
哈哈哈哈
嘻嘻哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤哈哈哈哈哈哈
second read
next read
嘤嘤嘤ixixixixi]
哈哈哈哈
嘻嘻哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤哈哈哈哈哈哈
#案例-读取文件中用户名和密码
#应用程序-》文件
#应用程序-》数据库-》文件
inp_name=input('your name:').strip()
inp_pwd=input('your password:').strip()
with open('user.txt',mode='rt',encoding='utf-8') as f:
#按行便利取值
for line in f:
print(line,end='')
username,password=line.strip('\n').split(':')#删去结尾换行符
if inp_name==username and inp_pwd==password:
print('login successful')
break
else:
print('username or password wrong')
egen:123
lili:1234
login successful
2. wt-案例-拷贝
- 在用w模式打开文件没有关闭的情况下,连续的写,新内容总是在旧内容之后
- 重新打开文件,文件清空重新写-不能追加
关键文件不要用w模式!!!!!直接清空
只写模式 只能写 不能读
不存在时会创建空文件 文件存在时会清空文件,指针位于开始
用于创建全新文件
with open('d.txt',mode='wt',encoding='utf-8') as f:
f.write('哈哈哈哈哈\n嘻嘻嘻嘻嘻')
f.write('\n2222222')
with open('d.txt',mode='wt',encoding='utf-8') as f:
f.write('nanan')
#案例-拷贝文本文件
with open('e.txt',mode='rt',encoding='utf-8') as f1,\
open('f.txt',mode='wt',encoding='utf-8') as f2:
res=f1.read()
f2.write(res)
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. at-案例-注册
只追加写 不能读
文件不存在时,新建文件
文件存在时文件指针直接跳到末尾
- 打开文件不关时和w模式一样新写的在旧内容后面
- 重新打开文件 指针跳到文件结尾 不会清空
用于写老文件 比如日志文件
with open('e.txt',mode='at',encoding='utf-8') as f:
f.write('哈哈哈哈哈\n嘻嘻嘻嘻嘻')
f.write('\n2222222')
#案例 注册功能
name=input('your name:').strip()
pwd=input('your password:').strip()
with open('user.txt',mode='at',encoding='utf-8') as f:
f.write('{}:{}\n'.format(name,pwd))
了解+模式
通常不用+模式
+不能单独使用 必须配合r w a
r+文件不存在报错 存在时指针在开头
w+文件不存在创建 存在清空指针在开头
a+文件不存在创建 存在则指针在末尾
#r+
with open('yoyo.txt',mode='rt+',encoding='utf-8') as f:
print(f.read())#读取操作移动了指针
f.write('嘤嘤嘤')#写在文件末尾
with open('yoyo.txt',mode='rt+',encoding='utf-8') as f:
f.write('嘤嘤嘤')#写在文件开头覆盖原内容
#w+
with open('gg.txt',mode='wt+',encoding='utf-8') as f:
f.write('111\n')
f.write('222\n')
f.write('333\n')
print('====>',f.read())#写入后指针移动到末尾,从末尾开始读取为空
#a+
with open('gg.txt',mode='at+',encoding='utf-8') as f:
print("====>",f.read())#开头也读不出,指针在末尾
f.write('111\n')
f.write('222\n')
f.write('333\n')
print('====>',f.read())#写入后指针移动到末尾,从末尾开始读取为空
嘤嘤嘤ixixixixi]
哈哈哈哈
嘻嘻哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤
====>
====>
====>

浙公网安备 33010602011771号