• 【2019-5-26】python:字典、元组、常用字符串处理方法及文件操作


    一、数据类型:字典

    1.字典:

    1.1定义字典:dict={'key':'value'}

    1.2字典与列表相比,字典取值快,可直接找到key

    1.3字典是无序的,不能根据顺序取值

    1.4多个元素用逗号隔开,key名称不能重复,如:

    info={'name':'momo','sex':'','addr':'beijing'}

    2.字典的增删改查

    2.1增加:

    #直接增加:
    info['qq']='454545454'
    print(info)
    #setdefault('a','b')增加
    info.setdefault('car','bmw')
    print(info)

    2.1.1两种增加方式的区别:

    增加字典中不存在的key时,两种方式无区别;

    增加字典中已经存在的key时:

    #setdefault kay重复的话就不修改,kay不存在就增加一个

    #info[qq]:1000,依据key改值

    3.删除:删除指定的key,以下两种方式无区别

    info.pop('qq')
    del info['qq']
    #随机删除(不常用)
    #info.popitem()

    4.取值:

    #多种方式
    print(info['qq'])   #此种方式,当字典中不存在这个key时会报错
    print(info.get'phone')
    #.get的方式,当字典中不存在这个key,会返回none,不会报错,安全起见,取值时,使用.get的方式
    
    print(info.get('favourite','cooking')
    #获取key是favourite的值,如果有就返回对应的值,如果没有就返回cooking
    print(info.keys())  #获取info这个字典中的所有key的名称
    print(info.values())#获取info这个字典中的所有value的名

    5.字典的其他操作

    5.1清空列表:info.clear()

    5.2拼接两个字典:info.update()

    stu={'xiaohong':'18','xiaoming':'20'}        
    print(info.update(stu))
    #把stu拼接到info字典下

    5.3判断key是否存在:

    print('phont' in info )
    #如果存在的话,返回True,不存在的话返回Falus

    6.多层字典取值:

    stu_info  = {
        'liudonghai':{
            'house':['三环','四环','五环'],
            'car':{
                'china':['byd','五菱宏光','Hongqi'],
                'jap':['丰田','本田'],
                'Genmany':{
                    'ben-z':2,
                    'bmw':3,
                    'audi':5
                }
            }
        }
    }
    #刘东海又买了一辆宝马
    stu_info['liudonghai']['car']['Genmany']['bmw']+=1
    print(stu_info)
    #刘东海扔了比亚迪
    stu_info['liudonghai']['car']['china'].remove('byd')
    print(stu_info)

    7.字典练习:

    注册程序:

    (1)输入账号密码

    (2)如果密码不存在,可以注册

    (3)存在的话提示账号已存在

    register={
        'tuzi':'123456',
        'dayu':'111111',
        'momo':'456789'
    }
    for i in range(3):
        N = input('请输入用户名')
        P = input('请输入密码')
        if N not in register:
            print('可以注册')
            register.setdefault(N,P)
            break
        else:
            print('用户名已存在')
            continue
    print(register)

    8.字典循环:以下两种方法,第二种方法比第一种方法好

    #第一种方法:
    accounts={'tuzi':'123456','dayu':'111111','momo':'456789'}
    for i in accounts:
        print('%s:%s'%(i,accounts[k]))
    
    #第二种方法:
    for k,v in accounts.items():
        print(k,v)

    dict_items([('tuzi', '123456'), ('dayu', '111111'), ('momo', '456789')])

    item():Python 字典(Dictionary) items() 函数以列表返回可遍历的(键, 值) 元组数组。

    dict_items([('tuzi', '123456'), ('dayu', '111111'), ('momo', '456789')])

    9.把两个字符串拼成字典:

    list1=['uid','name','sex']
    list2=['001','yuanxin','']
    
    print(dict(zip(list1,list2)))
    同下:
    dict={}
    for i in range(len(list1)):
        dict[str(list1[i])]=str(list2[i])
    print(dict)

    二、数据类型:元组tuple。

    1.元组定义:

    元组也是一个list,但是元组不能修改和增加,只能取值

    t=(1,2,3,4,5)      #元组也通过下标取值
    print(t[0])

    #t[0]='a' 结果报错,元组不能修改

    2.count():统计元素出现次数

    t=('172.16.108.228','root','123456',3306)
    print(t.count(3306))   #统计出现次数
    print(t.index('123456'))

    #字符串有下标,但是字符串不能修改
    s='abcdef'
    print(s[0])
    jieguo

    3.元组中只有一个元素时,要在元素后边加逗号

    #元组中只有一个元素时,要在元素后边加一个逗号,
    t1=(1)
    print(type(t1))     #结果是int型
    t3=(1,)             #元素中只有一个元素时,要在元素后边加一个逗号,
    t2=('a')
    print(type(t2))         #结果是字符串

    4.删除元组:

    已经创建的元组,不再使用时,可以用del语句将其删除

    del tuplename

    三、字符串的常用方法:

    s=' abc   '
    print(s.strip())      # 去掉字符串左右两边的空格和换行符,在字符串中间的无法取掉
    print(s.rstrip())     #只去右边的空格
    print(s.lstrip())     #只去左边的空格
    print(s.replace('a','A'))  #replace()替换,把a替换成成A
    print(s.replace(' ',''))            #去掉中间空格,把空格替换成空字符串
    #所有字符串方法,都是返回一个新的字符串,不会修改原来的字符串,因为字符串无法修改
    
    
    s2='abc'
    s2.index('c')   #查找c的下标
    s2.count('c')  #统计c出现的次数
    s2.startswith('a')  #判断是否是以a开头,是返回True,不是返回false
    s2.endswith('.jpg')  #判断是否以d结尾,是返回True,不是返回false
    s2.find('d')         #判断字符串中是否有'd'
    
    s2.upper()   #将字符串转换成大写
    s2.lower()     #将字符串转换成小写
    s2.isdigit()      #判断是否是整数,是返回True,不是False,是整数可以转成int类型
    print(s.capitalize())         #首字母大写
    print(s.center(50,'='))           #总长度设为50,不够50用某字符在两侧补齐
    s2='1A'
    s2.zfill(9)  #不足9位前边补0,python不能写num=01这种,所以需要写001,只能定义字#符串,然后补零
    s2.isupper()   #判断是否首字母大写
    s2.islower()  #判断是否首字母小写
    s2.isalpha()    #判断是否都是汉字和字母
    s2.isalnum()   #判断是否都是子母和数字
    s2.issplace()     #判断是否都是空格
    
    s3='今天是{},欢迎{}登陆'
    print(s3.format('2019','xiaoming'))     #使用{}占位,与%s效果一致
    
    s4='insert into stu(name,age,grass) values ("{name}","{age}","{grass}")'
    s4=s4.format(name='min',age='18',grass='9')
    print(s4)
     #可以不按顺序对应,只要占位名称一样即可
    
    print(s4.format_map({"username":"abc","id":"1","password":"123456"}))    #format_map():可以写字典
    stus='xiaoming,xiaohei,xiaobai,xiaojun'
    
    #分割字符串:.split()  按xxx分割字符串,默认是按空格分隔
    stus.split(',')   #按逗号分隔字符串你
    stus.split()      #不输按空格分隔字符串
    stu.split(',',4) #用逗号分隔并且只分割前四个 students='xiaoming xiaohei xiaobai xiaojun' students.split(',') #没有可分割的就输出全部字符串

    #字符串分割后取值:
    这是个很好的例子!!!!!!!!
    >>> str="hello boy<[www.doiido.com]>byebye" >>> str.split("[")[1].split("]")[0] 'www.doiido.com' >>> str.split("[")[1].split("]")[0].split(".") ['www', 'doiido', 'com']
     

    数据库中只能存字符串,不能存list和字典,所以需要存入list中元素进数据库时,要先将元素都转化成字符串类型

    list=['xiaoming''maomao','xiaomei','dongdong']
    a=','.join(list)
    #把list 中的每个元素,通过指定的字符串连接起来,这个例子是通过逗号连接的

    使用字符串对象的format()方法:

     

     练习:

    #>右对齐,长度为5,不足5用0补齐,类型是s字符串类型
    s='{:0>5s}你好,我是{:s}'
    s1=s.format('小白','韩寒')
    print(s1)
    # 通过key来填充字符串
    s2='{name1} hello,i am {name2}'
    s3=s2.format(name1='xiaobai',name2='xiaoming')
    print(s3)
    #保留两位小数
    s4=3.141592653
    num='{:.2f}'.format(s4)
    print(num)

    print和pprint的区别:

    import pprint
    l=['xiaoming', 'xiaohei', 'xiaobai', 'jaojun']
    print(''.join(l))    #把list 中的每个元素,通过指定的字符串连接起来
    sl=str(l)
    pprint.pprint(l)
    pprint.pprint(sl)
    print(l)
    print(type(sl))

     三、文件处理

    1.文件读写

    1.1操作文件的过程:打开、操作、关闭

    #操作文件:打开、操作、关闭
    #打开文件的模式:读模式r 、写模式 w、追加模式 a
    #读模式:只能读不能写,打开不存在文件会报错
    f=open('笔记',encoding='utf-8')              #打开在pycharm中创建的文件
    result =f.read()
    print(result)
    #写模式,只能写不能读。写之前会先清空,再写入
    s=open('test','w',encoding='utf-8')        #如果要写入的话,需要写模式 ,写模式如果文件不存在会建一个新文件,如果文件有内容,会覆盖
    s.write('abc')
    result=s.read()
    print(result)
    
    #追加模式,a:在原文件末尾增加新内容,文件不存在可以创建,但是只能写不可读
    a=open('not','a',encoding='utf-8')
    a.write('haha')
    # result=a.read()
    # print(result)

    1.2打开文件模式1:读模式(r),写模式(w),追加模式(a)

    
    
    #操作文件:打开、操作、关闭
    #打开文件的模式:读模式r 、写模式 w、追加模式 a
    #读模式:只能读不能写,打开不存在文件会报错
    f=open('笔记',encoding='utf-8') #打开在pycharm中创建的文件
    result =f.read()
    print(result)
    #写模式,只能写不能读。写之前会先清空,再写入
    s=open('test','w',encoding='utf-8') #如果要写入的话,需要写模式 ,写模式如果文件不存在会建一个新文件,如果文件有内容,会覆盖
    s.write('abc')
    result=s.read()
    print(result)

    #追加模式,a:在原文件末尾增加新内容,文件不存在可以创建,但是只能写不可读
    a=open('not','a',encoding='utf-8')
    a.write('haha')
    # result=a.read()
    # print(result)
     

    1.3打开文件模式2:读写模式r+,写读模式:w+,追加读模式:a+

    
    
    r+   读写模式、w+  写读模式、a+   追加读模式
    r+ 打开不存在文件会报错,只要跟r有关的,都不能打开不存在的文件
    f=open('test',"r+",encoding='utf-8')
    f.write('bbbbbbb')
    result=f.read()
    print(result)
    w+:只要和w模式有关,都会先清空,未移动指针前读不到内容
    w=open('w','w+',encoding='utf-8')
    w.write('xiedu')
    result=w.read()
    print(result)

    a+:能写能读,但是读前要移动指针,由于a+模式是在内容后面追加,不会清空原内容,所以使用时尽量使用a+模式
    a=open('a','a+',encoding='utf-8')
    a.write('xiedu')
    result=a.read()
    print(result)
     

    2.文件读写2

    f2=open(r'C:Users94596Desktopabc.txt',encoding='utf-8')
    print(f.readline())      #每次读取一行的内容,调一次读一次
    print('lines',f.readlines)    #将文件中每行的内容都返回到一个list中,
    print('read',f.read())                  #readlines后再读读不出内容,因为文件指针已经在最后
    #移动指针:
    f.seek(0)                                  #移动指针,0是最前面
    print('read',f.read())    #这时再读就可以读出来内容了

    3.文件指针:

    刚打开文件的时候 ,文件指针在最前面,执行完read()后,文件指针移动到最后边,所以读不出内容来

    f=open('test','w+',encoding='utf-8')
    f.write(' 下周不上课')
    f.seek(0)
    print(f.read())

    #a+文件指针是在最后边,seek(0)先清空,再read
    #保险起见,又能读有能写,用a+

    r+,文件指针在最前面,用r+写入,会代替开头的内容

    4.把list的内容循环写到文件中:writelines()

    list=['a','b','c','d']
    f3=open('hm','w',encoding='utf-8')
    for i in list:
        f3.write(i+'
    ')
    print(f3)
    #实现以上功能的方法:
    f3.writelines(list)
     #传一个list的话,会自动循环,把list里面每个元素写到文件里

    3.文件修改:

    3.1文件修改的原理:

    3.1.1.简单方式:

    #先读取内容,再替换
    #清楚原文件内容,写进新内容

    f=open('test','a+',encoding='utf-8')   #a+模式进入文件,指针是在文件最后边
    f.seek(0)      #文件指针移到最前边
    result=f.read()      #先读取文件再替换
    content=result.replace('xiaohong','dalan')  #把test文件中的xiaohong替换成dalan
    f.seek(0)
    f.truncate        #清空原文件
    f.write(content)        #把content写进原文件

    3.2.2 逐行处理

    f1=open('test','a+',encoding='utf-8')
    f2=open('test2.txt','a+',encoding='utf-8')
    f1.seek(0)        #因为是a+模式,需要从第一行开始取,所以把指针移到最前面,但是如果是只读模式,默认指针是在最前面的,不需要seek(0)
    for line in f1:
        result=line.upper()   #读取每一行,并修改
        f2.write(result)          #将修改后的结果,逐行放在f2文件中
    f1.close()
    f2.close()
    os.remove('test')                 #删掉修改前的文件
    os.rename('test2.txt','test')             #把修改后的文件重命名

     4.高效处理文件:

    f=open(r'test',encoding='utf-8')
    for line in f:
        print(line)                  #每次读取一行

    5.不用关闭文件的方式:

    with open('test')as f,open('hm','w') as f2:          #with自动判断程序执行完,就自动关闭,不需要.close(),两个文件用逗号隔开,只需要写一个with
        f=f.read()
        f2.write('XX')

     6.练习监控日志:

    每分钟读取一次文件,把1分钟内访问数量超过100的ip取出来,禁掉

    #写一个死循环
    import time
    point=0
    while True:                                     #死循环,for不能写死循环
        ips={}          #存放所有的ip
        f=open(r'C:Users94596Desktopaccess.log',encoding='utf-8')
        f.seek(point)
        for line in f.readlines():
            if line.strip()!='':
                ip=line.split()[0]
                if ip not in ips:
                    ips.setdefault(ip,1)
                else:
                    ips[ip]+=1
        point=f.tell()           #记录文件指针的当前位置
        for k,v in ips.items():
            if v>=100:
                print('有问题的ip:%s'%k)
        f.close()
        time.sleep(60)                    #每分钟运行一次

     f.tell():记录文件指针的当前位置

  • 相关阅读:
    Day3----《Pattern Recognition and Machine Learning》Christopher M. Bishop
    Day2----《Pattern Recognition and Machine Learning》Christopher M. Bishop
    学习笔记-----《Pattern Recognition and Machine Learning》Christopher M. Bishop
    “数学之美”笔记
    win10下使用nodejs安装及webstorm创建express项目的指导
    deepin/ubuntu下搭建Jekyll环境
    struts2.3.23升级到struts2.3.32
    struts2.5能不能再恶心点
    线程通信、线程同步以及进城通信的真的搞懂了么
    WINFORM数据库操作,有点像安装里面的SQLITE
  • 原文地址:https://www.cnblogs.com/hancece/p/10933084.html
Copyright © 2020-2023  润新知