文件
1、什么是文件
文件是操作系统提供给用户或者说应用程序操作硬盘的一种功能
2、为何要用文件
读写文件就是在读写硬盘:我们对文件的读写操作都会被操作系统转换成硬盘的读写操作
应用程序-------------》文件对象、文件句柄
操作系统-------------》文件
硬件-----------------》硬盘
3、如何用文件
# f = open(r'a.txt', mode='rt', encoding='utf-8')
# print(f) # 文件对象、文件句柄
#res = f.read()
#print(res)
#f.close() 关闭文件
# print(f)
# f.read() 读取文件
# del f 删除文件
with语句
with open('a.txt', mode='rt', encoding='utf-8') as f,\
(打开)(文本文件)(读写操作和内容模式)(编码方式)
open('b.txt',mode='wt',encoding='utf-8') as f1:
pass
文件打开模式
1、控制文件读写操作的模式
r(默认)读
w 写
a 追加写
2、控制文件读写内容的模式
t(默认的):读写都是以字符串为单位的,只适用于文件文件,必须指定encoding参数
b:读写都是以bytes为单位的,适用于所有文件,一定不能指定encoding参数
r模式:只读模式,如果文件不存在则报错,文件存在则文件指针处于文件开头
# f = open('a.txt',mode='rt',encoding='utf-8')
# print('='*50) #打印‘=’50行
# print(f.read()) #读文件f
# print(f.readable()) #判断是否只读 输出True
# print(f.writable()) #判断是否只写 输出Flase
# f.close() #关闭文件
w模式:只写模式,如果文件不存在则创建空文档,文件存在则清空,文件指针处于文件开头
# f = open('a.txt',mode='wt',encoding='utf-8')
# f.write("你好\n")
# f.write("哈哈哈\n")
# f.write("我擦勒\n")
# f.write("你好\n哈哈哈\n我擦勒\n")
# print(f.readable())
# print(f.writable())
# f.close()
总结:w模式,在打开了文件不关的情况下,连续的write写入,新写的内容永远跟在后面
a模式:只追加写模式,如果文件不存在则创建空文档,文件存在不会清空,文件指针处于文件末尾
# f = open('c.txt',mode='at',encoding='utf-8')
# f.write("4444\n")
# f.write("555\n")
# f.write("6666\n")
# print(f.readable())
# print(f.writable())
# f.close()
总结:a模式,在打开了文件不关的情况下,连续的write写入,新写的内容永远跟在后面,这一点与w模式相同
不同的是,在打开了文件关闭然后重新打开的情况下,a模式永远写在后面
b模式:读写都是以bytes为单位的,适用于所有文件,一定不能指定encoding参数
# with open('1.mp4',mode='rb') as f:
# res = f.read()
# print(res.decode('utf-8'))
# with open('a.txt',mode='rb') as f:
# res = f.read()
# print(res.decode('utf-8'))
# with open('a.txt',mode='ab') as f:
# f.write("啊手动阀手动阀".encode('utf-8'))
例:文件拷贝功能
方案一:
# with open('1.mp4',mode='rb') as f1,open(r'D:\1111111.mp4',mode='wb') as f2:
# res = f1.read()
# f2.write(res)
方案二:
储备知识:
# with open('a.txt',mode='rt',encoding='utf-8') as f:
# f.read()
# for line in f:
# print(line,end='')
# with open('1.mp4',mode='rb') as f:
# for line in f:
# print(line)
具体实现:
# with open('1.mp4',mode='rb') as f1,open(r'D:\1111111.mp4',mode='wb') as f2:
# for line in f1:
# f2.write(line)
# 可读可写
# r+t
# w+t
# a+t
# r+b
# w+b
# a+b
# with open('a.txt',mode='r+t',encoding='utf-8') as f:
# print(f.readable())
# print(f.writable())
# print(f.read())
# f.write("22222222222222222222\n")
# with open('a.txt',mode='w+t',encoding='utf-8') as f:
# print(f.readable())
# print(f.writable())
文件操作其他方法
# with open('a.txt',mode='rt',encoding='utf-8') as f:
# lines = f.readlines() #一下子全读出来
# print(lines)
# print(f.readline()) #只读一行
# with open('a.txt',mode='wt',encoding='utf-8') as f:
# f.write("111\n222\n333\n")
# lines = ['111\n','222\n','3333\n']
# for line in lines: #循环将lines里的给line
#f.write(line)
# f.writelines(lines) #一下子写入
# f.write('hello')
# f.flush() #刷新
# f.writelines('hello')
文件指针的移动
大前提:只有t模式下的,f.read(n)中的n代表的是字符个数,除此以外,关于指针的移动,单位都是字节bytes
# with open('a.txt',mode='rt',encoding='utf-8') as f:
# res = f.read(6)
# print(res)
# with open('a.txt',mode='rb') as f:
# # res = f.read(6)
# res = f.read(8)
# print(res.decode('utf-8'))
# f.truncate() #截取
# with open('a.txt',mode='r+t',encoding='utf-8') as f:
# f.truncate(8)
# f.seek移动的全都是字节个数
#f.seek(字节个数,0)
#f.seek(字节个数,1)
#f.seek(字节个数,2)
ps:只有0模式可以t下使用,其中1和2模式只能在b模式下使用,但是无论在t模式还是b模式下,移动的都是字节个数
# with open('a.txt',mode='rt',encoding='utf-8') as f:
# print(f.tell()) #告诉我们指针移动了多少
# f.seek(9,0)
# f.seek(3,0)
# with open('a.txt',mode='rb') as f:
# print(f.tell())
# f.seek(9,1)
# f.seek(3,1)
# f.seek(0,2)
# with open('a.txt',mode='ab') as f:
# print(f.tell())
#文件修改的原理:
把硬盘数据读入内存,在内存修改完毕后,再覆盖回硬盘
具体来说又分为两种方案
方案一:
# with open('test.txt',mode='rt',encoding='utf-8') as f:
# data = f.read()
# with open('test.txt',mode='wt',encoding='utf-8') as f:
# f.write(data.replace('egon','EGON'))
方案二:
import os #os模块
with open('test.txt',mode='rt',encoding='utf-8') as f1,\
open('.test.txt.swp',mode='wt',encoding='utf-8') as f2:
for line in f1:
f2.write(line.replace('EGON',"egon"))
os.remove('test.txt') #删除
os.rename('.test.txt.swp','test.txt') #改名字