一.介绍:
首先使用open()函数来打开一个文件,获取到文件句柄,通过文件句柄来进行操作.
打开文件的方式:r,w,a,r+,w+,a+,rb,wb,ab,r+b,w+b,a+b 默认使用的是r模式 带b的模式就是讲字符转换成字节
二.只读操作(r,rb)
f = open('学习',mode='r',encoding='utf-8') s = f.read() f.close() #关闭句柄,不要忘记写 print(s)
注意:encoding表示编码集,根据文件的实际保存编码进行获取数据,对于我们更多的是使用utf-8
rb.读取出来的数据是bytes类型,在rb模式下不能选择encoding字符集
f = open('学习',mode='rb') s = f.read() f.close() print(s) 结果: b'python\xe4\xbd\xa0\xe5\xa5\xbd'
rb的作用:用于读取非文本类文件,如mp3,图像,视频等 上传下载的时候会用到
绝对路径和相对路径:
相对路径:相当于当前程序所在的文件夹,如果在同一文件夹中,相对路径就是这个文件名.如果在上一层文件夹,则要 ../ 返回上一层
绝对路径:1.从磁盘根目录寻找,
2.互联网上的一个绝对路径
注意:使用相对路径,我们把程序给别人使用的时候,直接把项目拷走就能运行,而如果用绝对路径,还需要拷贝外部的文件.
读取文件的方法:
1.read(n)读取n个字符,需要注意,如果再次读取,那么会在当前位置继续去读而不是从头读,如果使用的是rb模式,则读取出来的是n个字节
f = open('学习',mode='r',encoding='utf-8') s= f.read(3) ss = f.read(3) f.close() print(s) print(ss) #结果 pyt hon
2.read()将文件中的内容全部读出来,弊端是占内存,如果文件过大容易内存奔溃
所以在读取较大的文件时可以用readline():一次读取一行数据,注意,每次读取出来的数据都会有一个\n 所以,需要我们使用strip()方法取到\n或空格
f = open('学习',mode='r',encoding='utf-8') s = f.readline().strip() s1 = f.readline().strip() s2 = f.readline().strip() s3 = f.readline().strip() f.close() print(s) print(s1) print(s2) print(s3)
3.:readlines()将每一行形成一个元素,放到一个列表里,将所有的内容都读取出来,所以也容易出现内存崩溃的现象,不推荐使用 拿到列表
4.推荐循环读取.这种方式是组好的,每次读取一行内容,不会产生内存溢出的问题
f = open('学习',mode='r',encoding='utf-8') for line in f: print(line.strip())
三.写模式(w,wb)
写的时候如果没有文件,则会创建文件,如果文件存在,则将原件中原来的内容删除,在写入新内容
f =open('在学习',mode='w',encoding='utf-8') s = f.write('刘德华') f.flush() #刷新 养成好习惯 f.close()
wb模式下,可以不指定打开文件的编码,但是在写文件的时候必须将字符串转发成utf-8的bytes数据
f = open('在学习',mode='wb') f.write('张学友'.encode('utf-8')) f.flush() f.close()
四.追加(a,ab)
在追加模式下,我们写入的内容会追加到文件的末尾
f = open('学习',mode='a',encoding='utf-8') f.write('你好啊') f.flush() f.close()
ab模式:
f = open('学习',mode='ab') f.write('世界'.encode('utf-8')) f.flush() f.close()
五.读写模式:(r+, r+b)
对于读写模式,必须是先读,因为默认光标是在开头的,所以先读,读完之后光标移动到后边在写.若先写,就会从头写,将前面的内容覆盖.但是有个神坑:当光标在内容之间的时候,写默认光标从末尾开始写.
f = open('学习',mode='r+',encoding='utf-8') s = f.read() f.write('努力学习') f.flush() f.close() print(s)
六,写读(w+,w+b)
先将所有的内容清空,然后写入,最后读取,但是读取的内容是空的
七.追加读(a+)
a+模式下,不论先读还是后读,都是读取不到数据的
八.其他相关操作:
1.seek(n)光标移动到n位置,注意,移动的单位是byte,所以如果是UTF-8的中文部分是3的倍数
移动到开头 seek(0)
移动到结尾seek(0,2)
在当前位置seek(0,1)
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 f.flush() f.close()
2.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 print(f.tell()) # 光标位置9 f.flush() f.close()
truncate()截断文件
f = open("⼩小娃娃", mode="w", encoding="utf-8") f.write("哈哈") # 写⼊入两个字符 f.seek(3) # 光标移动到3, 也就是两个字中间 f.truncate() # 删掉光标后⾯面的所有内容 f.close() f = open("⼩小娃娃", mode="r+", encoding="utf-8") content = f.read(3) # 读取12个字符 f.seek(4) print(f.tell()) f.truncate() # 后⾯面的所有内容全部都删掉 # print(content) f.flush() f.close() f = open("马大帅", mode="r+", encoding="utf-8") f.seek(12) # f.truncate() # truncate() 不给参数. 从文件头.截取到当前位置 f.truncate(15) # truncate(参数) 给了参数. 从文件头截取到你给这个参数的位置 f.flush() f.close()
所以如果想做截断操作. 记住了了. 要先挪动光标. 挪动到你想要截断的位置. 然后再进行截断
关于truncate(n), 如果给出了了n. 则从开头开头进⾏行行截断, 如果不给n, 则从当前位置截断. 后面
的内容将会被删除
九.
f = open('学习',mode='r',encoding='UTF-8') print(f.readable()) #判断时候可读 True print(f.writable())#判断是否可写 False
ps:strip() :去空格还可去换行\n 也可去制表符\t
十,修改文件以及另一种打开文件的方式:
文件修改.只能将文件中的内容读取到内存中,讲信息修改完毕,然后将源文件删除,将新文件的名字改成老文件的名字
来源:https://www.cnblogs.com/ITdong-1/p/9295977.html