zoukankan      html  css  js  c++  java
  • 文件操作和集合

    判断方法

    # 非空即真、非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 或 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('
    ')#换行写入
    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秒
  • 相关阅读:
    Date
    Math
    封装实参的对象 arguments
    函数方法call()和apply()
    执行上下文栈
    原型(prototype属性)和原型链。 重要!!!
    android studio for Mac快捷键大全
    软件的横竖屏切换
    Android XML文件中@id和@+id的区别
    java中的Iterator<E>
  • 原文地址:https://www.cnblogs.com/hwtfamily/p/8682469.html
Copyright © 2011-2022 走看看