一,初识文件操作:
用open()来打开一个文件,获取到文件句柄,然后通过文件句柄进行各种操作,需要注意的是读取完的文件句柄一定要关闭,使用 f.close()
打开?文件的?方式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 默认使?用的是r(只读)模式
二,只读操作:
1. r :只读模式
建一个文件名为"哈哈哈"的文件,然后读一下:
f = open("哈哈哈",mode="r",encoding="utf-8") #此处的f是句柄,encoding表示编码集,根据文件的实际保存编码进行获取数据 content = f.read() print(content) f.close() #运行结果为: #哈哈哈 #lalala #呵呵呵 这是我写在"哈哈哈"文件里面的内容
2.rb:读取字节,在读取非文本文件,比如MP3,图像,视频等信息的时候可以用到,文件上传下载也可以用到
f = open("哈哈哈",mode="rb") #在rb模式下,不能选择encoding content = f.read() print(content) f.close() #结果为: b‘\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88\nlalala\n\xe5\x91\xb5\xe5\x91\xb5\xe5\x91\xb5‘ #因为rb模式下读取的是byte类型,所以会显示为字节
#返回上一级文件使用../,如果需要返回多层,增加使用../就可以了
绝对路径和相对路径:
1.绝对路径:从磁盘根目录开始一直到文件名
2.相对路径:同一个文件夹下的文件,相对于当前这个程序所在的文件夹而言,如果在同一个文件夹中,相对路径就是这个文件名,如果在上一层文件夹,则返回上一级文件使用../,如果需要返回多层,增加使用../就可以了
#推荐使用相对路径,在把程序copy给别人使用的时候,直接把项目copy走就可以运行了,但是使用绝对路径的话,还要把外部建的文件一起copy.
读取文件的方法:
1.read() 将文件中的内容全部读出来,弊端是占内存,如果文件过大的话,容易导致内存崩溃
f = open("哈哈哈",mode="r",encoding="utf-8") content = f.read() print(content)f.close
# 哈哈哈 # lalala # 呵呵呵
2.read(n) 读取n个字符,如果再次读取的话,会在当前位置继续读,而不是从头读,如果使用的事rb模式的话,读取出来的是n个字节
f = open("哈哈哈",mode="r",encoding="utf-8") content = f.read(6) print(content)f.close
# 哈哈哈 回车键也算一个字符,所以上面打印的是6个字符,出来的是五个字 # 咯咯
f = open("哈哈哈",mode="rb") content = f.read(6) print(content) #b‘\xe5\x93\x88\xe5\x93\x88‘ 打印出的是6个字节f.close
f = open("哈哈哈",mode="r",encoding="utf-8") content = f.read(2) content1 = read(2) print(content) print(content1)f.close #哈哈 #哈 因为我在创建文件的时候使用了回车键,所以回车键也算一个字符,所以第二个是一个"哈"字
3. readline() 一次读取一行数据,需要注意的是:readline()结尾,每次print都会默认有一个\n (换行),需要我们使用 .strip()的方法来去掉\n
f = open("哈哈哈",mode="r",encoding="utf-8") content = f.readline() content1 = f.readline() content2 = f.readline() print(content) print(content1) print(content2) f.close() # 结果为 #哈哈哈 # #lalala # #呵呵呵 # 此处三行空,就是print默认的\n
4.readlines() 将每一行形成一个元素,放到一个列表中,把所有的内容读出来,但是容易出现内存崩溃的问题,不推荐使用
f = open("哈哈哈",mode="r",encoding="utf-8") lst = f.readlines() print(lst) #[‘哈哈哈\n‘, ‘lalala\n‘, ‘呵呵呵‘] for line in lst: # 循环列表 print(line.strip()) #打印去掉\n的结果f.close #哈哈哈 #lalala #呵呵呵
5.循环读取:这种方式是最好的,每次读取一行内容,不会产生内存溢出的问题
f = open("哈哈哈",mode="r",encoding="utf-8") for line in f: print(line.strip()) #如果不用strip的话,会出现空行 f.close()
三.写模式(w,wb)
执行写模式的时候,如果没有这个文件,则会创建出这个文件,如果存在这个文件,则将原文件的内容删除,再写入新的内容
f = open("哈哈哈",mode="w",encoding="utf-8") f.write("神经病啊") f.flush() #刷新 f.close() #执行完后,"哈哈哈"文件里面的内容更换为"神经病啊"
在w模式下,不可以执行读操作
在wb模式下,可以不指定打开文件的编码(encodeing),但是在写文件的时候必须将字符串转化成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() # 你神经病啊你就是神经病
五,读写模式(r+,r+b)
使用读写模式的时候,必须要先读,因为默认光标是在开头的,读完了之后再进行写入,就会在正常读取后,在文件内容的后面写入.r+ 是我们以后使用频率最高的
不要先写后读,如果先写得话,会把开头的内容更改为你重新写入的内容,这样容易出错
f = open("哈哈哈",mode="r+",encoding="utf-8") content = f.read() f.write("hahahahahahha") print(content) f.flush() f.close() #读取完成后,在结尾写入
六,写读(w+,w+b):先将所有的内容清空,然后写入,最后读取,但是因为光标在最前面,座椅读取的内容是空的,不常用,也不可以先读,w+模式下,一开始就读不到数据,然后写的时候再将原来的内容清空,所以很少用
七, 追加读(a+): 在a+模式下,不论先读还是后读,都是读取不到数据的.
八,其他相关操作:
1.seek(n) 光标移动到n位置,
注意:移动的单位是byte,所以如果是utf-8的中文部分要是3的倍数
通常我们使用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) print(f.tell()) #打印光标位置 f.seek(0,1) #当前位置 print(f.tell()) #打印光标位置,跟上面是一样的,所以光标位置没有发生改变 f.write("张国荣") #在结尾处写入了 f.flush() f.close()
2.tell() 获取当前光标在什么位置,上面已经示例,可以看一下
3.runcate() 截断文件
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) #读到第三个字符 f.seek(9) #只能写3的倍数 print(f.tell()) #打印光标位置 f.truncate() #删除后面的内容 f.flush() f.close()
注意:在r+模式下,如果读取了内容,不论读取内容多少,光标显示的是多少,再写入或者操作文件的时候都是在结尾进行操作的
如果想做截断操作,要先挪动光标,挪到你想要截断的位置,然后再进行截断
九:文件修改以及另一种打开文件的方式
文件修改:只能讲文件中的内容读取到内存中,将信息修改后,然后把原文件删除,把新文件的名字改成原文件的名字
可以不关文件,过一段时间会自动关闭
import os with open("哈哈哈",mode="r",encoding="utf-8") as f1, open("哈哈哈_new",mode="w",encoding="utf-8") as f2: #打开文件,如果不存在会创建 content = f1.read() #读取原文件 new_content = content.replace("西瓜","草莓") #把西瓜改为草莓 f2.write(new_content) #把更改后的写入新文件 os.remove("哈哈哈") #删除原文件 os.rename("哈哈哈_new","哈哈哈") #把新文件名字改为原文件的名字
但是这种方法有个弊端,会一次将所有的内容进行读取,内存会溢出,
解决方法:用for循环一行一行的读取和操作
import os with open("哈哈哈", mode="r", encoding="utf-8") as f1,\ open("哈哈哈_new", mode="w", encoding="UTF-8") as f2: for line in f1: #循环原文件 new_line = line.replace("草莓", "西瓜") #原文件里面更改赋值给新文件里面的内容 f2.write(new_line) #把更改过的新文件内容写入新文件 os.remove("哈哈哈") # 删除源?文件 os.rename("哈哈哈_new", "哈哈哈") # 重命名新?文件
原文地址:https://www.cnblogs.com/lianghui-lianghui/p/9157015.html