浅谈文件操作
一、初识文件操作
使用Python对对文件读写,使用open()函数来打开文件,获取文件句柄,而后对文件句柄进行操作,根据打开方式的不同,能执行的操作也有差异
打开文件的方式有:r,w,a,r+,w+a+,rb,wb,ab,r+b,w+b,a+b,默认使用的是r(只读)模式
二、只读模式(r,rb)
f = open("文件名.txt",mode="r",encoding="UTF-8") content= f.read() print(content) f.close() #encoding是选择编码类型,一般选择使用UTF-8
f=open("文件名.txt",mode="rb")#"rb"输出的是bytes类型,不能选择encoding content= f.read() print(content) f.close #输出的结果是文件中的文件内容所对应的16进制字节
在这里补充一个概念:路径
绝对路径:从磁盘跟目录起一直到文件名
相对路径:相对当前执行的这个程序所在的文件夹而言的路径, "../"表示上一级文件夹
一般情况,为确保代码的可移植性,通常使用相对路径
1)read:将文件的内容全部读取出来,但是当遇到较大文件时容易造成内存奔溃
2)read(n):读取n个字符,需要注意的是,如果再次读取,会从当前位置读取而不是从头读取,使用rb时,读取出来的是几个字节(这里涉及到光标的概念,后文介绍)
3)readline() :一次读一行数据,但是在读取后的数据结尾都会有一个自动换行,这个时候就需要.strip()方法来去掉空格或\n
f=open("asd.txt",mode="r",encoding="UTF-8") content=f.readline() content2=f.readline() content3=f.readline() print(content.strip()) print(content2.strip()) print(content3.strip()) f.close()
4)readlines():将文件中的每一行形成一个元素,并放置在列表中。由于也是将文件中的所有文件都读取出来,容易出现内容崩溃的情况
f=open("文件名.txt",mode="r",encoding="UTF-8") lst=f.readlines() print(lst) for line in list: print(line.strip())
5)循环读取的方式,每次只读取一行,不会产生内存溢出的问题
f=open("abc.txt",mode="r",encoding="UTF-8") for line in f print(line.strip())
三、写模式(“w,wb”)
写文件的时候如果文件存在,则将文件中的内容删除而后写入新内容,如果不存在,就创建该文件
f=open("qwe.txt",mode="w",encoding="UTF-8") f.write("try it") f.flush() f.close()
在写模式下, 是不能进行读操作的
f=open("asd.txt",mode="wb") f.write("try everything",encoding="UTF-8") #在“wb”模式下, 可以不指定文件的编码, 但是在写入时必须将字符串转换为UTF-8数据 f.flush() f.close()
四、追加模式(a,ab)
在追加模式下,我们写入的内容会追加在文件的结尾
五、读写模式(r+,r+b)
进入读写模式,程序肯定是先读后写,因为光标是在开头准备读取的,读取完毕后,光标落入结尾,开始写入
f=open("asdasd.txt",mode="r+",encoding="UTF-8") content=f.read() #先读 f.write("try") #后写 print(content) f.flush() f.close()
如果先写后读,程序会把开头的内容改变成写入的内容而后输出后半部分的内容。
六、写读(w+,w+b)
先将所有的内容清空,然后写入,最后读取,但是读取的内容是空的。不常用
七、追加读(a+)
在追加模式下, 无论是先读还是先写,都读取不到数据,追加的内容写在最后
八、其他相关操作
1、seek(n)把光标移动到 n位置,,移动的是byte,所以中文部分需要移动3的倍数
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()获取光标当前所在的位置
3、在r+模式下. 如果读取了了内容. 不论读取内容多少. 光标显示的是多少. 再写入或者操作文件的时候都是在结尾进行行的操作.所以如果想做截断操作. 记住了了. 要先挪动光标. 挪动到你想要截断的位置. 然后再进行行截断,关于truncate(n), 如果给出了了n. 则从开头开头进行行截断, 如果不给n, 则从当前位置截断. 后面的内容将会被删除。
九、文件修改
mport 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", "歌单") # 重命名新⽂文件

浙公网安备 33010602011771号