Python文件读写模式与常见操作

程序的运行操作系统把相关的文件从硬盘加载到内存中,在内存中调用执行,当程序结束的时候,内存空间释放,执行的结果得不到保存,程序是一次性的。为了解决这个问题,我们在编码中引入文件的概念,通过文件我们把上次执行的结果保存在硬盘中。
Python提供调用函数open()来打开文件,将文件加载在内存中,供程序操作,操作完成后,再从内存写入硬盘。

f = open('te.txt',mode='r+',encoding='utf-8')
'''
第一个参数"te.txt"一般是文件路径+文件名,当与python脚本在同级目录下时写文件名即可。
第二个参数‘mode = ’表示文件打开的模式。
第三个参数"encoding = "表示文件的编解码方式,如果编解码方式不一致的话,python会报错,
文件写入硬盘最终以二进制的方式写入,当我们写入文本的时候,会通过encoding的编码方式把
文本转换为二进制码,也叫字节流。
'''

(utf-8编码格式下 默认一个中文三个字节 一个英文或符号 占用一个字节)
read() 功能: 读取字符的个数(里面的参数代表字符个数)
seek() 功能: 调整指针的位置(里面的参数代表字节个数)
tell() 功能: 当前光标左侧所有的字节数(返回字节数)

seek(0) 直接把光标移动到文件开头
seek(0,2) 直接把光标移动到文件末尾

文件打开的方式常见的为三种:
r、w、a.
r,表示文件的读取,这种模式下对于文件只用读取的权限,不能修改新增,如果调用write方法就会报错。

#打开文件
f = open('te.txt',mode='rt',encoding='utf-8')
#读取内容
data=f.read()
print(data)
#关闭文件
f.close()
运行结果:
hello,world!
#这行文字是我手动写入的。

w,表示写入文件,w模式下如果文件不存在那么就以第一个参数的文件名创建一个文件,如果那个文件存在,那么把文件中的内容清空,再在本次写入新内容。

# 1.打开文件
fp = open("te.txt",mode="w",encoding="utf-8") # 把冰箱门打开
# 2.写入内容
fp.write("把大象塞进去") # 把大象放进去
fp.weite("大象觉得有点冷")
# 3.关闭文件
fp.close() # 把冰箱门关上
通过在同一脚本中运行这三行代码,文件te.txt的内容被改变成了:把大象塞进去
#强调:
# 1 在文件不关闭的情况下,连续的写入,后写的内容一定跟在前写内容的后面
# 2 如果重新以w模式打开文件,则会清空文件内容

a,表示追加写模式: 在文件不存在时会创建空文档,文件存在会将文件指针直接移动到文件末尾,在末尾写入新的内容。在此模式下不能调用read()。以 a 模式重新打开文件,不会清空原文件内容。

fp = open('te.txt',mode='a',encoding='utf-8')
fp.write(",大象席地而坐")
fp.close()
#运行结果:
把大象塞进去大象觉得有点冷,大象席地而坐

r+ w+ a+ :可读可写
在平时工作中,我们只单纯使用r/w/a,要么只读,要么只写,一般不用可读可写的模式。

r+,r的增强模式,在此模式下能够进行写操作,这种写操作不会清空原文件,但是文件指针指向文件的头部,写的过程会直接在覆盖原本的内容。
w+,w的增强模式,在此模式下能够进行读操作,这种仍旧会清空文件。
a+,a的增强模式,在此模式下能够进行读操作,值得注意的是在此模式下文件指针指向的还是文件的末尾,读不出来什么东西。
在上述三种模式下:
第三个参数"encoding = "表示文件的编解码方式,如果编解码方式不一致的话,python会报错。
文件写入硬盘最终以二进制的方式写入,当我们写入文本的时候,会通过encoding的编码方式把文本转换为二进制码,也叫字节流。如果文件的数据本身就是二进制码,例如图片、视频等文件,则不需要encoding指定编码方式。

a = b'1234'
print(a , type(a))

strvar = "我爱你"
# encode 编码 -> 变成二进制字节流
res = strvar.encode("utf-8")
print(res , type(res))

# decode 解码 =>二进制字节流恢复成原来的字符串
res2 = res.decode("utf-8")
print(res2 , type(res2))
运行结果:
b'1234' <class 'bytes'>
b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0' <class 'bytes'>
我爱你 <class 'str'>

由此出现了一个新问题,如果我们操作的文件不是文本的话,那么意味着我们读写的时候是不用字符编码这种形式的。
t模式(文本模式),上述我们直接写r w a,指的就是 rt wt at。
b模式(二进制模式):

  1. 读写文件都是以bytes/二进制为单位的
  2. 可以针对所有文件
  3. 一定不能指定encoding参数
    示例:我们来复制一张图片
 fp1 = open('changze.png',mode='rb')
data = fp1.read()
fp2 = open('majiang.png',mode='wb')
fp2.write(data)
运行结果:
把changze.png的图片复制了张取名majiang.png

close 文件关闭的意义

刷新缓冲区 flush
当文件关闭的时候自动刷新缓冲区
当整个程序运行结束的时候自动刷新缓冲区
当缓冲区写满了 会自动刷新缓冲区
手动刷新缓冲区
手动把缓冲区里面的内容写入文件当中 fp.flush()

python中有一种形式来自动关闭文件:

with open('te.txt',mode='r',encoding = 'utf-8') as fp:
	fp.read()
	pass

但是如果一个文件在整个程序运行周期都处于打开方式的话,比如日之文件,用上述方法显然是不合理的。

文件相关的函数

读操作

f.read(num)  # 读取所有内容,执行完该操作后,文件指针会移动到文件末尾,是
#一个整形数值,表示我们一次性读入的字符数。

f.readline()  # 读取一行内容,光标移动到第二行首部参数 > 当前行字符总个数 => 以当前行读取
#参数 < 当前行字符总个数 => 以参数的大小来读取字符的个数

默认readline 读取一行

f.readlines()  # 读取每一行内容,存放于列表中,返回的结果是一个列表。

文件对象 fp 也是一个 可迭代对象 在遍历文件对象的时候,默认一次拿一行
强调:
f.read() 与*f.readlines()*都是将内容一次性读入内容,如果内容过大会导致内存溢出,若还想将内容全读入内存,则必须分多次读入。

其他函数
readable() 功能: 判断文件对象是否可读
writable() 功能: 判断文件对象是否可写

fp = open('te.txt',mode='r',encoding='utf-8')
res1 = fp.readable()
print(res1)
res2 = fp.writable()
print(res2)
运行结果:
True
False

writelines() 功能:将内容是字符串的可迭代性数据写入文件中 参数:内容为字符串类型的可迭代数据。
可迭代型数据(容器类型数据,range对象,迭代器)
truncate() 功能: 把要截取的字符串提取出来,然后清空内容将提取的字符串重新写入文件中 (字节)。

fp = open('te.txt',mode='r+',encoding='utf-8')
fp.truncate(10)
运行结果:
原本内容为:hello, world!
现在成为:
hello ,wor
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值