python文件操作
python文件操作
文件的概念
文件就像是系统呈现在我们面前的能够使用硬盘的快捷方式,文件可以是文本文档、图片、程序等等。文件通常具有点+三个字母的文件扩展名,用于指示文件类型(例如,图片文件常常以JPEG格式保存并且文件扩展名为.jpg)
graph TD
A(硬盘)-->B(双击文件打开)
B-->|文件从硬盘加载到内存|C(内存)
双击打开文件操作
graph TD
A(内存)-->B(ctrl+s)
B-->|文件从内存刷入硬盘|C(硬盘)
ctrl+s保存文件操作
python中利用代码打开文件的方式
方法1:
f = open(文件路径,读写模式,encoding='utf8')
f.close()
在该方法中打开的文件需要输入代码才可以结束调用
方法2:
with open('a.txt', 'r', encoding='utf8') as f1:
with子代码块
在第二中方法中,with子代码块执行完毕后会自动关闭打开的文件,不需要输入额外的代码
PS:在python中“\”与其他字母的联用会有特殊效果,如果在输入的文件路径中有这种情况出现,
就会导致文件路径混乱,为避免该情况,我们可以在文件路径前加字母'r'来区分
with open(r'a.txt', 'r', encoding='utf8') as f1:
with子代码块
with语法的使用可以一次打开多个文件,只需用逗号隔开即可:
with open() as f1,open() as f2,open() as f3:
子代码
python中文件读写模式
1.“r” 只读模式(只读取不写入)
with open(r'a.txt', 'r', encoding='utf8') as f: print(f.read()) *如果文件路径不正确或不存在的话会直接报错 *如果文件路径正确,则直接读取该文件
2.“w” 只写模式(只写入不展示过程)
with open(r'b.txt', 'w', encoding='utf8') as f: pass *如果文件路径不存在,会直接创建新文件 *如果文件路径存在,则会抹除文件中原有的数据,重新写入 *"pass"关键字只负责补全代码语法结构,不执行任何操作
3.“a” 只追加模式(之在文件末尾写入数据)
with open(r'a.txt', 'a', encoding='utf8') as f: f.write(数据值) *只追加模式下,如果文件路径存在,则只会在文件末尾追加写入数据 *如果文件路径不存在的话,会直接创建一个新文件
python中的文件操作模式
1."t" 文本模式
*文本模式是python的默认操作模式,在以上三种读写模式中,完全的拼写应该是"rt","wt","at",但是在实际运用过程中我们可以省略"t" *文本模式下只能操作文本文件 *文本模式下的读写都是以字符为单位的 *在使用文本模式时,需要encoding参数指定编码方式,如果为添加encoding参数,则以计算机默认的编码进行操作
2."b" 二进制模式(bytes模式)
*二进制模式不是python的默认操作方式,需要在读写模式的字母后添加“b”来指定(rb,wb,ab) *可以操作任意类型的数据,将数据处理为二进制进行操作 *二进制模式下的读写都是以bytes(字节)为单位的 *不需要encoding参数指定编码,其本身采用二进制编码
文件诸多操作方法
graph LR
A(文件操作方法)-->B(read相关)
B-->1(read方法)
B-->2(readline方法)
B-->3(readlines方法)
B-->4(readable方法)
B-->5(for循环与read方法联用)
A-->C(write相关)
C-->a(write方法)
C-->b(writeable方法)
C-->c(writelines方法)
A-->D(flush方法)
- read相关
- read方法:
with open(r'a.txt', 'r', encoding='utf8') as f: f.read() *read方法会一次性读取文件所有内容,读取结束后光标停在文件末尾 *当文件内容过多时一次性读取会造成内存溢出 *read后面的括号中可以填写数字,代表读取字符的个数
- readline方法
with open(r'a.txt', 'r', encoding='utf8') as f: f.readline() *readline方法一次只读取一行内容
- readlines方法
with open(r'a.txt', 'r', encoding='utf8') as f: f.readlines() *readlines方法会读取文件中所有数据,并按照分行将其组织成列表
- readable方法
with open(r'a.txt', 'r', encoding='utf8') as f: f.readable() *readable用来判断文件是否处于可读取状态
- for循环与read方法联用
with open(r'a.txt', 'r', encoding='utf8') as f: for line in f: print(line) *for循环的使用也可以实现一行一行的读取文件内容
- write相关
- write方法
with open(r'a.txt', 'w', encoding='utf8') as f: f.write() *write方法后的括号内可以跟随需要写入的数据
- writeable方法
with open(r'a.txt', 'w', encoding='utf8') as f: f.writeable() *writeable方法用来判断文件是否是可写入文件
- writelines方法
with open(r'a.txt', 'w', encoding='utf8') as f: f.writelines([1,2,3,4,5]) *writelines方法会接受一个列表,然后将列表中的数据值写入文件
- flush方法
with open(r'a.txt', 'w', encoding='utf8') as f: f.flush() *flush方法的作用是将内存中的文件立刻存储到硬盘,与ctrl+s的作用相同
文件内光标的移动
- seek方法
with open(r'a.txt', 'rb') as f:
print(f.read())
f.seek(0,0)
语法构成:seek(偏移量,模式)
偏移量表示光标移动的字节数
模式分为三种:“0”,“1”,“2”
0:光标基于文件开头位置移动,在文本模式以及二进制模式都可以使用
1:光标基于光标当前所在位置移动,只可以在二进制模式下使用
2:光标基于文件末尾位置移动,只可以在二进制模式下使用
- tell方法
with open(r'a.txt', 'rb') as f:
print(f.read())
f.tell()
tell方法的作用是指出光标距离返回文件开头位置已经移动了多少距离
文件内光标移动案例(了解)
import time
with open(r'a.txt', 'rb') as f:
f.seek(0, 2) # 光标处于文件末尾
while True:
line = f.readline() # 读取每一行数据,但是由于光标在文件末尾,所以无法读取
if len(line) == 0: # 无法读取的情况下值为0
# 没有内容
time.sleep(0.5) # 每间隔0.5秒进行一次读取
else:
print(line.decode('utf8'), end='') # 当文件内容改变后,输出读取到的新增数据
计算机修改数据的原理
计算机储存数据的方式类似于刻字,用磁头将数据刻写在磁盘上,而当我们需要修改数据内容时,并不能在硬盘已经刻写好的数据中间部分添加或者删除,计算机只能将原有的数据抹除,然后重新刻写
而在计算机中,我们所进行的删除操作,只是将数据的状态进行改变,计算机会将硬盘中我们所删除的数据打上空白标记,将原来这些数据占用的数据存储单元解放出来,“空白”的意思就是可用,新存进硬盘里的数据会直接写在这个位置,把这个文件的数据覆盖掉,也就是自始至终这个文件都没有消失,只是被当成了空白的空间,这就像是一幅画,画家觉得没有画好,他不会直接丢掉这张纸,而是等到下次画新画的时候,把旧画当成一张白纸,在上面画新的内容。
文件内容修改(了解)
修改文件内容的方式1:覆盖写
with open(r'a.txt', 'r', encoding='utf8') as f:
data = f.read() # 用变量名绑定读取到的数据
with open(r'a.txt', 'w', encoding='utf8') as f1:
f1.write(data.replace('jason', 'tony')) # 写入新的数据替换原有的数据
修改文件内容的方式2:换地方写
'''先在另外一个地方写入内容 然后将源文件删除 将新文件命名成源文件'''
import os
with open('a.txt', 'r', encoding='utf8') as read_f,
open('.a.txt.swap', 'w', encoding='utf-8') as write_f:
for line in read_f:
write_f.write(line.replace('tony', 'kevinSB'))
os.remove('a.txt') # 删除a.txt
os.rename('.a.txt.swap', 'a.txt') # 重命名文件