文件及文件的操作-读、写、追加的t和b模式

1.什么是文件?

文件是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位。

文件的操作核心:读和写

对文件进行读写操作就是向操作系统发出指令,操作系统将用户或者应用程序对文件的读写操作转换为具体的硬盘指令。(比如控制盘片转动,控制机械手臂移动来读写数据。)

2.为什么要有文件?

因为内存无法永久存储文件,但凡想要永久保存数据,我们都要将数据保存到硬盘中。而操作文件就可以实现对硬件的操作。

3.如何用文件?

# 把硬盘中的数据都到内存中

#rawstring 原始字符串 缩写为r,为了防止路径转义。

f = open(r"文件路径",mode = "r")  # 向操作系统发起请求,要求操作系统打开文件,占用操作系统的资源。(准备阶段)

date = f.read()  # 向操作系统发起读的请求,操作系统转换为具体的硬盘操作,将内容由硬盘都到内存。

f.close() # 谨记:用该方法对文件进行操作,操作完成后一定要及时关闭文件。(向操作系统发起请求,要求操作系统关闭资源,回收系统资源)

文件关闭后,操作系统已经关闭资源。不能再用f.read()读取文件内容。print(f)依然有输出,就是说还存在准备阶段。

控制读写文件内容的结果有两种:t模式(text)和b(bytes)模式。

注意:

1.t模式和b模式不能单独使用,需要与r/w/a之一连用

2.默认的内容格式为t。

操作文件的基础模式由三种。

1·r  默认的

2·w

3·a

1.r:read  只读模式

只能读,不能写

在文件不存在时,会报错  *****

在文件存在时,会将文件的指针移动到开头

f=open(r'C:UsersLENOVOPycharmProjectsuntitled2db.txt',mode='rt',encoding='utf-8')
data1=f.read()
print('第一次:',data1) # 第一次打印结束已经把文件内容读取完毕
print(type(data1))

data2=f.read()
print('第二次:',data2) # 第二次打印文件向后没有内容,所以打印为空
f.close()

第一次: gddj
'shsk
sdjjsk
dhjd'
sjskks
<class 'str'>
第二次:

f=open(r'C:UsersLENOVOPycharmProjectsuntitled2db.txt',mode='rt',encoding='utf-8')
data2=f.read()
print('第二次:',data2) # 重新加载文件内容到内存,光标移动到头部,可以读取。
f.close()

f=open(r'C:UsersLENOVOPycharmProjectsuntitled2db.txt',mode='rt',encoding='utf-8')
print(f.readable())
print(f.readline(),end='')
print(f.readline(),end='')

lines=f.readlines()
print(lines)
f.close()



w:write只写模式
1、只能写,不能读
2、在文件不存在时会创建空文件,在文件存在的时候会将文件内容清空(首次会清空,后续写入不会清空前面写入的) *****
f=open(r'C:UsersLENOVOPycharmProjectsuntitled2db.txt',mode='wt',encoding='utf-8') # 默认为wt模式(默认写入字符串)
print(f.readable()) # 不可读
f.read() # 报错,不可读
f.write('你好啊我的天 你好啊我的地 啊啊啊啊啊啊 ') # 文件里的内容被清空,后续写入不会被清空。
f.write('4444 ')
f.write('5555')

lines=['1111 ','2222 ','33333 ']
for line in lines: # 和下面的writelines一样效果
f.write(line)
f.writelines(lines)

f.close()


a:只追加写模式
1、只能写,不能读 ***
2、在文件不存在时会创建空文件,在文件存在的时候会将指针移动到文件末尾 ****

f=open(r'C:UsersLENOVOPycharmProjectsuntitled2db.txt',mode='at',encoding='utf-8')
print(f.readable()) # 不可读
f.read()

f.write('555555 6666 ')
f.writelines(['77777 ','8888888 ','999999999 '])

f.close()

b:二进制模式
注意:
1、一定不能指定字符编码,只有t模式才与字符编码有关 ***
2、b是二进制模式,是一种通用的文件读取模式,因为所有的文件在硬盘中都是以二进制形式存放的 ***

f=open(r'C:UsersLENOVOPycharmProjectsuntitled2TIM图片20180604145353.png','rb')
data=f.read()
print(data)
print(type(data))
f.close()
<class 'bytes'>

下面的操作就是打开一个视频文件,视频文件以只读的二进制模式加载到内存,然后把视频文件以只写的二进制模式写入到F盘
f=open('oldsiji.mp4','rb')
data=f.read()
f.close()
f=open(r'F:oldsiji.mp4','wb')
f.write(data)
f.close()


循环读
f=open(r'C:UsersLENOVOPycharmProjectsuntitled2db.txt','rt',encoding='utf-8')
for line in f:
print(line,end = "")
f.close()


f=open(r'C:UsersLENOVOPycharmProjectsuntitled2db.txt','rb')
for line in f:
print(line)
f.close()

f=open('oldsiji.mp4','rb')
for line in f:
print(line)
f.close()


f=open(r'C:UsersLENOVOPycharmProjectsuntitled2db.txt','wb')
f.write(b'eee')
f.write("你好啊".decode("utf-8")) # 'str' object has no attribute 'decode'
f.write("你好啊".encode("utf-8"))

f.close()


f=open(r'C:UsersLENOVOPycharmProjectsuntitled2db.txt','ab')
f.write('大家好,我是egon'.encode('utf-8'))
f.close()


# 上下文管理 *****
# 用with会自动帮你运行完关闭操作系统位置的文件,而且with后买你可以跟着多个读写操作 *****
with open(r'C:UsersLENOVOPycharmProjectsuntitled2db.txt','rb') as f,open(r'C:UsersLENOVOPycharmProjectsuntitled2prob','wt',encoding='utf-8') as f1:
# 文件的操作
src_data=f.read()
res=src_data.decode('utf-8')
print(res,type(res))
f1.write(res) # res必须是str,上面是wt格式。



with open('e.txt','rb') as f, # 这样写是因为把 的转义消掉了。看起来更加美观。
open('j.txt','wb') as f1:
#文件的操作
f1.write(f.read())








原文地址:https://www.cnblogs.com/Roc-Atlantis/p/9134018.html