一.初识文件操作
使用python来读写文件时非常简单的操作,我们会使用open()函数来打开一个文件,来获取文件的句柄,然后通过文件句柄来进行各种各样的操作,根据打开方式的不同能执行的操作也会有不同,
打开的方式有:r, w, a ,r+, a+, w+, rb, wb, ab, r+b, w+b, a+b.默认使用的是r(只读)模式.
#1.打开文件,得到文件句柄赋值给一个变量. f = open("a.txt","r",encoding="utf-8") #默认打开方式为r(读文件) #2.通过句柄对文件进行操作. s = f.read() #读文件, #3.读取文件 print(s) #4.关闭文件 f.close()
文件操作函数: f = open(文件名(路径),mode="?",encoding="字符集")
模式:(mode)::r, w, a ,r+, a+, w+, rb, wb, ab, r+b, w+b, a+b
字符集:utf-8,bgk,.........
注意:文件以什么方式存的,就要以什么方式打开.
二.文件的打开模式
#1.打开文件的模式有(默认为文本模式) r,只读模式 [默认模式,文件必须存在,不存在则抛出异常] w,只写模式 [不可读:不存在则创建:存在则清空内容] a,只追加写模式 [不可读:不存在则创建:存在则只追加内容,在结尾追加.] #2.对于非文本文件,我们只能使用b模式,"b表示字节的方式操作(而所有的文件都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码,图片文件的jgp格式,视频文件的avi格式)" rb wb ab 注:以b的方式打开时,读取到的内容都是字节类型,写入时也需要提供字节类型,不能指定编码. #3."+"模式(就是增加了一个功能) r+,读写 [可读,可写] w+,写读 [可写,可读] a+,写读 [可写,可读] #4.以bytes类型操作的读写,写读,写读模式 r+b,读写 [可读,可写] w+b,写读 [可写,可读] a+b.写读 [可写,可读]
***1.只读操作(r)
文件路径
㈠绝对路径:从磁盘的根目录寻找, 或者 从互联网寻找一个路径(网址)
![](/qrcode.jpg)
㈡相对路径(用的多):相对于当前程序所在的文件夹 ../ 上层文件夹
相对路径:
f = open("急急急.txt",mode="r",encoding="utf-8") s = f.read() print(s) f.close() #如果没有没有这个,你在下面的程序中如果删除这个文件,会报错. 结果: 我是真好看!!!! 急急急.txt的文件夹例的内容为:我是真好看!!!!
比如在e盘里创建一个叫abc的文件夹里有个叫我很好看的txt文件.
绝对路径:
f = open("e:/abc/我很好看.txt",mode="r",encoding="gbk") s = f.read() print(s) f.close() 结果: 对,我是真的好看!
f = open("急急急.txt",mode="r",encoding="utf-8") for line in f: #文件是一个可迭代对象 print(line.strip) #一行一行的处理数据,加strip()可以讲行与行之 间的空格去掉 结果: 床前明月光 疑是地上霜 举头望明月 #循环语句,将大文件全部读取,这种方式是最好的,每次读取一行内容,不会 低头思故乡 产生内存溢出来的问题. 急急急文件夹里的内容: 床前明月光 疑是地上霜 举头望明月 低头思故乡
***2.写模式(w)
f = open("哈哈哈",mode="w",encoding="utf-8") f.write("澳门赌场上线了!") f.flush() f.close() #如果没有建立文件夹,会自动添加文件夹 如果已经有文件夹了,会将文件夹的内容删除在添加新内容.
***3.追加模式(a):
在追加模式中,我们写入的东西会追加在文件的结尾.
写的时候,如果换行需要手动 \n ,不换行就会在后面一行
注意:在a,w,r中,只有追加a,光标才在最后面
f = open("哈哈哈",mode="a",encoding="utf-8") f.write("最近上线了!") f.write("xx荷官在线发牌!\n") f.write("客官快来呀!") f.flush() f.close() 结果: 澳门赌场!z最近上线了!xx荷官在线发牌!客官快来呀!最近上线了!xx荷官在线发牌! 客官快来呀
4.读写(r+),写读(w+),追加读(a+)
*** r+:对于写读模式,必须是先读的,因为默认光标是在开头的,读完之后再进行写入.
w+:先将所有的内容清空,然后写入,最后读取.但是读取的内容是空的.
a+:在a+模式下,不论先读还是后读,都是读不到数据的.
注意:不论读取多少内容,光标在哪里,写入的时候都是在结尾写入,光标在结尾,后面没有东西,所以读取内容为空.
f = open("哈哈哈",mode="r+",encoding="utf-8") s = f.read(3) #读取3个字符 print(s) f.write("有惊喜1") #在末尾写 结果: 澳门赌 哈哈哈 文件夹内容: 澳门赌场!z最近上线了!xx荷官在线发牌!客官快来呀!最近上线了!xx荷官在线发牌! 客官快来呀!有惊喜1
很少用,因为会清空文件夹的内容 f = open("哈哈哈",mode="w+",encoding="utf-8") s = f.write("哇哦,好厉害!") #写完之后光标在最后,读取时没有内容的 f.seek(0) #移动光标,移动到开头. s = f.read() print(s) f.flush() f.close() 结果: 哇哦,好厉害! 哈哈哈 文件夹内容: 哇哦,好厉害!
f = open("哈哈哈",mode="a+",encoding="utf-8") f.write("无益哇咔咔") f.seek(0) s = f.read() print(s) f.flush() f.close() 结果: 哇哦,好厉害!无益哇咔咔 哈哈哈 文件夹内容: 哇哦,好厉害!无益哇咔咔
***5.rb ,ab ,wb模式:
rb,wb,ab,b(bytes字节)如果处理的是非文本文件,mode里如果有b,encoding就不能给了.
f = open("c:/pdd.jpg",mode="rb") #不能写encoding e = open("e:/pdd.jpg",mode="wb") for line in f: #从C盘读取,line你是不知道读取了多少数据的,所以一 e.write(line) 行一行的读取.写入到e盘 f.close() e.flush() e.close() 结果; 将c盘里的pdd的图片写入到e盘里面.
三.常用操作:
1.seek(n)光标移动到n位置,注意,移动的单位是byes.
通常我们使用seek移动到开头或者结尾.
seek(0):移动到开头
seek(0,2):移动到结尾.seek的第二个参数表示是从哪个位置进行偏移的,默认是0,表示开头,1表示当前位置,2表示结尾.
f = open("哈哈哈",mode="r+",encoding="utf-8") f.seek(0) #光标移动到开头 content = f.read() #读取内容,此时光标移动到结尾 print(content) f.seek(0) #再次将光标移动到开头 f.seek(0,2) #将光标移动到结尾 content2 = f.read() #读取内容,什么都没有 print(content2) f.seek(0) #移动到开头 f.write("哇哈哈") #写入信息,此时光标在9 中文3*3个=9 一个中文=3个字节 f.flush() f.close()
2.tell()
使用tell()可以帮助我们获取当前光标在什么位置.
f = open("哈哈哈",mode="r+",encoding="utf-8") f.seek(0) #光标移动到开头 content = f.read() #读取内容,此时光标移动到结尾 print(content) f.seek(0) #再次将光标移动到开头 f.seek(0,2) #将光标移动到结尾 content2 = f.read() #读取内容,什么都没有 print(content2) f.seek(0) #移动到开头 f.write("哇哈哈") #写入信息,此时光标在9 中文3*3个=9 一个中文=3个字节 print(f.tell()) #光标位置9 f.flush() f.close()
3.truncate() 截断文件
f = open("哈哈哈",mode="w",encoding="utf-8") f.write('呵呵') #写入2个字节 f.seek(3) #光标移动到3,也就是两个字中间 f.truncate() #删除光标后面的所有内容 f.close() f = open("哈哈哈",mode="r+",encoding="utf-8") content = f.read(3) #读取12个字符 f.seek() print(f.tell()) f.truncate() #后面的所有内容全部都删除 f.flush() f.close()
深坑请注意:在r+模式下,如果读取了内容,不论读取内容多少,光标显示的是多少,在写入或者操作文件的时候都是在结尾进行的操作.
想要进行截断操作,要先挪动光标,挪到你想截断的位置,在进行截断.
四.修改文件
修改文件
①.引入os模块 import os
②.打开目标文件 r
③.打开文件的副本 w
④.从r中读取内容进行修改,写入到副本中.
⑤.删除源文件
⑥.重命名副本,将新文件的名字改成老文件的名字.
# f1 = open("Tom昨天干嘛去了", mode="r", encoding="utf-8") with open("Tom昨天又干嘛去了", mode="r", encoding="utf-8") as f1, \ open("Tom昨天又干嘛去了_副本", mode="w", encoding="utf-8") as f2: for line in f1: line = line.replace("Tom", "jk") f2.write(line) os.remove("Tom昨天又干嘛去了") # 删除文件 time.sleep(3) #将时间定为3秒,可以让人看到,要不然太快了 os.rename("Tom昨天又干嘛去了_副本","Tom昨天又干嘛去了") # 重命名新文件
注意:这是循环,如果一次将内容进行读取,会出现内存溢出,所以一行一行的读取和操作.