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 \ns99sihf99 g9o3y')
print(ret)
# ['hsd739y8', 's99sihf99 g9o3']
ret = re.findall('.*\d+','hsd739y8kk \ns99sihf99 g9o3y',re.S)
print(ret) #注意加了flag换行也给匹配了就
# ['hsd739y8kk \ns99sihf99 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.****.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-9\u4e00-\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) #
print(p.y) #
print(p) # point(x=1, y=2) # 三维坐标
Point = namedtuple('point',['x','y','z']) # 还可以表示三维的,几个都可以,看自己需要几个
p = Point(1,2,1)
print(p.x) #
print(p.y) #
print(p.z)
print(p) # point(x=1, y=2, z=1) # 花色和数字
card = namedtuple('card',['suits','number'])
c1 = card('Hearts','')
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()) # # 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']) #
print(od['b']) #
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)
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']) #
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,'',[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")