文件操作
一、初始文件操作:
使用Python来读写文件是非常简单的操作。
我们使用open()函数来打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行操作了,根据打开方式的不同能够执行的操作也会有相应的差异。
二、文件操作模式
只读操作-- 'r'
#文件操作默认'r'模式 # ------------ r ------------ f = open('123','r',encoding='utf-8') #句柄 content = f.read() # 一次性将文件内容全都读出来,但是如果内容很多,会崩溃的 print(content) con_1 = f.readline()#将内容一行一行输出 con_2 = f.readline() print(con_1+con_2) ls = f.readlines() # 返回list 遍历列表即可得到内容 s = '' for i in ls: s = s + i print(s)
'rb' 读取出来的是bytes类型,不能选择encoding字符集
# -------- rb -------- f = open('文件示例','rb') #句柄 print(f.read()) # b'\xe4\xbd\xa0\xe5\x9c\xa8\n' #UTF-8编码下 一个中文占3个字节
rb的作用:
在读取非文本文件的时候,比如读取MP3图像、视频等信息的时候就需要用到rb,因为这种数据是没办法直接显示出来的,在后面我们文件上传下载的时候还会用到。
相对路径和绝对路径:
1、绝对路径:从磁盘根目录开始一直到文件名
2、相对路径:同一个文件夹下的文件,相对于当前这个程序所在的文件夹而言。如果在同一个文件夹中,则相对路径就是这个文件名,如果在上一层文件夹,则要../(跳出当前文件夹)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#相对路径和绝对路径 #相对路径 ../跳出当前文件夹 # f = open('../day06/文件示例',mode='r',encoding='utf-8') # print(f.read()) #绝对路径 -- 在磁盘中存在的位置 # f = open('/Users/langying/Desktop/hello.txt','r',encoding='utf-8') # content = f.read() # print(content) # f.close() #关闭文件句柄
我们更推荐大家使用相对路径。因为我们在把程序拷贝给别人使用的时候,直接把项目拷贝走就可以运行,但是如果用绝对路径,还需要拷贝外部文件。
读取文件的方法:
(1)read():将文件中的内容全部读取出来,弊端:占内存,如果文件过大,容易导致内存崩溃
(2)read(n):读取n个字符,注意:如果再次读取,那么会在当前位置继续去读而不是从头读,如果使用的是rb模式,,则读取出来的是n个字节。
(3)readline():一行一行读取数据
(4)readlines():将每一行形成一个元素,放到一个列表中。将所有的内容都读取出来,容易出现内存崩溃的问题
(5)循环读取
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# ------------ r ------------ f = open('123','r',encoding='utf-8') #句柄 content = f.read() # 一次性将文件内容全都读出来,但是如果内容很多,会崩溃的 print(content) con_1 = f.readline()#将内容一行一行输出 con_2 = f.readline() print(con_1+con_2) print(f.read(3)) #一次性读3个字节 ls = f.readlines() # 返回list 遍历列表即可得到内容 for i in ls: print(i) #循环读取
读取完一定要关闭 f.close()
写模式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# -------- w ----------- f = open('123','w',encoding='utf-8') # 文件名不存在则创建新文件 f.write('写模式下会先删除原来的内容,再继续写') # wb 模式 可以不指定打开文件的编码,但是写文件的时候一定写入bytes数据 f = open('123',mode='wb') f.write('金毛狮王'.encode('utf-8')) f.flush() f.close()
追加模式
# --------- a ---------- f = open('123','a',encoding='utf-8') f.write('a - append 从原来内容末尾追加') f.close()
读写模式
对于读写模式,必须是先读,因为默认光标在开头,读完了在进行写入
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# --------- r+ 可读可写 侧重读 ------------ f = open('123','r+',encoding='utf-8') #正常的顺序应该先读再写 content = f.read() #光标从头开始读到尾 print(content) f.write('你好啊') #光标从尾开始继续写内容 f.flush() #保证所有的文本都写到了内容里面 content = f.read() #读不出来了,因为光标已经到了最后了 print(content) # 空 f.close() #尝试一下先写后读 -- 不可以的 f.write('你好啊') #文件开头从"你在干"变成了'你好啊' #因为文件光标刚开始在开头,所以当你执行写操作的时候,光标从开头覆盖原文本 print(f.read()) #读取的内容不全 #光标在执行完写操作以后,光标已经停留到了'你好啊'后,所以无法打出这三个字 f.flush() f.close()
写读模式
在w+模式下,必须先读后写
# --------- w+ -------- f = open('文件示例','w+',encoding='utf-8') f.write('将文件内容清空,然后写入') print(f.read()) #读不出来,因为光标在最后 f.flush() f.close()
追加读模式
a+模式下,无论先读还是后读都是读不到数据的
# ---------- a+ -------- f = open('文件示例','a+',encoding='utf-8') f.write('在末尾追加') print(f.read()) #读不出来,因为光标在最后 f.flush() f.close()
其他操作
# 移动光标的方法 f = open('123','r+',encoding='utf-8') f.seek(0) #将光标移动到开头 f.seek(0,2) #将光标移动到结尾 f.tell() #光标所在位置 f.truncate()#将后面所有的内容全部截掉 f.close()
注意:
在r+模式下,如果读取了多少内容,光标显示的多少,再写入或者操作文件的时候都是在结尾进行的操作。
所以如果想做截断操作,要先移动光标,移动到你想要截断的位置,再进行截断。
关于截断操作:如果给出了n,则从开头进行截断,不给n,则从当前位置截断,后面的内容将会被删除。
修改文件以及另一种文件打开方式:
#不用每次都f.close()的方法 with open('123','r+',encoding='utf-8') as f: pass #将文件中的Alex全部替换成'Tommy' #打开老文件,将内容替换,再生成一份新文件,删除旧文件,重命名新文件 with open('123','r+',encoding='utf-8') as f ,\ open('123_1','w',encoding='utf-8') as f1: for i in f: # print(i.strip()) i = i.replace('Alex','Tommy') f1.write(i) #在文件开始导入os模块 os.remove('123') #删除旧文件 os.rename('123_1','123') #将新文件改名字