1.什么是文件
文件是操作系统提供给用户/应用程序操作硬盘的一种虚拟的概念/接口
用户/应用程序
操作系统(文件)
计算机硬件(硬盘)
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+
t文本(默认的模式)
# 1.读写都是以str(Unicode)为单位的
# 2.文本文件
# 3.必须为encoding='utf-8'
#没有指定encoding参数操作系统会使用自己默认的编码
#linux系统默认utf-8
#windos系统默认gbk
with open(r'aaa/a.py',mode='rt',encoding='utf-8') as f1 :
res=f1.read() #t模式会将f.read()读出的结果解码成Unicode
print(res,type(res))
f1.write('哈哈哈')
# 内存:utf-8格式的二进制------------------解码-----------------》unicode
#硬盘(c.txt内容:utf-8格式的二进制)
# 文件对象又称为文件句柄
# with open(r'aaa/a.py',mode='rt') as f1 : #fi=open(r'aaa/a.py',mode='rt')
# res=f1.read()
# print(res)
#
# with open(r'aaa/a.py', mode='rt') as f1,\
# open(r'bbb/b.py', mode='wt') as f2:
# res1 = f1.read()
# res2 = f2.write(res1)
# print(res1)
# print(res2)
# f1.clos()
# f2.clos()
B模式
# 控制文件读写内容的模式
# t:
# 1.读写都是以字符串(unicode)为单位
# 2.只能针对文本文件
# 3.必须指定字符编码
# b:binary模式
# 1.可以针对任何模式
# 2.读写都是以bytes(二进制)为单位
# 3.不能指定字符编码(encoding)
# 错误演示:t模式只能读文本文件
# with open(r'艾哈散客价到府.mp4',mode='rb') as f:
# bytes==>二进制
# 得到bytes的三种方法
# 1.字符串编码之后的结果
# '上'.encode('utf-8')
# bytes('上',encoding='utf-8')
# 2.'b'必须是纯英文字符
# 3.b模式下打开文件,f.red()读出内容
#总结:1.在操作文本文件方面t模式帮我们省去了编码与解码的环节,b模式则需要手动编码与解码,所以此时t模式更加方便
# 2.针对非文本文件时(如图片,视频,音频等)只能使用b模式
# f.read() #硬盘的二进制读入内存-》》t模式下会将读入的内容进行decode解码操作
# with open(r'艾哈散客价到府.mp4', mode='rb') as f:
# res = f.read() # 硬盘的二进制读入内存--》b模式下,不做任何转换,直接读入内存
# print(res, type(res)) # bytes类型--》当成二进制
# with open(r'a.py', mode='rb') as f:
# res=f.read() #utf-8的二进制--》unicode
# print(res)
# 文件拷贝工具
# A=input('请输入复制源文件地址:').strip()
# B=input('请输入粘贴源文件地址:').strip()
# with open('{}'.format(A),mode='rt',encoding='utf-8') as f :
# with open('{}'.format(B),mode='wt',encoding='utf-8') as f1:
# res=f.read()#内存占用过大
# f1.write(res)
# for c in f:
# f1.write(c)
#循环读取文件
#方式一:自己控制每次读取的数据的数据量
# with open(r'a.py',mode='rb') as f:
# while True:
# res=f.read(60)
# if len(res)==0:
# break
# print(len(res))
#方式二:以行为单位读,当一行内容过长时会会导致一次性读入内容的数据量过大
# with open(r'a.py',mode='rt',encoding='utf-8') as f:
# for ine in f:
# print(ine)
# with open(r'a.py',mode='rb') as f:
# for ine in f:
# print(ine)
# with open(r'huh.jpg',mode='rt',encoding='utf-8') as f:
# for ine in f:
# print(ine)
控制文件指针操作
#指针移动的单位都是以bytes/字节为单位
#只有一种情况特殊
# t模式下的read(n),n代表的是字符个数
# with open('aaaa',mode="rt",encoding='utf-8') as f:
# res=f.read(4)#abc你()4个字符
# print(res)
#f.seek(n,模式):n指的是移动的字节个数
#模式
#0:参照物是文件的开头位置
# f.seek(9,0)
# f.seek(3,0)#3
#1:参照物是当前指针所在位置
# f.seek(9,1)
# f.seek(3,1)#2
#2:参照物是当前指针所在位置,应该倒着移动
# f.seek(-9,2)#3
# f.seek(-3,2)#9
#强调:只有0模式可以再t下使用,1、2必须在b模式下使用
# f.tell()#获取文件指针当前位置
# 示范:
# with open('aaaa',mode="rb") as f:
# f.seek(9,0)
# f.seek(3,0)#3
# # print(f.tell())
# f.seek(4,0)#报错因为不完整
# res=f.read()
# print(res.decode('utf-8'))
文件操作的其他方法
#一:读相关操作
#1.readline:一次读一行
with open(r'a.py',mode='rt',encoding='utf-8') as f:
# res1=f.readline()
# res2=f.readline()
# res3=f.readline()
# print(res2)
while True:
line=f.readline()
if len(line)==0:
break
print(line)
# 2.readlines
# with open(r'a.py',mode='rt',encoding='utf-8') as f:
# res=f.readlines()
# print(res)
#强调:
#f.read()与f.readlines()都是将内容一次性读入内存,如果内容过大会导致内存溢出
# ,若还想全部读入内存,则必须分多次读入。
#二:写相关操作
#f.writelines():将列表里的元素循环写入文件
# with open(r'h.py',mode='wt',encoding='utf-8') as f:
# f.write('111\n222\n333\n')
# o=['111\n','222','333']
# # for c in o:
# f.write(c)
# f.writelines(o)
#补充一:如果是纯英文字符,可以直接加前缀b得到bytes类型
# with open(r'h.py', mode='wb') as f:
# o=[b'11s1s1s1f1',b'add5w4r4r4we',b'df84sfwf4']
# f.writelines(o)
#补充2:'上'.encode('utf-8')等同于bytes('上',encoding='utf-8')
# o=[bytes('上啊',encoding='utf-8'),
# bytes('冲啊',encoding='utf-8'),
# bytes('上啊',encoding='utf-8')
# ]
# f.writelines(o)
#补充3.flush:
# with open(r'h.py',mode='wt',encoding='utf-8') as f:
# f.write('哈哈哈')
# f.flush()# 写完一次立马写入硬盘 大多数情况不要执行
文件修改的2种方式
# 方式一:文本編輯器採用该种方式
# with open(r'c.txt', mode='rt', encoding='utf-8') as f:
# res = f.read()
# rt = res.replace('a','帅哥')
# with open(r'c.txt', mode='wt', encoding='utf-8') as f1:
# f1.write(rt)
# 缺点:如果文件内容过大则会占用计算机内存,影响运行速度
# 方式二:
# import os
#
#
#
# with open(r'c.txt', mode='rt', encoding='utf-8') as f,\
# open(r'ac.txt', mode='wt', encoding='utf-8') as f1:
# for res in f:
# f1.write(res.replace('a','帅哥'))
#
# os.remove('c.txt')
# os.rename('ac.txt','c.txt')