文件的基本操作

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>把原文件删除,在命名新文件位原文件名字 
posted @ 2018-07-15 17:09  帅爆太阳的男人  阅读(144)  评论(0)    收藏  举报