Python3.x文件处理详解
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
任何一门语言都有其特有的操作文件的方式,Python2.x版本有两种操作文件的方式,没错就是open函数和file函数。但是在Python3.x版本处理文件就只剩下open函数啦(此处我们忽略with处理方法)。
一.打开文件的方式
1 尹正杰
2 韩森雨
3 贾山鹏
name.txt内容戳这里
1.以只读的方式打开
1 #!/usr/bin/env python
2 #_*_coding:utf-8_*_
3 #@author :yinzhengjie
4 #blog:
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:
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:
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:
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:
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:
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
c.txt文件内容戳这里
1 #!/usr/bin/env python
2 #_*_coding:utf-8_*_
3 #@author :yinzhengjie
4 #blog:
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:
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文件内容戳这里
要求将"a.txt"文件的内容包含“22222”的行换成字符串“yinzhengjie”并保存。
1 #!/usr/bin/env python
2 #_*_coding:utf-8_*_
3 #@author :yinzhengjie
4 #blog:
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:
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秒钟。