python自动化之文件处理_Python自动化学习笔记(6)文件操作与集合

一、文件操作

Python可以对文件进行读和写,j追加模式的操作 。

基本的六种操作模式:

r:对文件进行只读模式操作

w:对文件进行覆盖写操作,该操作会覆盖文件中已有的内容

a:对文件进行追加写操作,在文件末尾进行追加写操作

r+:读的扩张模式,可对文件同时进行读和写操作,当写文件时,文件指针处于文件末尾,再读文件时,文件指针从末尾处开始读文件,文件部分或全部内容会被覆盖,且读取文件不完整。

a+:可对文件进行追加和读操作,文件内容不会被覆盖,再读取文件时需要重置文件指针,使用f.seek(0)将文件指针调整至文件开头位置

处理文件流程:1、打开文件,使用open()方法打开一个文件,如果文件不存在,则会自动新建一个同名的文件

2、读/写文件,读文件则使用文件的read()/readline()/readlines()方法,写文件则为write()方法

3、关闭文件

打开文件操作方式:

1)使用open方法打开,但是文件操作后必须使用close()关闭文件

f = open(r'数据.txt','r',encoding='utf-8')

result = f.read() #读文件,获取文件里面的全部内容

print(result)

f.close()

2)使用with open方式打开,使用with打开文件,系统默认在with结束后,自动关闭文件,无需使用close方法

with open(r'数据.txt','r',encoding='utf-8') as f:#将打开文件的操作赋给句柄f,后续操作直接操作f即可

result = f.read() #读文件,获取文件里面的全部内容

print(result)

二、读文件

读文件,使用'r'模式来读取文件,open方法需要指明文件模式和字符集"utf-8"

定义文件:数据.txt

'''

数据.txt

1. 行者无疆 246

2. 王三侠 210

3. 大亮 128

4. 毛多锁 418

5. 追~落日 3.21

6. 小文 416

7. 瑞峰 22.13

8. 尤文奎Alex 138

9. 阿梁 167

10. 山峰 0

'''

使用read()方法获取文件所有内容,可用于处理比较小的文件,如果文件很开,读取整个文件会很占用内存

f = open(r'数据.txt','r',encoding='utf-8')

result = f.read() #读文件,获取文件里面的全部内容

print(result)

f.close()

使用readline()方法获取文件一行内容,没使用一次该方法就会依次读取一行数据

f = open(r'数据.txt','r',encoding='utf-8')

result2 = f.readline() #读文件,一次只读取一行

result3 = f.readline()#读取第二行数据

print('result2',result2)

print('result3',result3)

f.close()

'''

输出:

result2 1. 行者无疆 246

result3 2. 王三侠 210

'''

使用readlines()方法读取文件中所有的内容,并返回在一个list列表中

f = open(r'数据.txt','r',encoding='utf-8')

result3 = f.readlines()#读取文件里面所有的内容,返回的是一个list

print('result3',result3)

f.close()

'''

输出:

result3 ['1. 行者无疆 246\n', '2. 王三侠 210\n', '3. 大亮 128\n', '4. 毛多锁 418\n', '5. 追~落日 3.21\n', '6. 小文 416\n', '7. 瑞峰 22.13\n', '8. 尤文奎Alex 138\n', '9. 阿梁 167\n', '10. 山峰 0\n', '11. David 350\n', '12. 胖胖球🐌 68.16\n', '13. 幸福哥 100\n', '14. 梁明 350\n', '15. 郝明明 64\n', '16. 赵宗来 136.32\n', '17. 平民之女 9.66\n', '18. 王俊兵 65\n', '19. 祁棒棒 79.24\n', '20. 陈陈 20\n', '21. 兔兔 49\n', '22. 小了白了兔 55\n', '23. 高娃 100.7\n', '24. 漠然 139\n', '25. 心语 216\n', '26. 王成 183\n', '27. 陈卫亮 141.75']

'''

注意:在处理大文件时,上面方法已不再适用,可使用循环的方式逐行读取文件

f = open(r'数据.txt','r',encoding='utf-8')

for line in f:#使用for循环来迭代整个文件,一行一行的迭代

print(line)

三、写文件

写文件,使用‘w’文件模式,使用write()方法写入文件。注意:'w'文件模式会覆盖原来的文件内容并重新写入新的内容

write()参数必须是字符串类型,不然会出现报错

f = open(r'a1.txt','w',encoding='utf-8') #打开的模式 r w a

f.write(123)

#写入非字符串时,会报错TypeError: write() argument must be str, not int

f.write('xxxxxxx')

f.close()

'''

输出文件a1.txt

xxxxxx

'''

writelines()方法既可以传入字符串又可以传入一个字符序列,并将该字符序列写入文件

f = open(r'a1.txt','w',encoding='utf-8') #打开的模式 r w a

l=['1234\n','56789\n','abcdef']

f.writelines(l)

f.close()

'''

1234

56789

abcdef

'''

四、追加模式:

使用a模式对文件追加操作

with open('u.txt','r',encoding='utf-8') as f:

print(f.read())

print("tell",f.tell())#查看文件指针

with open('u.txt','a',encoding='utf-8') as f:

f.write('aaaaa')

print("tell",f.tell()) # 查看文件指针

'''

输出:

123

345

tell 8

tell 13

文件:

123

345aaaaa

'''

当使用r模式读取文件时,文件指针处于文件末尾处,使用a模式时,文件指针处于文件末尾,继续在末尾去写入内容,不会覆盖原内容

五、其他模式

r+:先进行写文件,再读文件时,文件依旧会覆盖,且读取文件时,文件指针处于上次修改的位置,导致只能读取部分文件,或者读不到文件

with open('u.txt','r+',encoding='utf-8') as f:

'''

u.txt content:

123

345

'''

f.write('aaaaa')

print("tell",f.tell()) # 查看文件指针

print(f.read())

print("tell",f.tell()) # 查看文件指针

'''

u.txt content:

aaaaa345

'''

w+:文件会被覆盖,且读文件时,是从文件末尾开始读,会出现读取不到文件

with open('u.txt','w+',encoding='utf-8') as f:

'''

u.txt content:

123

345

'''

print(f.read())

print("tell",f.tell()) # 查看文件指针

f.write('aaaaa')

print("tell",f.tell()) # 查看文件指针

'''

u.txt content:

aaaaa

'''

a+:文件写时,不会被覆盖,写完文件后,文件指针处于文件末尾,再读取文件时,需重置文件指针f.seek(0)

with open('u.txt','a+',encoding='utf-8') as f:

'''

u.txt content:

123

345

'''

f.write('aaaaa')

print("tell",f.tell()) # 查看文件指针

f.seek(0)

print(f.read())

print("tell",f.tell()) # 查看文件指针

'''

u.txt content:

123

345aaaaa

'''

六,监控日志的一个文件操作实例

'''access.log

178.**.90.90 - - [04/Jun/2017:03:44:13 +0800]

178.**.90.90 - - [04/Jun/2017:03:44:13 +0800]'''

#1、监控,一直在运行,死循环,每分钟读一次文件

#2、第一次运行,读取文件所有的内容,从文件内容里面获取到ip地址,以及每个ip地址出现的次数

#4、记住当前指针的位置,下次从这个位置开始读

#5、判断每个ip地址出现的次数,如果大于50次,那么发短信报警

#6、等待60秒,继续重复上面的操作,读文件,获取内容

import time

point = 0 #最前面的位置

while True:

ip_list = {} # {ip:2 }

f = open('access.log',encoding='utf-8')#不写文件模式,默认为‘r’读取文件模式

f.seek(point)#移动文件指针到哪个位置

for line in f:

ip = line.split()[0]#取出ip地址,每一行通过空格分割

if ip not in ip_list:#将出现不同次数的ip计算并存入字典

ip_list[ip] = 1

else:

ip_list[ip] = ip_list[ip]+1

point = f.tell() #当前文件指针的位置

f.close()

for ip in ip_list:

count = ip_list.get(ip)

if count>=50:

print('ip地址【%s】有问题,请注意!'%ip)

time.sleep(60)

七、集合

集合是一组只用{}包裹的数据类型,与字典不同,集合没有键值对

集合特点:1、集合天生是无序的      2、集合是无序的

s = {1,2,3,4,5,6,7,7,7,6,6,1,1} #集合

s2 = set() #空集合

l = [1,2,3,4,5,6,7,7,7,6,6,1,1]

l = list(set(l))#可使用集合将列表去重

print(l)

集合的常用内建方法。add()添加元素,update()更新集合,remove()移除指定元素

s = {1,2,3,4,5,6,7,7,7,6,6,1,1} #集合

s.add(8) #添加元素

s.update({4,5,6}) #把另外一个集合加入这个集合里面

print(s)

s.remove(4) #删除指定的元素

print(s)

'''

输出:

{1, 2, 3, 4, 5, 6, 7, 8}

{1, 2, 3, 5, 6, 7, 8}

'''

集合的运算:集合支持关系运算:交集、并集、差集、对称差集

l1 = range(0,11) #学了自动化的学生

l2 = [2,4,5,6] #学性能的学生

l1 = set(l1)

l2 = set(l2)

print(l1 & l2) #取交集,就是两个集合里面相同的元素

print(l1.intersection(l2))

print(l1.union(l2)) #并集,就是把两个集合合并到一起

print(l1 | l2)

print(l1 - l2 )#差集,在a集合里面存在,在b集合里面不存的

print(l1.difference(l2))

print(l1 ^ l2) #对称差集,把a集合和b集合里面相同的元素去掉,剩下的

print(l1.symmetric_difference(l2))

print(l1.issuperset(l2)) #判断a集合是不是b集合的父集

print(l2.issubset(l1)) #判断a集合是不是b集合的子集

八、修改文件操作

修改文件方法分为两种:

第一种:读取文件所有内容,修改replace内容,清空文件再写入文件,适用于小文件操作,大文件会占用大量内存

#1、简单粗暴直接的

#1、读取文件所有内容

#2、replace

#3、清空文件

#4、把新的内容写进去

#修改小文件的话可以用这种方式

with open('数据.txt','r+',encoding='utf-8') as f:

content = f.read()

new_content = content.replace('100','1000000000000')

f.seek(0)#重置文件指针

f.truncate()#清空文件

f.write(new_content)

f.flush()#立即刷新缓冲区的内容,写到磁盘上

第二种:分为两个文件操作,可适用于大文件操作

#2、两个文件操作

#1、r模式打开a文件,w模式打开b文件

#2、逐行读取a文件的内容,读完之后替换内容

#3、把替换完的内容写到b文件里面

#4、把a文件删掉,把b文件的名字改成a文件

import os

with open('数据.txt',encoding='utf-8') as f1, open('数据2.txt','w',encoding='utf-8') as f2:

for line in f1:

new_line = line.replace('4','444444')

f2.write(new_line)

os.remove('数据.txt')

os.rename('数据2.txt','数据.txt')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值