Python_008
Posted pythonZhou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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‘xc1xf5xb2xa9xcexc4‘
11 刘博文
12 b‘xe5x88x98xe5x8dx9axe6x96x87‘
注意这里不能直接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遍历可以;
以上是关于Python_008的主要内容,如果未能解决你的问题,请参考以下文章