码迷,mamicode.com
首页 > 其他好文 > 详细

文件操作和集合

时间:2018-04-12 18:40:52      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:日志文件   只读   二进制文件   []   else   小练习   它的   重复   10个   

判断方法

# 非空即真、非0即

#不为空的话就是true,是空的话就是false

#只要不是0 就是 true,是0就是false

#布尔类型 True False

 

# print(bool(‘‘))
# print(bool(‘g‘))
name=input(name:).strip()
if name:#输入不为空则真
    print(输入不是为空)
else:
    print(输入不能为空)
#这些空数据都能识别
a=[]
b={}
c=0
f=tuple()
e=‘‘
a=b=c=0#定义了3个变量,值都是0 可以用这么方法定义多个变量

交互变量:

#a,b交换值
a=1
b=2
c=None
c=b
b=a
a=c

b,a=a,b#交换a,b两个变量值 Python已经在底层引用第三方变量
b,a,c=a,c,b#对应交换
#不引用第三方变量,交换a,b值
a=a+b
b=a-b
a=a-b

深拷贝浅拷贝

l=[1,1,2,3,4,5,6,8]#循环删list里面的数据时,结果会不正确
for i in l:#循环l2
    if i%2!=0:
        l.remove(i)
print(l)
#结果为:[1, 2, 4, 6, 8]
l2=[1,1,2,3,4,5,6,8]
print(id(l))
print(id(l2))
for i in l2:#循环l2,却删除l,这样就不会删除了l下标
    if i%2!=0:
        l.remove(i)
print(l)
#结果为:[ 2, 4, 6, 8]
import  copy
#浅拷贝,内存地址一样
#深拷贝,重新开辟内存空间
l2=copy.deepcopy(l)#深拷贝
l2=l#浅拷贝
#示例,浅拷贝
# lis=[1,1,2,3,4,5,6,8]
# lis2=lis
# print(id(lis))
# print(id(lis2))
# lis2.append(‘zhangliuliang‘)
# print(lis)#lis会增加zhangliuliang
#深拷贝
lis=[1,1,2,3,4,5,6,8]
lis2=copy.deepcopy(lis)
lis2.append(test)
print(id(lis))
print(id(lis2))
print(lis)#lis不会增加zhangliuliang

集合

集合也是一种数据类型,一个类似列表东西,它的特点是无序的,不重复的,也就是说集合中是没有重复的数据

集合的作用:

1、它可以把一个列表中重复的数据去掉,而不需要你再写判断

2、可以做关系测试,比如说有两个班,一个性能测试班,一个是接口测试班的,想找出来既学习了性能又学习了接口测试的同学,就可以用集合

#集合天生去重
s=set()#空集合
s2=set(1231123fddf)
print(s2)
s3={1,1,3,4,5,6,7}
d={k:v}
#交集  并集 差集
#取交集
print(s2 & s3)#结果为空,因为s3元素为整型,s2为字符串
s3={1,2,3,4,5,6,7}
print(s2 & s3)
print(s3.intersection(s2))
#并集,就是把两个集合合并在一起,然后去重
print(s2|s3)
print(s2.union(s3))
#差集 就是去除某个集合相同的元素
s4={1,2,3}
s5={1,4,6}
print(s4-s5)
print(s4.difference(s5))

#对称差集,去掉两集合都存在的元素
print(s4 ^ s5)
print(s4.symmetric_difference(s5))
#print(s4.symmetric_difference_update(s5))

s4.add(ss)
s4.pop()#随机删除一个元素
s4.remove(ss)#指定删除哪个
s4.update({1,2,3})#把另外一个集合加进来
s4.discard(1)#如果删除的元素存在则删除,如果不存在不做处理
s4.isdisjoint(s5)#如果有集合则False,没有交集则Flase

#判读是否子集、父集
print(s4.issubset(s5))  # 判断s4是不是s5的子集
print(s4.issuperset(s5))  # 判断s4是不是s5的父集

文件:

对文件的操作分三步:

1、打开文件获取文件的句柄,句柄就理解为这个文件

2、通过文件句柄操作文件

3、关闭文件。

文件的几种模式:

# 读模式    r    读写模式 r+
#1、不能写
#2、文件不存在的话会报错
# 写模式  w,  写读模式   w+
    #1、文件不存在的话,会帮你新建文件
    #2、打开一个已经存的文件,他会清空以前文件的内容
    #3、不能读

# 追加模式  a,   追加读模式 a+  #文件末尾去增加内容
    # 1、文件不存在的话,会帮你新建文件
    # 2、打开一个已经存的文件,不会清空,末尾增加
    # 3、不能读

1、打开文件的模式有:
 r,只读模式(默认)。
 w,只写模式。【不可读;不存在则创建;存在则删除内容;】
 a,追加模式。【不可读; 不存在则创建;存在则只追加内容;】

2、"+"表示可以同时读写某个文件
r+,【可读、可写;可追加,如果打开的文件不存在的话,会报错】
w+,【写读模式,使用w+的话,已经存在的文件内容会被清空,可以读到已经写的文件内容】
a+,【追加读写模式,不存在则创建;存在则只追加内容;】

3、"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
rU
r+U

4、"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注
rb
wb
ab

 

文件基本操作:

f = open(pwd.txt,r,encoding=utf-8) #以只读方式打开一个文件,获取文件句柄,如果是读的话,r可以不写,默认就是只读,文件不存在会报错
#在python2中还有file方法可以打开文件,python3中file方法已经没有了,只有open
frist_line = f.readline()#获取文件的第一行内容
print(frist_line)#打印第一行
res = f.read()#因为前面已经读取第一行,文件指针已经指向第二行,所以获取除了第一行剩下的所有文件内容
print(res)
f.close()#关闭文件

# 结果:
# 10123,123!qweQ
# 
# 123,123!qwQW
# 321,123@qwQw
#
f = open(names,a+,encoding=utf-8) #打开文件,采用utf-8编码打开
f.seek(0)
print(f.read()) #读文件
# print(f.readline()) #读取一行内容
# print(f.readlines())  #是把文件的每一行放到一个list里面
f.write(\n)#换行写入
f.write(天气真好)#写入
f.seek(0)#写入数据之后文件指针在最后一行,应该重新移动到第一行才能完全读取内容
print(f.read())

文件操作方法:

(1)

f = open(pwd.txt,a+,encoding=utf-8)#encoding参数可以指定文件的编码
f.seek(0)#把当前文件指针指向哪
print(f.readline())#读一行
f.readable()#判断文件是否可读
print(f.readable())
f.writable()#判断文件是否可写
print(f.writable())
f.encoding#打印文件的编码
print(f.encoding)
f.read()#读取所有内容,大文件时不要用,因为会把文件内容都读到内存中,内存不够的话,会把内存撑爆
f.readlines()#读取所有文件内容,返回一个list,元素是每行的数据,大文件时不要用,因为会把文件内容都读到内存中,内存不够的话,会把内存撑爆
f.tell()#获取当前文件的指针指向
print(f.tell())
f.write(‘你好)#写入内容
#f.fulsh()#写入文件后,立即从内存中把数据写到磁盘中
f.seek(0)
f.truncate()#清空文件内容
f.truncate(10)#截取10个字符
f.seek(0)
print(f.read())
f.writelines([姓名,‘hwt])#将一个列表写入文件中
f.seek(0)
print(f.read())
f.close()#关闭文件

(2)大文件时,读取文件高效的操作方法:

用上面的read()和readlines()方法操作文件的话,会先把文件所有内容读到内存中,这样的话,内存数据一多,非常卡,高效的操作,就是读一行操作一行,读过的内容就从内存中释放了

#需求
# 1、监控日志,如果有攻击咱们的,就把ip加入黑名单

#分析:
    #1、打开日志文件
    #2、把ip地址拿出来
    #3、判断每一个ip出现的次数,如果大于100次的话,加入黑名单
    #4、每分钟读一次

#直接循环一个文件对象的话,每次循环的是文件的每一行
#文件句柄   文件对象
import time

point = 0  # 每次记录文件指针的位置
while True:
    all_ips = [] #存放所有的ip地址
    f = open(access.log,encoding=utf-8)
    f.seek(point)#移动文件指针
    for line in f:
        ip = line.split()[0]
        all_ips.append(ip)
    point = f.tell() #记录了指针的位置
    all_ip_set = set(all_ips)  #
    for ip in all_ip_set:
        if all_ips.count(ip)>50:
            print(应该加入黑名单的ip是%s%ip)
    f.close()
    time.sleep(60) #暂停60秒

 

文件操作和集合

标签:日志文件   只读   二进制文件   []   else   小练习   它的   重复   10个   

原文地址:https://www.cnblogs.com/hwtfamily/p/8682469.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!