Python基本文件操作
引言:
1什么是文件:
文件是操作系统提供给用户/应用程序操作硬盘的一种虚拟的概念/接口
用户/应用程序(open())
操作系统(文件)
计算机硬件(硬盘)
2为何要用文件
用户/应用程序可以通过文件将数据永久的保存在硬盘中
操作文件就是操作硬盘
用户/应用程序直接操作的是文件,对文件的进行的所有操作,都是
在向操作系统发送系统调用,然后再由操作系统将其转换为具体的硬盘操作
3如何用文件: 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+
代码介绍
01文件基本操作
1打开文件
#windows路径分隔符问题
open('c:\a.txt\nb\c\d.txt') #这种情况路径字符串中存在转义字符,可能导致识别出错
#解决方案一:
open(r'c:\a.txt\nb\c\d.txt') #r表示原生字符
#解决方案二:
oprn('c:/a.txt/nb/c/d.txt')
2绝对路径与相对路径问题
Windows下有两种访问路径的方式
1绝对路径 优点:绝对能找到
缺点:太冗长
2相对路径 简单
f=open(r'a.txt',mode='rt',encoding='utf-8) #f的值是一种变量,占用的是 应用程序的内存空间
print(f) #结果:<_io.TextIOWrapper name='a.txt' mode='rt' encoding='utf-8'>
#操作文件:读写文件,应用程序对文件的读写请求都是在向操作系统发送
#系统调用,然后由操作系统控制硬盘把输入读入内存,或者写入硬盘
res=f.read()
print(res) #结果:哎呀(我的a.txt文件内存的内容)
print(type(res)) #结果:<class 'str'>
2关闭文件
f.close() #回收操作系统资源,操作系统能够打开的文件数是一定的,他会回收这个资源,但是他不知道什么时候回收,他就扫描你的文件,这样会增加负荷
print(f) #结果:<_io.TextIOWrapper name='a.txt' mode='rt' encoding='utf-8'>
f.read() #此时变量f存在,但是不能再读了
del f #此时是回收应用程序的资源,解除与变量之间的绑定,要注意先后顺序,不能先删变量然后回收操作系统资源
02:with上下文管理
with open(r'a.txt',mode='rt',encoding='utf-8') as f:
res=f.read()
print(res)
print(type(res))
#等同于f=open(r'a.txt',mode='rt',encoding='utf-8')
#没有执行f.close,因为with帮你执行好了,这就叫自动管理
with open(r'a.txt',mode='rt',encoding='utf-8') as f1,\
open(r'b.txt',mode='rt',encoding='utf-8')as f2:
res1=f1.read()
res2=f2.read()
print(res1)
print(res2)
#打开多个文件
03:指定字符编码
'''
强调:t和b不能单独使用,必须跟r/w/a连用
t文本(默认的模式)
1、读写都以str(unicode)为单位的
2、只针对文本文件
3、必须指定encoding='utf-8'
'''
#没有指定encoding参数操作系统会使用自己的默认编码
#Linux系统默认utf-8
#Windows系统默认gbk
with open(r'a.txt',mode='rt',encoding='utf-8')
res=f.read() #t模式会将f.read()的结果解码成Unicode,最终你才看到这个结果哈哈
print(res,type(res))
#内存:utf-8格式的二进制-----解码-----》unicode
# 硬盘(a.txt内容:utf-8格式的二进制)
04:文件操作模式详解
# 以t模式为基础进行内存操作
# 1、r(默认的操作模式):只读模式,当文件不存在时报错,当文件存在时文件指针跳到开始位置
with open(r'c.txt',mode='rt',encoding='utf-8') as f:
print('第一次读'.center(50,"*"))
res=f.read() #如果你没有指定的话,把所有内容一次性从硬盘读入内存,有缺陷的,如果文件过大(1T),将会把内存干爆
print(res)
print('第二次读'.center(50,"*")) #读的同时指针会移到最后,后面就没有内容了你读不出来的啦
res=f.read()
print(res)
#结果:(c.txt文件中存储的是:yanjialuo)
***********************第一次读***********************
yanjialuo
***********************第二次读***********************
with open(r'c.txt',mode='rt',encoding='utf-8') as f: #这样两次都能读出来,因为重新打开一次文件,指针会移动到开头位置
print('第一次读'.center(50,"*"))
res=f.read()
print(res)
with open(r'c.txt',mode='rt',encoding='utf-8') as f:
print('第二次读'.center(50,"*"))
res=f.read()
print(res)
#结果:
***********************第一次读***********************
yanjialuo
***********************第二次读***********************
yanjialuo
#简单的案例,登录测试案例
# ===============案例==================
# 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 直接用line.split(':')话他会保存\n对比会错
# username,password=line.strip().split(':')
# if inp_username == username and inp_password == password:
# print('login successfull')
# break
# else: #for循环正常结束并且没有被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('中国') 原先单纯的r模式不会写,r+会写,打开的时候指针是在开头的,这里是会覆盖写的
# 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()) #当前位置在最后还是读不出来
浙公网安备 33010602011771号