• day19:常用模块(collections,time,random,os,sys)


    1,正则复习,re.S,这个在用的最多,re.M多行模式,这个主要改变^和$的行为,每一行都是新串开头,每个回车都是结尾。re.L 在Windows和linux里面对一些特殊字符有不一样的识别,re.L 是根据当前的操作系统来识别,这个不推荐使用,他就不一样了。正常还是走我们的记得意思,re.U 这个对于ASCII码是一样的,对于中文才使用Unicode,re.X和re.M有点像

    import re
    ret = re.findall('.*d+','hsd739y8kk  
    s99sihf99 g9o3y')
    print(ret)
    # ['hsd739y8', 's99sihf99 g9o3']
    ret = re.findall('.*d+','hsd739y8kk  
    s99sihf99 g9o3y',re.S)
    print(ret) #注意加了flag换行也给匹配了就
    # ['hsd739y8kk  
    s99sihf99 g9o3']

    2,尖角号必须开头,$符号,必须结尾,不然就是一个错误的正则

    3,分组,在正则里面,因为想对多个字符组整体两次约束的,在re模块里面,分组是有优先的(findall,split)

    4,|,从左到右匹配,只要匹配上就不继续匹配了,所以应该要把长的放在前面

    5,[^],除了分组里面的其他都匹配

    6,转义问题,特殊字符,比方说匹配星号要用*这样才能匹配

    # 前面加上r 就没有问题了,建议都加上
    ret = re.findall('\\s','s')  #正则需要转义,Python也需要转义的
    print(ret)
    # ['\s']
    ret = re.findall(r'\s',r's')
    print(ret)
    # ['\s']
    
    ret = re.findall('*','*')
    print(ret)
    
    ret = re.findall(r'*','*')
    print(ret)
    # 字符组里面是没有两次这一说的,说以正则里面放在字符组里面的特殊字符可以直接匹配,不需要转义
    ret = re.findall('[*]','*')
    print(ret)

    7,但是字符组里面的减号要注意一下,

    # 正则里面,只要是特殊字符就都给转义了,就没有问题
    ret = re.findall('[-]','-')
    print(ret) #  ['-']
    
    ret = re.findall('[1-9]','12-')
    print(ret) # ['1', '2']
    
    ret = re.findall('[1-9]','12-')
    print(ret) #['1', '-']

    8,正则里面默认是贪婪匹配,量词后面加问号就是非贪婪匹配了,惰性匹配,最常用的.*?abc,一直取,一直到遇到abc为止

    9,re模块常用的函数,findall(返回列表),match(从头匹配),search(返回第一个匹配的),split,sub,subn,finditer(明知有很多匹配结果,但是不希望一次全部加载到内存里面,所以返回一个迭代器),compile,返回编译对象,编译一次,多次使用

    10,匹配标签练习题,分组取名,按照序号取分组里面的内容。

    # 匹配标签
    ret = re.search(r"<(?P<tag_name>w+)>w+</(?P=tag_name)>",r'<h1>hello</h1>')
    # 尖角号就是一个字符,利用?P给分组起名字
    # 获取的匹配结果可以直接group('名字')拿到对应的值,前面的命名,后面是用了这个分组名,里面的东西要一模一样。
    print(ret.group())
    print(ret.group('tag_name'))
    print(ret.group(1))
    
    
    ret = re.search(r"<(w+)>w+</1>",r'<h1>hello</h1>') # 这儿的r是必须写的,不1有特殊含义无法完成匹配,建议任何地方都要加上r
    print(ret.group())
    print(ret.group(1))   # 分组数字,如果不给分组起名字,也可以用序号来找到对应的组,表示要找的内容和前面的组内容一致。
    # 匹配的结果,可以用group序号拿到对应的值

    11,匹配所有整数,对自己真正想要的东西做分组,强行显示

    # 匹配所有数字
    ret=re.findall(r"-?d+(?:.d+)?","1-2*(60+(-40.35/5)-(-4*3))")
    # ['1', '-2', '60', '-40.35', '5', '-4', '3']
    print(ret)
    
    # 匹配整数
    ret=re.findall(r"-?d+.d*|(-?d+)","1-2*(60+(-40.35/5)-(-4*3))")  # 利用了分组优先,前面匹配到了,但是也要返回分组,分组是空,
    # 分组的机制是由Python决定的,或约束的不是一个字符,是整个前面的,这个是正则决定的,
    # ['1', '-2', '60', '', '5', '-4', '3']
    print(ret)
    ret.remove("")  # 这样就匹配到所有整数了
    print(ret)
    
    ret=re.findall(r'abc|efg',r'abc') # ['abc']
    print(ret)
    # ['1', '-2', '60', '5', '-4', '3']
    ret=re.findall(r'abc|(efg)',r'abc')  # ['']  # 没匹配上硬要显示就是空,这个是Python的分组机制决定的
    print(ret)

    12,一些基本的匹配,匹配邮箱 https://blog.csdn.net/make164492212/article/details/51656638

    # 邮箱匹配
    # 实例1、只允许英文字母、数字、下划线、英文句号、以及中划线组成
    ret = re.findall(r"^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(?:.[a-zA-Z0-9_-]+)+$",'shlisa@126.comh')
    print(ret) # 取消分组优先需要
    # ['shlisa@126.comh']
    
    ret = re.search(r"^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(?:.[a-zA-Z0-9_-]+)+$",'bdjgiuugishlisa@126.comhkaslhfui')
    print(ret.group()) # 取消分组优先需要
    # bdjgiuugishlisa@126.comhkaslhfui
    
    # 实例2、名称允许汉字、字母、数字,域名只允许英文域名,同样考虑分组优先的问题
    # ^[A-Za-z0-9u4e00-u9fa5]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$

    13,其他常用的匹配

    # 匹配12个月
    # ret = re.findall('^(0?[1-9]|1[0-2])$','03')
    # print(ret)
    
    # 匹配31天
    # ret = re.findall(r'^(?:(?:0?[1-9])|(?:(?:1|2)[0-9])|30|31)$','31')
    # print(ret)
    
    # 匹配qq号码,(腾讯QQ号从10000开始)
    # [1,9][0,9]{4,}
    
    # 匹配浮点数
    # ^(-?d+)(.d+)?$   或者  -?d+.?d*
    
    # 匹配汉字
    # ^ [u4e00 -u9fa5]{0, }$ 

    14,下面将模块,一共六个,collections,time,random,os,sys,序列化,除了collections其他都很重要,collections主要是为了多认识一些数据类型,了解一些数据结构相关的知识

    序列化模块非常非常重要的。random用到了才重要

    # collections python中的扩展数据类型
    # random 随机数模块,抽奖呀,用到了很重要
    # os 和操作系统打交道的模块
    # sys 和Python解释器打交道的模块
    # 序列化模块 Python中的数据类型和str转换的模块
    
    # 自己建立的py文件不要和系统已经有的模块重名,会覆盖掉,模块本质就是一个py文件

    15,模块起名最好是re_demo等等,总之不要和模块名字一模一样

    16,collection模块,Python额外提供的数据类型namedtuple,deque,Counter,OrderedDict,defaultdict, 计数器了解一下就行,扩展的数据类型

    from collections import namedtuple # 看到别人用,自己要认识
    
    p = (1,2) # 之前的元祖来定义一个点的坐标很难看出来是一个坐标,但是用namedtuple就很直观,
    
    # 二维坐标
    Point = namedtuple('point',['x','y'])  # 列表里面的值是字符串格式,可命名元祖,除了坐标也可以描述圆
    p = Point(1,2)
    print(p.x)  # 1
    print(p.y)  # 2
    print(p) # point(x=1, y=2)
    
    # 三维坐标
    Point = namedtuple('point',['x','y','z'])  # 还可以表示三维的,几个都可以,看自己需要几个
    p = Point(1,2,1)
    print(p.x)  # 1
    print(p.y)  # 2
    print(p.z)
    print(p) # point(x=1, y=2, z=1)
    
    # 花色和数字
    card = namedtuple('card',['suits','number'])
    c1 = card('Hearts','2')
    print(c1) # card(suits='Hearts', number='2')

    17,deque双端队列,先来了解下queue,队列是一个链着一个的,但是列表不是链表,列表删第一个应该也很慢

    # 列表,元祖
    # 字典
    # 集合,frozenset
    # 字符串
    # 堆栈,先进后出
    # 队列,先进先出 FIFO first in first out 
    
    import queue  # 一种数据类型
    q = queue.Queue()
    q.put([1,2,3]) # 放字典也可以,但是不能put一次放多个值,不支持
    q.put(5)
    q.put(6)
    # print(q.get()) # 10 队列,先进先出
    # print(q.get()) # 5
    # print(q.get()) # 6
    # print(q.get()) # 取完了,等在那里,程序不结束,这就是阻塞
    
    print(q.qsize()) # 3
    
    # for i in q :
    #     print(i) # TypeError: 'Queue' object is not iterable

    18,使用list存储数据的时候,按照索引来访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除的效率很低,deque是为了高效实现插入和删除操作的双向列表,适用于队列和栈

    from collections import deque  # 只能从头或者从尾拿,有reverse方法,不能sort
    q = deque(['a','b','c'])
    q.append('x')  # 从后面放数据
    print(q) # deque(['a', 'b', 'c', 'x'])
    q.appendleft('y')  # 从前面放数据
    print(q)  # deque(['y', 'a', 'b', 'c', 'x'])
    
    deque.pop(q)  # 从后面取数据,返回值是pop出来的元素
    print(q) # deque(['y', 'a', 'b', 'c'])
    deque.popleft(q)  # 从前面取数据
    print(q) # deque(['a', 'b', 'c'])
    
    q.insert(2,'u')  # 插入的位置,插入的元素,可以插队,但是queue不能插队,双端队列可以插队
    print(q) # deque(['a', 'b', 'u', 'c'])

    19,Ordereddict,有序字典,会按照key插入的顺序排序,不是key本身排序,字典取值很快,但是比存成列表占内存,有序字典比一般的字典更占内存,很长的字典不适合用有序字典

    购物车买东西用有序字典比较好

    from collections import OrderedDict
    d = dict([('a',1),('b',2),('c',3)])  # 字典也可以这样定义的,最不常用的一种方式,不是强转
    print(d)  # {'a': 1, 'b': 2, 'c': 3},这种打印的话是随机的,因为key是无序的
    
    od = OrderedDict([('a',1),('b',2),('c',3)])
    print(od)  #  OrderedDict([('a', 1), ('b', 2), ('c', 3)]),key是有序的
    print(od['a']) # 1
    print(od['b']) # 2
    print(od.keys()) # odict_keys(['a', 'b', 'c'])
    
    for k in od.items():  # 用起来其实和字典是一样的,只是有序了
        print(k)

    20,defaultdict,使用dict时如果key不存在会抛出keyerror,如果希望key不存在时返回一个默认值,那么就可以用defaultdict,以前的dict代码必须要加一次key是否in 字典的判断,代码会比较长

    # 第一种写法:
    result= {}
    result.setdefault("key1",[])
    # result["key1"] =[]
    # result["key2"] =[]
    result.setdefault("key2",[])
    for i in li:
    
        if i < 66:
            result["key1"].append(i)
        else:
            result["key2"].append(i)
    
    print(result)
    
    
    
    # 第二种写法:
    for i in li:
        if i > 66:
            if "key1" not in result:
                # result.setdefault("key1")
                result["key1"] = []
            result['key1'].append(i)
        else:
            if "key2" not in result:
                # result.setdefault("key1")
                result["key2"] = []
            result['key2'].append(i)
    
    print(result)
    View Code
    from collections import defaultdict
    values = [11,22,33,44,55,66,77,88,99,90]
    
    dd = defaultdict(lambda :"N/A" )  # 这儿参数必须是一个callable的
    dd['k1'] ='abc'
    print(dd['k1'])  # abc
    print(dd['k2'])  # N/A  不存在的key的value显示默认值
    
    dd2 = defaultdict(list)
    print(callable(list))  # True
    print(dd2['k1']) # []
    
    dd2 = defaultdict(dict)
    print(callable(dict))  # True
    print(dd2['k1']) #  {}
    
    # dd2 = defaultdict(5) # TypeError: first argument must be callable or None
    # print(callable(5))
    # print(dd2['k1']) #
    
    dd2 = defaultdict(lambda :5) # TypeError: first argument must be callable or None
    print(callable(5))  # False
    print(dd2['k1']) # 5
    values = [11,22,33,44,55,66,77,88,99,90]
    dd3 = defaultdict(list)
    for value in values:
        if value > 66:
            dd3['k1'].append(value)
        elif value < 66:
            dd3['k2'].append(value)
    
    print(dd3)
    # defau

    21,Counter,计数器,详细可以参考这个link http://www.cnblogs.com/Eva-J/articles/7291842.html

    from collections import Counter
    c = Counter('djfhjkalshfajskdhfjksladhfskafhsjkhfdjsahfksjdhfkjshdksjahfaskjh')
    print(c)  # 统计每个字母出现了多少次,无序的容器类型,这是一个很鸡肋的功能
    # Counter({'h': 11, 'j': 10, 's': 10, 'f': 9, 'k': 9, 'a': 7, 'd': 6, 'l': 2})

    22,Python里面表示时间有三种方式,时间戳,格式化的字符串,元祖

    # 和时间相关的我们用时间模块,在使用时间模块之前,应该首先导入这个模块
    import time
    # time.sleep(1) # 秒为单位(线程)推迟指定的时间,单位是秒
    # print(time.time()) # ,获取当前的时间戳,也就是从1970年开始经历的所有秒
    
    # 字符串 ---格式化时间:给人看的
    # 时间戳 ---float时间:计算机看的
    # 结构化时间 --- 元祖:计算用的
    
    
    # 时间戳
    print(time.time()) # 1545578398.396597
    
    # 字符串
    print(time.strftime("%Y-%m-%d %X"))    # 2018-12-23 23:19:58
    # 打印哪些,什么格式,都是自己指定的
    print(time.strftime("%Y-%m-%d %H:%M:%S")) # year month day HOUR MINUTE SECOND  2018-12-23 23:19:58

    23,字符串时间的常用格式

    # 字符串
    print(time.strftime("%Y-%m-%d %X"))    # 2018-12-23 23:19:58  string format time  X:用的不多
    print(time.strftime("%y-%m-%d %X"))  # 18-12-23 23:30:08
    # 打印哪些,什么格式,都是自己指定的
    print(time.strftime("%Y-%m-%d %H:%M:%S")) # year month day HOUR MINUTE SECOND  2018-12-23 23:19:58
    
    
    # python中时间日期格式化符号:
    # 仅针对string format time
    
    # %y 两位数的年份表示(00-99)
    # %Y 四位数的年份表示(000-9999)
    # %m 月份(01-12)
    # %d 月内中的一天(0-31)
    # %H 24小时制小时数(0-23)
    # %I 12小时制小时数(01-12)
    # %M 分钟数(00=59)
    # %S 秒(00-59)
    # %a 本地简化星期名称
    # %A 本地完整星期名称
    # %b 本地简化的月份名称
    # %B 本地完整的月份名称
    # %c 本地相应的日期表示和时间表示
    # %j 年内的一天(001-366)
    # %p 本地A.M.或P.M.的等价符
    # %U 一年中的星期数(00-53)星期天为星期的开始
    # %w 星期(0-6),星期天为星期的开始
    # %W 一年中的星期数(00-53)星期一为星期的开始
    # %x 本地相应的日期表示
    # %X 本地相应的时间表示
    # %Z 当前时区的名称
    # %% %号本身

    24,localtime,结构化时间

    # 时间元祖:localtime将一个时间戳转换为当前时区的Strut_time
    print(time.localtime())
    # time.struct_time(tm_year=2018, tm_mon=12, tm_mday=23, tm_hour=23, tm_min=39, tm_sec=1, tm_wday=6, tm_yday=357, tm_isdst=0)
    
    # 小结,时间戳是计算机能够识别的时间;时间字符是人能够看懂的时间;元祖则是用来操作时间的
    lt =time.localtime()
    print(lt)
    # time.struct_time(tm_year=2018, tm_mon=12, tm_mday=23, tm_hour=23, tm_min=39, tm_sec=1, tm_wday=6, tm_yday=357, tm_isdst=0)
    print(lt.tm_year)  # 2018 这个模块有个不好的地方就是,不给提示,要自己去敲

    25,几种格式之间的转化,时间戳和格式化字符串是不能直接转的

    # 时间戳 --> 结构化时间
    # time.gmtime(时间戳)  UTC时间,与英国伦敦当地时间一致
    # time.localtime(时间戳)  当地时间,对于我们就是北京时间
    print(time.gmtime(3000000000))
    # time.struct_time(tm_year=2065, tm_mon=1, tm_mday=24, tm_hour=5, tm_min=20, tm_sec=0, tm_wday=5, tm_yday=24, tm_isdst=0)
    print(time.localtime(130000000))
    # time.struct_time(tm_year=1974, tm_mon=2, tm_mday=13, tm_hour=23, tm_min=6, tm_sec=40, tm_wday=2, tm_yday=44, tm_isdst=0)
    print(time.gmtime(time.time()))
    # time.struct_time(tm_year=2018, tm_mon=12, tm_mday=23, tm_hour=15, tm_min=50, tm_sec=47, tm_wday=6, tm_yday=357, tm_isdst=0)
    
    # 结构化时间 --> 时间戳
    # time.mktime(结构化时间)
    print(time.mktime(time.localtime())) # 1545580212.0
    
    
    # format string --> 结构化时间
    print(time.strptime('2000-12.31','%Y-%m.%d'))
    
    
    # 结构化时间 --> format string
    print(time.strftime('%m/%d/%Y %H:%M:%S',time.localtime(300000000)))  # 这个不指定第二个参数,就是给出当前时间的format时间

    26,asctime

    按照如下结构显示--> %a %b %d %H:%M:%S %Y串
    结构化时间,如果不传参数,直接返回当前时间的格式化串
    参数可以是结构化时间
    print
    (time.asctime()) # Mon Dec 24 00:20:27 2018 # 直接用这个函数,时间就会显示成这个格式

    27,ctime 参数可以是时间戳,也可以不传参数,返回格式化串,这么格式,就是为了显示我想要的时间格式

    print(time.ctime())
    # Mon Dec 24 00:24:05 2018

    28,time模块计算时间差,datatime模块也可以计算时间差,需要自己计算

    true_time = time.mktime(time.strptime("2017-9-11 08:30:00",'%Y-%m-%d %H:%M:%S'))
    time_now = time.mktime(time.strptime("2017-9-12 11:23:00",'%Y-%m-%d %H:%M:%S'))
    dif_time = time_now -true_time
    print(dif_time, time_now,true_time)
    struct_time = time.gmtime(dif_time)
    # struct_time = time.gmtime(0)
    # 之所以减掉,是因为,differ为0是是1970年的,要减掉这些,才是真正的差值。
    # time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
    print(struct_time)
    print("过去了%d年%d月%d天%d小时%d分钟%d秒" %(struct_time.tm_year-1970,struct_time.tm_mon-1,struct_time.tm_mday-1,
                                      struct_time.tm_hour,struct_time.tm_min,struct_time.tm_sec))

    29,随机数模块,random模块,random 提供了一些和随机有关的方法

    import random
    
    # 随机小数 返回小数我们用的比较少,场景比较少
    print(random.random())    # 0-1 之间的随机的小数
    # 0.7816672791174853
    print(random.uniform(1,3)) # 大于1小于3的小数
    # 1.6544048997218492
    
    # 随机整数,这个用的很多
    print(random.randint(1,5)) # 大于等于1且小于等于5之间的小数,包括5
    print(random.randrange(1,10,2)) # 大于等于1,且小于10之间的奇数,不包括10
    
    # 随机选择一个返回
    print(random.choice([1,'a',[4,5]])) # 1或者'a'或者[4,5]
    # 随机选择多个返回,返回的个数为函数的第二个参数
    print(random.sample([1,'23',[4,5]],2)) # 列表元素任意2个组合
    # 被选择的放在一个列表里面
    
    # 列表打乱顺序
    item = [1,4,5,6,7,8,'a','m']
    random.shuffle(item) # 打乱次序,类似于洗牌,改变的是原来的列表,不会生成新的
    print(item)   # [1, 6, 4, 5, 8, 7, 'm', 'a']
    
    random.shuffle(item)
    print(item)  # ['a', 'm', 5, 4, 1, 8, 6, 7]

    30,验证码,生成随机验证码

    # 0-9
    # chr
    # [65-90] 数字
    # 字母 = chr(数字)
    # 随机数字
    # 随机选一个[随机数字,随机字母]
    # 当然实际的验证码还会有一些噪点,变形,防止被识别,这里不再考虑,也不考虑图片的情况
    
    import random
    def v_code():
    
        code = ''
        for i in range(5):
    
            num=random.randint(0,9)
            alf1=chr(random.randint(65,90))
            alf2 = chr(random.randint(97, 122))
            add=random.choice([num,alf1,alf2])
            code="".join([code,str(add)])  # 字符串,join函数,用空格来拼接
        return code
    
    print(v_code())

    31,os模块,os模块是和操作系统打交道的,os 模块管的范畴就是Python解释器所管的小范围了,整个操作系统的东西,整个范畴,只要提供方法,OS模块都可以来操作,但是是借助操作系统来操作的,目录相关

    import os
    print(os.getcwd())  # /Users/guolixiao/PycharmProjects/lisa's_practise/boys/part one
    os.chdir(r"/Users/guolixiao/PycharmProjects/lisa's_practise/boys/")
    print(os.getcwd())
    #
    os.chdir('..')
    print(os.getcwd())
    
    # 很鸡肋的功能
    print(os.curdir)  # .  返回当前目录
    print(os.pardir)  # ..  当前目录的父目录
    
    os.makedirs('lisa/osdir/os')  # 若目录本身已经存在了再继续创建会报错
    os.removedirs('lisa/osdir/os') #
    os.removedirs('lisa') #  这样删除不了
    
    os.mkdir(r'lll')  # 文件存在会报错
    os.rmdir(r'lll')
    
    print(os.listdir('..'))
    os.remove(r'file.txt')
    os.rename(r'../file.txt','file1.txt')

    32,查看文件的状态,用到了过来查就可以,和Linux的其实很像,以后运维的话,用的会多一些

    print(os.stat('file1.txt'))
    # os.stat_result(st_mode=33188, st_ino=8609917391, st_dev=16777222, st_nlink=1, st_uid=501, st_gid=20, st_size=75, st_atime=1545659976, st_mtime=1544331960, st_ctime=1545659928)
    
    # stat 结构:
    # st_mode: inode 保护模式
    # st_ino: inode 节点号。
    # st_dev: inode 驻留的设备。
    # st_nlink: inode 的链接数。
    # st_uid: 所有者的用户ID。
    # st_gid: 所有者的组ID。
    # st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。
    # st_atime: 上次访问的时间。
    # st_mtime: 最后一次修改的时间。
    # st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。

    33,

    print(os.sep) # 这个主要用来拼路径的,Python代码跨平台用的
    print(os.linesep) # 这个用得不太多
    print(os.pathsep) # : 这个指得是环境变量里面的路径分割
    print(os.name) # posix
    
    # 下面两个重点记忆一下,和exec和eval很像,这样可以拿到系统的一些东西来进行操作
    os.system('ls') #  在Python里面执行系统才能认识的命令,没有返回值
    ret = os.popen('ls').read() # 有返回值,必须执行read函数才可以
    print(ret)
    
    # 区分操作系统能识别的语言和Python解释器能认识的语言

    34,os.environ

    print(os.environ) # 系统的环境变量,是一个变量,不是一个函数
    # environ({'PATH': '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin', 'PYTHONPATH': "/Applications/PyCharm.app/Contents/helpers/pycharm_matplotlib_backend:/Users/guolixiao/PycharmProjects/lisa's_practise", 'SHELL': '/bin/bash', 'PYTHONIOENCODING': 'UTF-8', 'VERSIONER_PYTHON_PREFER_32_BIT': 'no', 'USER': 'guolixiao', 'TMPDIR': '/var/folders/jg/lnc0zl4d40nbc5yjftcjndk80000gn/T/', 'SSH_AUTH_SOCK': '/private/tmp/com.apple.launchd.NN6d5SxVDO/Listeners', 'XPC_FLAGS': '0x0', 'PYTHONUNBUFFERED': '1', 'VERSIONER_PYTHON_VERSION': '2.7', '__CF_USER_TEXT_ENCODING': '0x1F5:0x0:0x0', 'Apple_PubSub_Socket_Render': '/private/tmp/com.apple.launchd.lBXPBkTgVw/Render', 'LOGNAME': 'guolixiao', 'LC_CTYPE': 'en_US.UTF-8', 'XPC_SERVICE_NAME': 'com.jetbrains.pycharm.32068', 'PWD': "/Users/guolixiao/PycharmProjects/lisa's_practise/boys/part one", 'PYCHARM_HOSTED': '1', 'HOME': '/Users/guolixiao', 'PYCHARM_MATPLOTLIB_PORT': '52744', '__PYVENV_LAUNCHER__': '/usr/local/bin/python3.7'})

    35,os.path

    print(os.path.split(os.getcwd()))
    # ("/Users/guolixiao/PycharmProjects/lisa's_practise/boys", 'part one')
    
    print(os.path.join('c:','user','local'))  # 拼接一个目录,不关心是否存在
    # # c:/user/local
    
    print(os.path.join('c:admin','user','local'))  # 拼接一个目录,不关心是否存在
    # # c:admin/user/local
    
    print(os.path.getsize(os.getcwd()))
    # 2368 # 文件准确,文件夹不准确,想获取文件夹大小,循环文件加起来
    
    print(os.path.getsize(os.path.join(os.getcwd(),'file1.txt')))
    # 75 # 文件准确,文件夹不准确,这个是准确的

    36,盗用老师的笔记,老师所列出的所有方法在所有平台,Windows,Linux,和Mac都可以直接用的

    第一组:
    os.makedirs('dirname1/dirname2') 可生成多层递归目录 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
    第二组
    os.listdir(
    'dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 os.remove() 删除一个文件 os.rename("oldname","newname") 重命名文件/目录 os.stat('path/filename') 获取文件/目录信息 os.system("bash command") 运行shell命令,直接显示 os.popen("bash command).read() 运行shell命令,获取执行结果 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd os.path os.path.abspath(path) 返回path规范化的绝对路径 os.path.split(path) 将path分割成目录和文件名二元组返回 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 os.path.basename(path) 返回path最后的文件名。如何path以/或结尾,那么就会返回空值。即os.path.split(path)的第二个元素 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False os.path.isabs(path) 如果path是绝对路径,返回True os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 os.path.getatime(path) 返回path所指向的文件或者目录的最后访问时间 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间 os.path.getsize(path) 返回path的大小

    37,sys模块,可Python解释器交互的模块,参考老师博客 http://www.cnblogs.com/Eva-J/articles/7228075.html#_label6

    import sys
    
    sys.exit() # 命令控制程序退出,正常0,错误参数1,表现在程序里是感受不到的,都是退出
    
    print(sys.platform)
    # darwin ,这个地方Python解释器对于32位还是64位不是特别准确,返回操作系统平台名称
    
    print(sys.argv) # 命令行参数列表,这样看不出来,一个文件有好几种执行方式,可以用terminal执行,这个和cmd是一样的,只不过
    # 是pycharm给我们提供的cmd
    # guolixiaos-MacBook-Pro:part one guolixiao$ python3 19.5_sys模块.py  1  2 3 4 5
    # ['19.5_sys模块.py', '1', '2', '3', '4', '5']
    
    
    print(sys.version)
    # 返回Python解释器版本,准确的
    # 3.7.0 (v3.7.0:1bf9cc5093, Jun 26 2018, 23:26:24)
    # [Clang 6.0 (clang-600.0.57)]
    
    print(sys.path) # 从左到右找,与搜索路径有关
    # ["/Users/guolixiao/PycharmProjects/lisa's_practise/boys/part one", "/Users/guolixiao/PycharmProjects/lisa's_practise", '/Library/Frameworks/Python.framework/Versions/3.7/lib/python37.zip', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload', '/Users/guolixiao/Library/Python/3.7/lib/python/site-packages', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages', '/Applications/PyCharm.app/Contents/helpers/pycharm_matplotlib_backend']
    # 之所以安装了就能导入进来,就是因为sys.path记录了所有的路径
    sys.path.clear()
    # 如果列表清空了,全部导入不了了就

    38,脚本传参,terminal

    import sys
    # 执行脚本前,给脚本传一些参数,以后这种用的非常多,数据库也是的,后面会接触到的,必须用terminal执行,pycharm执行会报错,真正的脚本
    # 不是说必须装一个pycharm才可以用的,肯定是一执行就可以用的
    ret = sys.argv
    usrname = ret[1]  # 从第2个,索引为1才是真正的参数
    pwd = ret[2]
    
    if usrname == 'lisa' and pwd == 'lisa123':
        print('login successfully')
    else:
        sys.exit()
    
    print("you can use the calculator now")
  • 相关阅读:
    团队作业2-《需求规格说明书》
    团队作业 —— 团队选题
    自我介绍+软工五问
    团队作业5——测试与发布(Alpha版本)
    结对项目(与陈超国)
    个人项目wordcount
    自我介绍+软工5问
    个人项目(C语言)
    自我介绍+软工五问
    第三篇 Scrum冲刺博客
  • 原文地址:https://www.cnblogs.com/lisa-blog/p/10160322.html
Copyright © 2020-2023  润新知