文件的基本操作
1,文件的操作:我们使用open( )来函数来打开一个文件获取到文件句柄,同过句柄就可以进行各种操作了,根据打开的方式不同,执行的操作也不同.
- 1>只读(r )
f = open("护士少妇嫩模", mode="r", encoding="UTF-8") # f在这里,我们是获得要读取文件的句柄,open是打开文件, 第一个引号是要打开文件的名称 # mode 是表示用什么模式打开文件,encoding是编码集根据文件的实际编码进行获取数据(utf-8) content = f.read() # 把执行文件读取的操作,并返回的内容赋值给content print(content) # f.close() # 关闭这个文件,避免对pc机资源的浪费
- 1.1>只读(rb)在rb模式下读取出来的数据是bytes类型,应为是bytes,所以没必要在进行encoding.
f = open("护士少妇嫩模", mode="rb") # 当用rb模式打开的时候,不需要编码 content = f.read() # 读取文件中的内容 print(content) # b'\xe6\xaf\x85\xe5\x93\xa5, \xe5\xa4\xaa\xe7\x99\xbd, wuse\n\xe5\x91 f.close() # \xb5\xe5\x91\xb5\n\xe6\x97\xa5\xe5\xa4\xa9'是一个将字符串经过utf-8编码的bytes
- rb的作用是在我们读取非文本的时候比如:图像,视频等信息时,就要用到rb,这种数据没办法直接显示,文件的上传下载还会用到
2,绝对路径和相对路径
- 2.1>绝对路径:从磁盘根目录开始一直到文件名
- 2.2>相对路径:同一个文件下的文件,相当于当前文件夹而言,如果在同一个文件夹下,则相对路径就是这个文件名,如果在上一层则要../
推荐使用相对路径
- 2.3>只读(r,rb)格式: .read( )括号中也可以添加内容,内容的单位是字符 .read(n)就是读取n个字符,如果再读,就会从当前位置继续去读,不是从头读.
f = open("护士少妇嫩模", mode="r", encoding="utf-8") content = f.read(3) # 默认光标在开始的位置,开始读3个字符,从光标当前位置向后读个字符 print(content) # 雨一直下 f.close() # 关闭源文件 # rb模式和这个一样,只不过读出来的是字节
- 2.4> .readline( )一次读取一行,readline()每次读出来的数据都会有\n,所以我们要用 .strip()来去掉\n或者空格
f = open("护士少妇嫩模", mode="r", encoding="utf-8") content = f.readline() # 当括号里什么都不加时,默认是读第一行,当括号里加数字时,就是读取几个字符和read(n)一样 print(content) # 雨一直下,气氛不算融洽 f.close() # 关闭源文件 # 在这里每一行都当做是一个元素,放到一个列表中(readlines())
- 2.5>循环读取,这样就避免一次一次去把每一行敲出来,节省重复性工作,且每次读取一行,也避免了内存奔溃.
f = open("护士少妇嫩模", mode="r", encoding="utf-8") for line in f: # 把句柄中的每一行拿出来,放到line中 print(line.strip()) # 拿出来以后,因为每一行有一个换行,打印的时候有一个默认的换行,因此,要去掉一个换行 f.close()
3,写读模式(w,wb):致谢的文件,如果没有则会创建一个文件,如果已经存在了文件,就会将源文件中的内容删除再,冲新输入新的内容.
f = open("天龙八部", mode="w", encoding="utf-8") # 在写的模式下,如果没有该文件,即创建该文件 content = f.write("乔峰") # 在天龙八部这个文件中,先清空所有内容,再把乔峰写到文件中 f.flush() # 刷新,养成好的习惯(当数据量庞大的时候,把数据高效,完整的传输过去) f.close() # 关闭源文件 print(content) # 此时写入文件的是字节,因为中文被utf-8编码了
f = open("天龙八部", mode="w") # (wb形式) content = f.write("马尔扎哈".encode("utf-8")) # 写入的字符串必须要转化成bytes f.flush() f.close() print(content) # 12(4个字符, 12个字节)
4,追加(a ab):在追加的模式下,我们写入的内容会追加到文件的结尾.
f = open("天宫八部", mode="a", encoding="utf-8") # 是在已经存在的文件中增加内容 content = f.write("阿紫") # 在原文件中的末尾追加内容 f.flush() # 刷新 f.close() # 关闭原文件 print(content) # 2(表示写入的是2个字符)
5,读写模式(r+,r+b)对于读写必须是先读,光标默认是从头开始的,当读完了之后再写入.
f = open("天龙八部", mode="r+", encoding="utf-8") # 打开文件是读写模式 content = f.read() # 当括号里边没有参数的时候,读取所有的内容, 当了里边有参数的时候,就读取几个字符(参数必须是int) f.write("刺激战场") # 在文件的末尾增加"刺激战场"(即使光标读取几个字符以后,也是在文件的末尾增加内容) f.flush() f.close() print(content) # 张无忌马尔扎哈("刺激战场"是看不到的,因为没有读) f.write("刺激战场") # 先写再读,就会在文件的开始覆盖响应的字符 content = f.read() # 再du就是读光标之后的字符,当括号里有数字的,就读取几个字符 f.flush() f.close() print(content) # 尔扎哈 # 在r+模式下必须是先读,再写入
6,其他相关操作: .seek()光标移动位置.
- 1> .seek(n)光标移动到n的位置,这里光标移动的单位是byte,所以如果是utf-8的中文部分是3的倍数.
- 2> seek(0)是表示光标在开头
- 3> seek(0,2)表示光标从开头移动到结尾.......0表示光标移动到开头,1表示移动到当前位置,2表示光标移动到结尾.
f = open("天龙八部", mode="r+", encoding="utf-8") f.seek(3) # 先把光标从当前位置移动3个字节(必须是3的倍数, 否则报错 content = f.read(3) # 文件从当前光标向后读3个字符 f.flush() f.close() print(content) # 此时:无忌玛(光标先移动3个字节,再读取3个字符)
7,文件修改:将文件中的内容读取到内存上,然后把源文件删除,再把内存里读取到的内容存储到一个新的文件中,在将新的文件命名为原文件的名字(掩耳盗铃)文件名字一样但是文件内容是不一样的,完成文件的修改.
- 格式:import os..............调用函数
import os with open("a.txt", mode="r+", encoding="utf-8") as f1, \ open("a.txt副本", mode="r+", encoding="utf-8") as f2: # 通过r+的模式打开文件"a.txt"用f1作为句柄 # # 通过r+的模式打开文件"a.txt副本"用f1作为句柄(前提是a.text副本这个文件存在) for line in f1: # 把句柄f1的文件每一行作为元素遍历出来 new_line = line.replace("3", "9") # 把每一行的3换成9 f2.write(new_line) # 把改变以后每一行的新元素放在新打开的文件f2中 os.remove("a.txt") # 把文件删除 os.rename("a.txt副本", "a.txt") # 把打开的新文件命名成原文件
小结:
- 1>先打开2个文件
- 2>把要修改的文件遍历出来
- 3>修改遍历出来的文件并赋值给新的变量
- 4>把修改好的元素写到新文件中
- 5>把原文件删除,在命名新文件位原文件名字