Python3.x文件处理详解
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
任何一门语言都有其特有的操作文件的方式,Python2.x版本有两种操作文件的方式,没错就是open函数和file函数。但是在Python3.x版本处理文件就只剩下open函数啦(此处我们忽略with处理方法)。
一.打开文件的方式
1 尹正杰 2 韩森雨 3 贾山鹏
1.以只读的方式打开
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 f1 = open("name.txt","r",encoding="utf-8") #第一个参数是打开文件的名称,第二个参数是打开文件的方式是以只读的方式打开,第三个参数是指定打开的编码格式为“utf-8”。 8 data = f1.read() #一次性将数据都读取到出来并赋值。 9 f1.close() #关闭文件 10 11 print(data) #打印文件内容 12 13 14 15 #以上代码执行结果如下: 16 尹正杰 17 韩森雨 18 贾山鹏
2.以二进制的方式打开文件
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 8 f1 = open("name.txt","rb") 9 data = f1.read() 10 f1.close() 11 12 print(data) 13 14 15 16 #以上代码执行结果如下: 17 b'\xe5\xb0\xb9\xe6\xad\xa3\xe6\x9d\xb0\r\n\xe9\x9f\xa9\xe6\xa3\xae\xe9\x9b\xa8\r\n\xe8\xb4\xbe\xe5\xb1\xb1\xe9\xb9\x8f'
3.以写入的方式打开文件
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 f2 = open("a.txt","w",encoding="utf-8") #以写的方式打开文件,如果已经存在该文件就清空打开,如果不存在创建文件 8 f2.write("尹正杰") #往文件写入字符串 9 f2.close()
以上我们介绍了三种打开文件的方式,还有一种是以“a”的方式打开,即追加的方式打开文件,它也是属于写的一种类型,有以上三种基本上也就够用了,当然还有类似的“r+”(读写方式打开),“w+”(以写的方式打开并且还可以读),"a+"(以追加的方式打开且还可以读)。总而言之不建议这样用,权限不要放的太大,我们最好控制在只读,只写或者只追加的方式打开文件。对了,以上三种方式打开文件之后最好都要关闭文件,因为只有你关闭文件了数据才会网磁盘中写,否则可能延迟写入时间。如果你总是打开文件的时候忘记关闭也可以用with语句,其用法和open类似,下面我们看一下with 的用法。
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 8 with open("a.txt","r",encoding="utf-8") as f: #用with语句打开一个文件,当其子代码块执行完毕时,文件会自动关闭。 9 print(f.readlines(),end="") 10 11 12 print("\n","*" *20,"我是分割线","*" * 20,) 13 with open("a.txt","r",encoding="utf-8") as f1,open("b.txt","r",encoding="utf-8") as f2: #用with语句可以同时打开多个文件 14 print(f1.read()) 15 print(f2.read()) 16 17 18 19 20 #以上代码执行结果如下: 21 ['尹正杰\n', '1111111\n', '333223333\n', '333333'] 22 ******************** 我是分割线 ******************** 23 尹正杰 24 1111111 25 333223333 26 333333 27 尹正杰 28 1111111 29 yinzhengjie 30 333333
二.读取文件的方式
1.移动文件光标(seek)位置
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 f1 = open("name.txt","r",encoding="utf-8") #第一个参数是打开文件的名称,第二个参数是打开文件的方式是以只读的方式打开,第三个参数是指定打开的编码格式为“utf-8”。 8 data1 = f1.read() #一次性将数据全部读取出来并赋值给data1。 9 print(f1.closed) #判断文件是否关闭,现在还没有关闭,其值应该为False 10 print("data1=====",data1) #打印读取到的内容 11 data2 = f1.read() #由于上面我们已经将数据全部都去完毕了,所以此时data2是没法读取到数据的 12 f1.seek(0) #将文件光标移动到文件开始,“0”表示文件的开始位置。 13 data3 = f1.read() #data3是可以读取到数据的,因为上行代码已经将文件光标从末尾移动到开始位置 14 f1.close() #关闭文件 15 print(f1.closed) #此时文件已经关闭,再次判断文件是否关闭,其值应该为True 16 print("data2=====",data2) 17 print("data3=====",data3) 18 19 20 21 22 #以上代码执行结果如下: 23 False 24 data1===== 尹正杰 25 韩森雨 26 贾山鹏 27 True 28 data2===== 29 data3===== 尹正杰 30 韩森雨 31 贾山鹏
2.按行(readline)读取文件内容
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 f1 = open("name.txt","r",encoding="utf-8") 8 print(f1.encoding) #查看打开文件的编码格式。 9 print(f1.name) #查看文件名称 10 print(f1.readable()) #判断文件是否可读 11 print(f1.readline(),end='') #一次性读取一行内容,并去掉换行符,即不打印换行符, 12 print(f1.readlines()) #从当前光标往下读取直到光标末尾,上面的readline已经读取了一行内容,此处的readlines会将没有读取的内容一次性读取完毕。 13 f1.close() 14 15 16 17 18 #以上代码执行结果如下: 19 utf-8 20 name.txt 21 True 22 尹正杰 23 ['韩森雨\n', '贾山鹏']
3.告诉当前光标(tell)所在位置
1 ABCDEFG
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 8 with open("c.txt","rb") as f: 9 print(f.read()) 10 f.seek(3) #默认情况,是以文件起始位置作为开始,往后移动三个字节(bytes) 11 print(f.tell()) #显示当前光标所在位置 12 f.read(1) #表示只读取一个字节 13 print(f.tell()) #显示当前光标所在位置 14 f.seek(-5,2) #后面的数字“2”表示光标从文件末尾所在的位置开始,前面的“-5”表示从当前位置前移动5个字节(bytes) 15 print(f.tell()) 16 f.seek(2,1) #后面的数字“1”表示以当前光标所在的位置,前面的“2”表示从当前位置往后移动2个字节。 17 print(f.tell()) 18 print(f.read()) 19 20 21 22 23 #以上代码执行结果如下: 24 b'ABCDEFG' 25 3 26 4 27 2 28 4 29 b'EFG'
三.写入文件的方式
1.创建文件并写入数据
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 f2 = open("a.txt","w",encoding="utf-8") #以写的方式打开文件,如果已经存在该文件就清空打开,如果不存在创建文件 8 f2.write("尹正杰") #往文件写入字符串 9 f2.writelines(['\n1111111','\n22222','\n333333']) #往文件中写入一个列表 10 f2.close()
四.文件操作小试牛刀
1.修改文件内容
1 尹正杰 2 1111111 3 22222 4 333333
要求将"a.txt"文件的内容包含“22222”的行换成字符串“yinzhengjie”并保存。
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 import os #导入os模块。 8 9 f1 = open("a.txt","r",encoding="utf-8") #以只读的方式打开一个文件 10 f2 = open(".a.txt.swap","w",encoding="utf-8") #以写入的方式打开一个文件 11 for line in f1.readlines(): 12 if line.startswith("22222"): #如果匹配到以5个“2”开头的行就就执行以下的修改操作,即对其新赋值。 13 line = "yinzhengjie\n" 14 f2.write(line) 15 f1.close() 16 f2.close() 17 18 os.remove("a.txt") #删除源文件 19 os.rename(".a.txt.swap",'a.txt') #将修改的文件内容进行改名操作。
2.实时监控一个文件内容
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 import time 8 9 MonitoringFile = "access.log" #定义我们需要监控的文件名称。 10 11 with open(MonitoringFile,'r',encoding="utf-8") as f: 12 f.seek(0,2) #表示将光标对应文件的末尾。 13 while True: 14 line = f.readline().strip() #读取每行的内容,并把换行符脱掉。 15 if line : 16 print("新增了一条记录:",line) #打印从文件末尾新增的每一行内容 17 time.sleep(0.5) #每次打印一行信息都需要睡0.5秒钟。