• python的数组、元组、字典、字符串和文件操作


    数组使用[]也就是中括号定义   stus = ['xiaohei','xiaobai','xiaohuang','cxdser']

    数组的排序是从0开始,也就是取第一个的值是stus[0],排序的编号也称为下标、角标和 索引

    最后一个元素的下标为-1,同理倒数第二个元素的下标为-2…

    也就是说从前往后数时是从0开始变大,从后往前数是从-1开始变小

    stus.append('kk')也就是说.append()方法一次只能加一个值且加到数组的最后一个值

    stus.insert(0,'kk').insert()方法会在指定位置添加元素,如0是在最开始

    如果指定的下标不存在,如总共有2个元素,结果填9,则会加到最末尾,但如果填写-9,则会在最开始添加

    stus[0]='kk'则把第0个值改为kk,想改第几个值输入第几个值的下标

    stus.count(元素)方法的意思是查看某个元素在这个数组里面的个数,如果不存在查找的元素则返回0

    stus.index(元素)方法的意思是找到括号内元素的下标,若有多个则返回第一个,若没有此元素则会报错

    stus.pop(数字)默认删除最后一个元素,若指定下标的话则删除指定的元素,若添加的下标不存在则会报错

    删除后会有返回值,print(stus.pop())后会有刚刚删除的值

    stus.remove(元素)删除此元素,若有多个则只能删除第一个,此方法不会有返回值

    del stus[0]直接删除stus[]中的第0个元素

    stus.clear()会清空整个list

    stus.reverse()会把数组的顺序 进行反转

    stus.sort()进行排序,默认是根据字母进行排序,,默认排序为升序

    若数组内的元素属性不同,如int和str的混合,或里面是多维数组,则都无法取值

    若输入stus.sort(reverse=True)则是按降序进行排列

    多维数组

    也就是数组嵌套数组,如all_nums = [123,456,[111,222]],则若要找到111,则找到的方法是print(stus[2][0])

    a=[1,2,3]

    b=[4,5,6]

    a.extend(b)

    extend的意思是把两个数组合并到一起生成新的a,同时不改变b的数据

    for i in a:

        print(i)

    如果直接for循环一个list的时候,那每次循环的值都是 这个list里的元素

    切片顾头不顾尾,a[0:2],取得值为0和1,没有2;

    a[:2]若切片的第一个数字不写,则是从头开始取

    a[1:]若切片第二个数字不写,则是从第1个元素取到末尾

    若切片时两个数都不写,则相当于复制了这个数组,全取过来

    切片时后面也可加上步长,a[:2:2],意思是每几个取一个,若步长为正数则从左往右取,若步长为负数则从右往左取的,需要注意,若取负数的步长则要注意取的下标,是从数组末尾的-1开始,若此时从0开始取,则取不到值了,因为0已经是数组头,无法再往前取

    切片同样适用于字符串,字符串也有下标

    title='今天好开心'

    print (title[:4])

    enumerate 需要两个值代表index和元素  格式为

    For I,t in enumerate(title):

        print('%s,%s'%(title))

    或者print(I,t)

    if判断时遵循非空即真,非0即真

    字典,以:分开,前面是key,后面是value,优点是取值方便,且速度快,格式为print(d['name'])若写了不存在的key会报错    或print(d.get('name'))若写了不存在的key会返回none,若想编辑返回的数据则可写成print(d.get('name','找不到')),这是name找不到的情况会返回找不到,若能找到的话则会返回相应的value

    字典是无序的

    增加

    d['shengao']=198         若key存在则进行修改,若不存在则新增

    d.setdefault('weight',130)       只能新增,无法进行修改

    删除

    d.pop('shengao')其中必须包含要被删除的key值

    d.popitem()不用传值,会随机删除一个值

    del d['shengao']

    d.clear() 清空字典

    print(d.keys()) 获取字典里所有的key

    print(d.values()) 获取字典里所有的value

    若要判断addr是否在字典里,则直接if 'addr' in d:

    若要判断是否在key里,则if 'addr' in d.keys():

    若要判断是否在value里,则if 'addr' in d.values():

    for k in d:        这种方法只能print字典里的keys

    for k,v in d.items():         这种方法可以把key和value都打印出来,d.items()是把字典的k和v转成一个像二维数组的输出

    For k in d:

        print(k,d[k])   或    print(k,d.get(k))

    d=[{

      'name':'jiayi',

      'kk':'kk'

      },

      {

      'name':'jiayi1',

      'kk':'kk1',

      'jinku':{

      'a':'aa',

      'b':'bb'

        }

      },

      {

      'name':'jiayi2',

      'kk':'kk2'

      }

    ]

    print(d[1]['jinku']['a'])

    stus['tlx']['money']

    Stus['mpp']['bag'].keys()

    stus={

      'ybq':{

        'age':18,

        'sex':'',

        'addr':'昌平区',

        'money':10000000,

        'jinku':{

          '建行卡':80000,

          '工商卡':800000,

          '招商卡':8000000

          }

        },

      'tlx':{

        'age':19,

        'sex':'',

        'addr':'昌平区',

        'money':10000000,

        'huazhuangpin':['chanle','haha']

        },

      'mpp':{

        'age':19,

        'sex':'',

        'addr':'昌平区',

        'money':10000000,

        "bag":{

          'lv':'一车',

          '鳄鱼':10

          }

        },

    }

    print('金额为%d'%(sum(stus['ybq']['jinku'].values())))

    找到chenle的过滤条件如下

    stus['tlx']['huazhuangpin'][0]

    在字典里找东西主要看层级和具体的值,要是查key就.keys(),值就.values(),若后面是数组 ,则要根据数组的规则[0]

    元组也是list,只不过是不可变的

    Print(kk.count('my'))找个数

    Print(kk.index('my'))返回下标

    字符串的值也不能被修改,只能重新赋值

    li = [1,1,2,3,4,5,6,7,8,9]

    for i in li:

        if i%2!=0:

            li.remove(i)

    print(li)

    结果为[1, 2, 4, 6, 8]

    循环的时候不能删东西,一删下标就变了

    解决方法为加一条li2 = li[:]

    复制后下标就不会变

    li = [1,1,2,3,4,5,6,7,8,9]

    li2=li[:]

    for i in li2:

        if i%2!=0:

            li.remove(i)

    print(li)

    必须使用复制的方法,而不是li2 = li

    是因为若直接让li2 = li,则是把li的内存地址给li2,他俩指向的是一个,则在后面循环的时候还是会改变这个数组的值

    li2 = li  浅拷贝

    li2 = li[:]  深拷贝

    字符串方法

    字符串方法都不会改变原来字符串的值

    .strip()是默认值,会去掉首尾的空格和换行符

    若使用.strip('kk')则会去掉kk

    如username = input('kk').strip   是将已经去掉空格的str赋给username

    .lstrip()是去掉左边的空格和换行符

    .rstrip()是去掉右边的空格和换行符

    .count('t') 查找某个字符在字符串里面出现的次数

    .capitalize()  将首字母大写

    .center(50,'-')将字符串放中间,两边用-补齐为50

    Index = name.find('t')找到这个字符串,返回它的下标,若有多个值返回第一个的下标,若不存在,返回-1

    Index = name.index('d')找到这个字符串,返回它的下标,若不存在就报错

    Print(name.upper())把所有字母都变成大写

    Print(name.lower())把所有字母都变成小写

    File_name = 'a.xls'

    Print(file_name.endswith('.xls'))   判断一个字符串是不是以xxx结尾

    Print(file_name.startswith('a'))    判断一个字符串是不是以xxx开头

    .format()字符串格式化

    f.format_map() 传进的是一个字典

    .replace('select','update'),第一个old,第二个new

    .isdigit()是否是数字

    .isalnum()是否包含数字或字母

    .isalpha()是否是英文字母

    字符串分割   默认不填值的话是按照空格分割

    St.split(',')

    St = 'a,b,c'   变成list = ['a','b','c']

    St_list = st.split(',')

    把list = ['a','b','c']   恢复成 str = 'a,b,c'

    Res = ','.join(list)

    字符串和字典等都可循环,数组内是int、布尔不可循环的不可转换

    只要能循环就都可以用.join方法连接

    文件读写

    http://www.nnzhp.cn/archives/160

    F = open('笔记',encoding = 'utf-8')

    Print(f.read())   (是一个字符串)

    f.write('kk')

    f.close

    注意,若在windows下新建文件默认的gbk模式,需转换成python默认的utf-8

    文件打开有3种方式,读r、写w、追加a,若打开文件是时候没有指定模式,则默认为读,注意:w模式会清空文件原有内容

    F = open('笔记','w',encoding = 'utf-8')

    Print(f.read())

    f.write('kk')

    f.close

    若想同时具有读和写权限则需写的模式是r+,为读写模式,但只要模式里有r,若文件不存在,执行时都会报错

    w+是写读模式,但只要模式里有w,就会把原文件内容清空

    a是追加模式,但只能创建和在文件末尾追加,不能读,需变成a+添加读权限

    a+的文件指针默认在文件末尾,则无法读出东西

    需要使用f.seek(0)将文件指针放到最前头,无法使用seek(-1)移到文件末尾

    seek移动指针的时候只对读好使,对写不好使

    .readline是只读一行,是一个字符串

    .readlines是读取文件的所有内容,把文件里面每一行的内容放到一个list里,包括换行符等

    .write只能写入字符串,但.writelines可写入数组、字符串、元组等可迭代能循环的对象,但.write的效率高

    .truncate()清空文件内容

    .tell()查看当前文件指针的位置

    高效处理文件的方法:

    fw = open('kk.txt',encoding=utf-8)

    Count = 1

    For f in fw:

        print('第%s行'%count,f)

        count+=1

    直接循环文件对象的话,就是循环文件里面的每一行

    fw = open('kk.txt',encoding=utf-8)

    Count = 1

    For f in fw:

        f = f.strip()

        stu_list = f.split(',')

        count+=1

    若发现往文件里写的数据没写进去,可能是因为写进文件的时候先放到缓冲区里,可能现在缓冲区满了,导致写不进去,可调用

    f.flush()立即把缓冲区里的文件写到磁盘里

    With open('a.txt','w') as kk:

    使用with方法可自动管理文件

    使用eval把字符串变成字典

    f = open('a.txt','w',encoding='utf-8')
    names = ['a','b','c']
    s='dingfei,123456'
    f.write(s)
    f.writelines(s)
    for name in names:
    f.write(name)
    for name in names:
    f.writelines(names)
    import time
    f = open('hahah','w')
    f.write('sdfsfsd')
    f.flush() #立即把缓冲区里面的内容写到磁盘里面

    import requests
    url = 'http://www.nnzhp.cn/wp-content/uploads/2018/01/601a335c499837a995ae10867fc36101.png'
    img = requests.get(url).content

    若需进行二进制操作则需在动后加b
    rb
    wb
    ab

    f = open('hhh.jpg','wb')# bytes ,以二进制模式打开
    f.write(img)

    修改文件时共有两种方式

    1、将原文件导出,使用一个变量保存,在这个变量中修改,然后清空原文件,将变量重新写到原文件中

    with open('geci','a+',encoding='utf-8') as f:
       f.seek(0)
    all = f.read()
    new_all = all.replace('二','一')
    f.seek(0)
    f.truncate()
    f.write(new_all)
    f.flush()

    2、新建一个文件,将修改后的内容写入新文件,然后删除原文件,将新文件重命名变回原文件
    import os
    with open('原文件',encoding='utf-8') as f,open('geci.gy','w',encoding='utf-8') as f2:
    for line in f:
    new_line = line.replace('一','二')
    f2.write(new_line)


    os.remove('geci')#删文件
    os.rename('geci.gy','geci')#改名

     下面写一个监控脚本:

    #1、如果同一个ip地址60s之内访问超过200次,那么就把ip加入黑名单
    #需求分析:
    #1、60秒读一次文件
    #2、分割,取到第一个元素,ip地址
    #3、把所有的ip加入到一个list里,如果ip次数超过200次,加入黑名单

    import time
    point = 0 #文件指针
    while True:
    ips = []#存放所有的ip地址
    blk_set = set() #存放需要加入黑名单ip
    with open('access.log',encoding='utf-8') as f:
    f.seek(point)
    for line in f:
    ip = line.split()[0]
    ips.append(ip)
    #10.125.1.1
    if ips.count(ip)>200:
    blk_set.add(ip)
    for ip in blk_set: #这里是因为防止ip重复加入黑名单,因为集合是去重的,所以里面没有重复的ip
    #os.system('jiaurru %s'%ip)
    print('加入黑名单%s'%ip)
    point = f.tell()
    time.sleep(30)



  • 相关阅读:
    12 【结构型】 浅谈享元模式的理解与使用
    11【结构型】浅谈 外观模式 理解与使用~
    【Maven基础入门】02 了解POM文件构建
    【Maven基础入门】01 Maven的安装与环境变量的配置
    02【创建型】原型模式
    01【创建型】单例模式
    10 浅谈 装饰器模式的理解与使用
    Java JDK1.8源码学习之路 2 String
    Java JDK1.8源码学习之路 1 Object
    ApachShiro 一个系统 两套验证方法-(后台管理员登录、前台App用户登录)同一接口实现、源码分析
  • 原文地址:https://www.cnblogs.com/kikyoude/p/8215443.html
Copyright © 2020-2023  润新知