Python_008

一.文件操作

1.只读操作 

1 f = open("taibai.txt",mode = "r",encoding = "utf-8"
2 s = f.read()
3 f.flush()
4 f.close()
5 print(s)
6 #输出结果:你在taibai.txt文件里的内容

这里有几个注意点:

a:第一关于路径的问题:taibai.txt;一般在pycharm外创建的文件都带后缀名,所以关于路径要跟你文件命名一致;

b:mode是表示想要执行什么操作, encoding:编码格式,一般在文件外创建的文件可能不是utf-8编码的,所以这里要注意;

c:f.flush()代表刷新, f.close()是关闭句柄f, 这两句话一般要带上;

关于编码格式这一块:

encoding表示的是编码集,根据文件的实际保存编码进行获取数据,平常用到的最多的时候utf-8;

所以引出一种写类型:rb:读取出来的数据是bytes类型,在rb模式下,不能选择encoding字符集,

代码展示:

 1 f = open("../ha/hh.txt",mode="rb")
 2 s = f.read()
 3 f.flush()
 4 f.close()
 5 print(s)
 6 s1 = s.decode("GBK")
 7 print(s1)
 8 s1 = s1.encode("utf-8")
  print(s1)
 9 #输出结果: 
10 b'\xc1\xf5\xb2\xa9\xce\xc4'
11 刘博文
12 b'\xe5\x88\x98\xe5\x8d\x9a\xe6\x96\x87'

注意这里不能直接f = open("../ha/hh.txt",mode="r",encoding = "utf-8")这是会报错的,因为通过上面可以看出,我这个文件是

用"GBK"编码的,所以用rb读取字节,得到GBK编码的字节,然后用s.decode("GBK")解码成万国码,也就是字符串;

最后用utf-8编码了一遍;得到s1;

rb的作用:在读取非文本文件的时候,比如在读取MP3,图像,视频等信息的时候就需要用到rb,因为这种数据是没办法显

出来的,在后面我们文件上传下载的时候还会用到,直播也是这种数据;

2.绝对路径和相对路径的问题

a:绝对路径:从磁盘根目录开始一直到文件名

b:相对路径:同一个文件夹下的文件,相对于当前这个程序所在的文件夹而言,如果在同一个文件夹中,则相对路径就是

这个文件名,如果在上一层,则要../

3.文件写操作

a:写模式下,如果没有文件夹,则会自动创建文件,如果文件存在,则将原来的内容全部清空,再写入新内容;

1 f = open("小护士",mode='w',encoding="utf-8")
2 f.write("答案似乎是")
3 f.flush()
4 f.close()
5 #输出结果:
6 创建了一个新文件,
7 名字为小护士,
8 内容为:答案似乎是

注意:在读的状态下不能写,在写的状态下不能读;否则报错;

b:wb模式下,可以不指定打开文件的编码,但是在写文件的时候必须将字符串转化成utf-8的bytes数据;

1 f = open("../ha/hh.txt",mode="wb")
2 # f.write("答案似乎是".encode("utf-8"))
3 f.flush()
4 f.close()
5 #输出结果:
6 在外部的文件中,我的文件内容已经改为
7 答案似乎是 , 而且编码格式为utf-8

注意:只要是有W的,都是原文件清空,替换成新数据;

3.a追加模式

a:我们写入的内容会追加到文件的结尾,不会清空原来的文件数据;

1 f = open("../ha/hh.txt",mode="a",encoding="utf-8")
2 f.write("刘博文是狗")
3 f.flush()
4 f.close()
5 #输出结果:
6 在文件中追加了一句话,没有清空该文件;

4.r+只读模式下进行了扩展

a:先读后写

 1 f = open("小护士",mode="r+",encoding="utf-8")
 2 s = f.read()
 3 f.write("周杰")
 4 f.flush()
 5 f.close()
 6 print(s)
 7 
 8 #输出结果:
 9 答案似乎是
10 小白
11 疾风剑豪
12 诺克萨斯
13 #因为这里是先读后写,所以后来写入的没有显示出来
14 但是在小护士的文件中已经添加了

b:先写后读

a:在r+模式下,默认情况下光标在文件的开头,所以如果先写后读:

 1 f = open("小护士",mode="r+",encoding="utf-8")
 2 f.write("周润发")
 3 s = f.read()
 4 f.flush()
 5 f.close()
 6 print(s)
 7 #输出结果:
 8 乎是
 9 小白
10 疾风剑豪
11 诺克萨斯周杰
12 #注意这里  答案似乎是 前三个字被周润发覆盖掉了
13 所以读的时候从光标往后读,就是当前输出结果;

r+模式下,默认情况下光标在文件的开头,所以会直接覆盖前面的三个文字

所以保险起见,要先读后写;

5.w+写读

先将所有内容清空,然后写入,最后读取,但是光标在最后一位了,读取的内容是空的,不常用;

1 f = open("小护士",mode="w+",encoding="utf-8")
2 f.write("周润发")
3 s = f.read()
4 f.flush()
5 f.close()
6 print(s)
7 #输出结果:
8

如果想要读取内容,先把光标调到开头:

1 f = open("小护士",mode="w+",encoding="utf-8")
2 f.write("周润发")
3 f.seek(0)
4 s = f.read()
5 f.flush()
6 f.close()
7 print(s)
8 #输出结果:
9 周润发

二.文件的一些常用操作

1.seek(n)光标移动到n位置,注意,移动的单位是byte.所以如果是utf-8的中文部分要是3的倍数;

通常我们是使用seek都是移动到开头或者结尾.ctrl + f查找你的东西

移动到开头:seek(0)

移动到结尾:seek(0,2)seek的第二个参数表示的是从哪个位置进行偏移,默认是0,表示开头,2代表结尾.

seek讲解:seek(3)的意思,就是先找到3的位置,然后光标移动到那,3个字节代表一个汉字,所以移动到第一个汉字那;

seek的妙用:

 1 f = open("小护士",mode="r+",encoding="utf-8")
 2 f.seek(6)
 3 s = f.read(3)
 4 print(s)
 5 f.seek(0)
 6 ss = f.read(3)
 7 print(ss)
 8 f.flush()
 9 f.close()
10 #输出结果:
11 发小金
12 周润发

**注意:在r+模式下有一个深坑,如果读取了内容,就是不管你前面读了几个,光标显示是多少,后面去写都是在末尾;

如果你不读,直接写,那就会覆盖前面的内容;只有在r+模式下,他不会跟着光标走;

2.文件的内容修改

 1 import os
 2 with open("小护士",mode="r",encoding="utf-8") as f1, \
 3         open("",mode = "w",encoding="utf-8")as f2:
 4     s = f1.read()
 5     ss = s.replace("","")
 6     f2.write(ss)
 7 os.remove("小护士")
 8 os.rename("","小护士")
 9 #输出结果:
10 文件中的姓周的:
11 李润发
12 李西
13 李杰伦
14 李星星
15 李恩来
16 李树人
17 全部变成姓李

在这里我们要知道文件不能直接修改,必须删掉原来的,在重命名新的文件名称;

a:readline()表示读取一行;

所以要想循环读取

 1 with open("小护士",mode="r",encoding="utf-8")as f:
 2     count = 0
 3     for line in f:
 4         print(line)
 5         count += 1
 6 #输出结果:
 7 李润发
 8 
 9 李西
10 
11 李杰伦
12 
13 李星星
14 
15 李恩来
16 
17 李树人

用for遍历可以;

猜你喜欢

转载自www.cnblogs.com/0627zhou/p/9295208.html
008