Python常用模块 | (一)

 python模块分为3种:

  • 1.内置模块  python安装时自带的;
  • 2.扩展模块 比如上面提到的itchat 等等;
  • 3.自定义模块  自己写的模块;

一、re模块

  正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中提取出符合某个条件的子串等。

正则表达式在线测试工具:http://tool.chinaz.com/regex/主要是自己写,不要太依赖它

 

 

搜索和匹配的比较

  本章通篇会使用搜索和匹配两个术语。当严格讨论与字符串中模式相关的正则表达式时,我们会用术语“匹配”( matching),指的是术语“模式匹配”( pattern-matching)。在Python 术语中,主要有两种方法完成模式匹配:

  • “搜索”( searching):即在字符串任意部中搜索匹配的模式;
  • “匹配”( matching):是指判断一个字符串能否从起始处全部或者部分地匹配某个模式。

搜索通过 search()函数或方法来实现,而匹配通过调用 match()函数或方法实现。总之,当涉及模式时,全部使用术语“匹配”;我们按照 Python 如何完成模式匹配的方式来区分“搜索”和“匹配”。

 

可以使用正则表达式来识别有效的 Python 标识符,例如下面这些: [A-Za-z]\w+的含义是:第一个字符
是字母,也就是说要么 A~Z,要么 a~z,后面是至少一个(+)由字母数字组成的字符(\w)

 

 

1. re模块的基本使用

字符

元字符 匹配内容
匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线
\s 匹配任意的空白符
\d 匹配数字
\n 匹配一个换行符
\t 匹配一个制表符
\b 匹配一个单词的结尾,也就是指单词和空格间的位置
^ 匹配字符串的开始
$ 匹配字符串的结尾
\A 仅匹配字符串开头,同^
\Z 仅匹配字符串结尾,同$
\W 匹配非字母或数字或下划线
\D 匹配非数字
\S 匹配非空白符
a|b 匹配字符a或字符b
() 分组匹配,()里面的为一个整体,如果()后面跟的是特殊元字符如(adc)*   那么*控制的前导字符就是()里的整体内容,不再是前导一个字符
[...] 匹配字符组中的字符
[^...] 匹配除了字符组中字符的所有字符

\d与\D

  \d匹配任何十进制数,它相当于类[0-9],\d+如果需要匹配一位或者多位数的数字时用;\D匹配任何非数字字符,它相当于类[^0-9]

print(re.findall('\d','1234567890 summer *(_'))  # ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
print(re.findall('\D','1234567890 summer *(_'))  # [' ', 's', 'u', 'm', 'm', 'e', 'r', ' ', '*', '(', '_']
print(re.findall("\d+", "spring2summer134444autumn5winter"))  # ['2', '134444', '5']

\w与\W

  \w匹配包括下划线在内任何字母数字字符,它相当于类[a-zA-Z0-9_] ,注意包括下划线;\W匹配非任何字母数字字符包括下划线在内,它相当于类[^a-zA-Z0-9_]

print(re.findall('\w', 'hello!中国 123*() _'))    # ['h', 'e', 'l', 'l', 'o', '中', '国', '1', '2', '3', '_']
print(re.findall('\W', 'hello!中国 123*() _'))    # ['!', ' ', '*', '(', ')', ' ']

\s 与\S

  \s匹配任何空白字符,它相当于类[\t\n\r\f\v];\S匹配任何非空白字符,它相当于类[^\t\n\r\f\v]

print(re.findall('\s', 'hello!中国 123*(_ \t \n'))  # [' ', ' ', '\t', ' ', '\n']
print(re.findall('\S', 'hello!中国 123*(_ \t \n'))  # ['h', 'e', 'l', 'l', 'o', '!', '中', '国', '1', '2', '3', '*', '(', '_']

\A 与 ^
  字符串开始位置与匹配规则符合就匹配,否则不匹配。^元字符如果写到[]字符集里就是反取

print(re.findall('\Ahel','hello!中国 123*(_ \t \n'))  # ['hel']
print(re.findall('^hel','hello!中国 123*(_ \t \n'))  # ['hel']

\Z与 $

   字符串结束位置与匹配规则符合就匹配,否则不匹配

print(re.findall('666\Z','hello!中国 123* *-_-* \n666'))    # ['666']
print(re.findall('666$','hello!中国 123* *-_-* \n666'))    # ['666']

\n 与 \t

print(re.findall('\n','hello \n summer \t*-_-*\t \n666'))  # ['\n', '\n']
print(re.findall('\t','hello \n summer \t*-_-*\t \n666'))  # ['\t', '\t']

[^a-z]

  取反,匹配出除字母外的字符

print(re.findall("[^a-z]",'hello!中国 123* world\n666'))      # ['!', '中', '国', ' ', '1', '2', '3', '*', ' ', '\n', '6', '6', '6']
print(re.findall("[^a-z]+",'hello!中国 123* world\n666'))      # ['!中国 123* ', '\n666']
print(re.findall("[^a-z]*",'hello!中国 123* world\n666'))      # ['', '', '', '', '', '!中国 123* ', '', '', '', '', '', '\n666', '']

[]
  括号中可以放任意一个字符,一个中括号代表一个字符
  - 在[]中表示范围,如果想要匹配上- 那么这个-符号不能放在中间.
  ^ 在[]中表示取反的意思.

print(re.findall('a.b', 'a1b a3b aeb a*b arb a_b'))  # ['a1b', 'a3b', 'a4b', 'a*b', 'arb', 'a_b']
print(re.findall('a[abc]b', 'aab abb acb adb afb a_b'))  # ['aab', 'abb', 'acb']
print(re.findall('a[0-9]b', 'a1b a3b aeb a*b arb a_b'))  # ['a1b', 'a3b']
print(re.findall('a[a-z]b', 'a1b a3b aeb a*b arb a_b'))  # ['aeb', 'arb']
print(re.findall('a[a-zA-Z]b', 'aAb aWb aeb a*b arb a_b'))  # ['aAb', 'aWb', 'aeb', 'arb']
print(re.findall('a[0-9][0-9]b', 'a11b a12b a34b a*b arb a_b'))  # ['a11b', 'a12b', 'a34b']
print(re.findall('a[*-+]b','a-b a*b a+b a/b a6b'))      # ['a*b', 'a+b']
# - 在[]中表示范围,如果想要匹配上- 那么这个-符号不能放在中间.
print(re.findall('a[-*+]b','a-b a*b a+b a/b a6b'))      # ['a-b', 'a*b', 'a+b']
print(re.findall('a[^a-z]b', 'acb adb a3b a*b'))        # ['a3b', 'a*b']

量词:

量词 用法说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

.   匹配任意一个字符,除了换行符(re.DOTALL 这个参数可以匹配\n)。

print(re.findall('a.b', 'ab aab a*b a2b a喜欢b a\nb'))        # ['aab', 'a*b', 'a2b']
print(re.findall('a.b', 'ab aab a*b a2b a喜欢b a\nb',re.DOTALL))  # ['aab', 'a*b', 'a2b', 'a\nb']

?  匹配一个字符0次或1次。还有一个功能是可以防止贪婪匹配

print(re.findall('a?b', 'ab aab abb aaaab a喜欢b aba**b'))  # ['ab', 'ab', 'ab', 'b', 'ab', 'b', 'ab', 'b']

*   匹配0个或者多个左边字符表达式。 满足贪婪匹配

print(re.findall('a*b', 'ab aab aaab abbb'))  # ['ab', 'aab', 'aaab', 'ab', 'b', 'b']
print(re.findall('ab*', 'ab aab aaab abbbbb'))  # ['ab', 'a', 'ab', 'a', 'a', 'ab', 'abbbbb']

+  匹配1个或者多个左边字符表达式。 满足贪婪匹配

print(re.findall('a+b', 'ab aab aaab abbb')) # ['ab', 'aab', 'aaab', 'ab']

.*   贪婪匹配 从头到尾.

print(re.findall('a.*b', 'ab aab a*()b')) # ['ab aab a*()b']

.*?   只是针对.*这种贪婪匹配的模式进行一种限定:非贪婪匹配

print(re.findall('a.*?b', 'ab a1b a*()b, aaaaaab')) # ['ab', 'a1b', 'a*()b', 'aaaaaab']

贪婪模式的核心点就是尽可能多的匹配,而懒惰模式的核心点就是尽可能少的匹配

{}    范围。{m}匹配前一个字符m次,{m,n}匹配前一个字符m至n次,若省略n,则匹配m至无限次

print(re.findall('a{2,4}b', 'ab aab aaab aaaaabb'))  # ['aab', 'aaab']

()   分组:制定一个规则,将满足规则的结果匹配出来

print(re.findall('(.*?)_sun', 'spring_sun summer_sun autumn_sun winter_sun'))     # ['spring', ' summer', ' autumn', ' winter']
print(re.findall('href="(.*?)"','<a href="http://www.baidu.com">点击</a>'))       # ['http://www.baidu.com']

|   或,前后有一个符合就匹配

print(re.findall(r"你|好", "a4a4a你4aabc4a4dgg好dg4g654g"))                                # ['你', '好']
print(re.findall('aa|bb|cc', 'aa太阳bb月亮cc星星aa'))                                        # ['aa', 'bb', 'cc', 'aa']
print(re.findall('compan(y|ies)','Too many companies have gone bankrupt, and the next one is my company'))  # ['ies', 'y']
print(re.findall('compan(?:y|ies)','Too many companies have gone bankrupt, and the next one is my company')) # ['companies', 'company']

 分组() 中加入?: 表示将整体匹配出来而不只是()里面的内容。

 

2. re模块中常用功能函数

模式修正符

  • 所谓模式修正符,即可以在不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现一些匹配结果的调整等功能。

修饰符描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解

re.S

  它表示 “.” 的作用扩展到整个字符串,包括“\n”。

import re
a = '''aaahellospring summer
       autumn winterworldaaa
    '''
b = re.findall('hello(.*?)world', a)
c = re.findall('hello(.*?)world', a, re.S)
print(b)                    # []
print(c)                    # ['spring summer\n       autumn winter']

正则表达式中,“.”的作用是匹配除“\n”以外的任何字符,也就是说,它是在一行中进行匹配。这里的“行”是以“\n”进行区分的。a字符串有每行的末尾有一个“\n”,不过它不可见。如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始,不会跨行。而使用re.S参数以后,正则表达式会将这个字符串作为一个整体,将“\n”当做一个普通的字符加入到这个字符串中,在整体中进行匹配。

re.I

  不区分大小写

res = re.findall(r"A", "abc", re.I)
print(res)                              # ['a']

 re.M

  将所有行的尾字母输出(python3+已经无效)

s = '12 34\n56 78\n90'
print(re.findall(r'^/d+', s, re.M))              # 匹配位于行首的数字  # ['12', '56', '90']
print(re.findall(r'/A/d+', s, re.M))             # 匹配位于字符串开头的数字  # ['12']
print(re.findall(r'/d+$', s, re.M))              # 匹配位于行尾的数字  # ['34', '78', '90']
print(re.findall(r'/d+/Z', s, re.M))             # 匹配位于字符串尾的数字  # ['90']

注意:所有函数返回的最终结果都是列表的形式

(1) findall()

  全部找到返回一个列表,未匹配成功返回空列表.一旦匹配成功,再次匹配,是从前一次匹配成功后面一位开始的,也可以理解为匹配成功的字符串,不在参与下次匹配

import re

string = 'aspringasummerasautumnawinter'


# 无分组.如果没写匹配规则,就是空规则,返回的是一个比原始字符串多一位的,空字符串列表
print(re.findall('a', string))                                          # ['a', 'a', 'a', 'a', 'a']
print(re.findall("\d+\w\d+", "1a2b3c4d5"))                              # ['1a2', '3c4']
print(re.findall("", "1a2b3c4d"))                                       # ['', '', '', '', '', '', '', '', '']

# 有分组:只将匹配到的字符串里,组的部分放到列表里返回,相当于groups()方法
print(re.findall("a(\w+)",string ))                                     # ['springasummerasautumnawinter']

# 多个分组:只将匹配到的字符串里,组的部分放到一个元组中,最后将所有元组放到一个列表里返回,相当于在group()
print(re.findall("(a)(\w+)", string))                                   #[('a', 'springasummerasautumnawinter')]
print(re.findall("(a)(\w+)", 'aspring asummer asautumn awinter'))       #[('a', 'spring'), ('a', 'summer'), ('a', 'sautumn'), ('a', 'winter')]

# 分组中有分组:只将匹配到的字符串里,组的部分放到一个元组中,先将包含有组的组,看作一个整体也就是一个组,把这个整体组放入一个元组里,然后在把组里的组放入一个元组,最后将所有组放入一个列表返回
print(re.findall("(a)(\w+(e))", string))                                # [('a', 'springasummerasautumnawinte', 'e')]
print(re.findall("(a)(\w+(e))", 'aspring asummer asautumn awinter'))    # [('a', 'summe', 'e'), ('a', 'winte', 'e')]

# ?:在有分组的情况下findall()函数,不只拿分组里的字符串,拿所有匹配到的字符串,注意?:只用于不是返回正则对象的函数如findall()
print(re.findall("a(?:\w+)", string))                                   # ['aspringasummerasautumnawinter']
print(re.findall("a(?:\w+)", 'aspring asummer asautumn awinter'))       # ['aspring', 'asummer', 'asautumn', 'awinter']

 (2) search()

  search,浏览整个字符串,匹配第一个符合规则的字符串,未匹配成功返回None
  search(pattern, string, flags=0)
    pattern: 正则模型
    string : 要匹配的字符串
    falgs : 匹配模式

注:match和search一旦匹配成功,就是一个match object对象,而match object对象有以下方法:

  • group() 返回被 RE 匹配的字符串;
  • start() 返回匹配开始的位置;
  • end() 返回匹配结束的位置;
  • span() 返回一个元组包含匹配 (开始,结束) 的位置;

 

search 只是找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
print(re.search('summer', 'spring summer autumn winter'))           # <_sre.SRE_Match object; span=(7, 13), match='summer'>
print(re.search('summer', 'spring summer autumn winter').group())      # summer
print(re.search('spring|summer', 'spring summer autumn winte'))        # <_sre.SRE_Match object; span=(0, 6), match='spring'>
print(re.search('spring|summer', 'spring summer +autumn winter').group())    # spring,还是返回一个

r.group() 获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来
r.groups() 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分的结果
r.groupdict() 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果

import re
string = "spring summer autumn winter about also 18"

# 无分组
r = re.search("a\w+", string)
print(r.group())                    # autumn
print(r.groups())                   # ()
print(r.groupdict())                # {}


# 有分组
# 为何要有分组?提取匹配成功的指定内容(先匹配成功全部正则,再匹配成功的局部内容提取出来)
r = re.search("a(\w+).*(\d)", string)
print(r.group())                # autumn winter about also 18
print(r.groups())               # ('utumn', '8')
print(r.groupdict())            # {}


# 有两个分组定义了key
# ?P<>定义组里匹配内容的key(键),<>里面写key名称,值就是匹配到的内容
r = re.search("a(?P<n1>\w+).*(?P<n2>\d)", string)
print(r.group())                # autumn winter about also 18
print(r.groups())               # ('utumn', '8')
print(r.groupdict())            # {'n1': 'utumn', 'n2': '8'}

(3) match()
re.match(pattern, string[, flags=0])
从字符串开始处进行匹配,匹配成功返回一个对象,未匹配成功返回None。完全可以用search+^代替match  
注意:match()函数 与 search()函数基本是一样
的功能,不一样的就是match()匹配字符串开始位置的一个符合规则的字符串,search()是在字符串全局匹配第一个合规则的字符串
import re
string = 'spring summer autumn winter'

# 无分组
print(re.match('summer', string))  # None
print(re.match('spring', string))  # <_sre.SRE_Match object; span=(0, 6), match='spring'>
print(re.match('spring', string).group()) # spring

r = re.match("s\w+", string)
print(r.group())                    # spring
print(r.groups())                   # ()
print(r.groupdict())                # {}

# 有分组
r = re.match("s(\w+)", string)
print(r.group())                # spring
print(r.groups())               # ('pring',)
print(r.groupdict())            # {}

# 有两个分组定义了key
r = re.match("(?P<n1>s)(?P<n2>\w+)", string)
print(r.group())                # spring
print(r.groups())               # ('s', 'pring')
print(r.groupdict())            # {'n1': 's', 'n2': 'pring'}

(4) split()

  根据正则匹配分割字符串,返回分割后的一个列表

  split(pattern, string, maxsplit=0, flags=0)
    pattern: 正则模型
    string : 要匹配的字符串
    maxsplit:指定分割个数
    flags : 匹配模式
import re

# 按照一个字符将全部字符串进行分割
print(re.split("a", 'aspringasummeraautumnawinter'))  # ['', 'spring', 'summer', '', 'utumn', 'winter']
print(re.split('[ ::,;;,]','spring:summer:autumn,winter'))  # ['spring', 'summer', 'autumn', 'winter']

# 将匹配到的字符串作为分割标准进行分割
print(re.split("a\w+", 'spring asummer bautumn cwinter'))  # ['spring ', ' b', ' cwinter']

 (5) sub()

  替换匹配成功的指定位置字符串

  sub(pattern, repl, string, count=0, flags=0)
    pattern: 正则模型
    repl : 要替换的字符串
    string : 要匹配的字符串
    count : 指定匹配个数
    flags : 匹配模式
print(re.sub('spring', 'summer', 'spring是最好的季节,summer太热了,我还是喜欢spring'))   # summer是最好的季节,summer太热了,我还是喜欢summer
print(re.sub('spring', 'summer', 'spring是最好的季节,summer太热了,我还是喜欢spring',1))   # summer是最好的季节,summer太热了,我还是喜欢spring
l = ['1 2 ', '2   3', '  3 4']
print(eval(re.sub(r'\s*', '', str(l))))          # ['12', '23', '34']
print(re.sub(r'\s*', '', str(l)))                # ['12','23','34']

 

 

 

 

  

      其实这里的替换已经使用了分组的思想。

      上面一行的匹配模式print (\S*)中,括号括起的部分匹配到的内容就被识别为匹配组1。而下一行的替换模式中,$1就指代了匹配组1的内容。 所以在这个例子里,匹配组1匹配到的内容是“123”,而在替换时,“123”就替换了$1对应的位置。有时候,我们可能需要从一句话中提取多个分组,并且替换其中的全部,或者仅仅是部分几组。这个问题同样可以用正则表达式解决。

 

       现在,我们的问答系统需要回答这样一个问题:"曹丕的父亲是谁?"回答这个问题,要求我们把其中的“曹丕”和“父亲”提取出来(有时候也可以提取“谁”,用于限定答案的范围必须是一个人),然后就可以利用这两个条件在知识库中查找答案。 这样,这个问题就转化为用正则表达式提取其中的三个分组。下面是我为此写的一个正则表达式:

import re


quest = "曹丕的父亲是谁?"
template = re.compile(r"(\S[^的]*)的(\S[^是]*)是(\S[^?]*)?")
matches = re.search(template,quest)
if matches: 
    print(matches.group(0))                   # full match
    print(matches.group(1))                   # match group1
    print(matches.group(2))                   # match group2
    print(matches.group(3))                   # match group3

结果

曹丕的父亲是谁?
曹丕
父亲

 

而在回答时,我希望能够保持原句的语法,比如:

>>> answer("曹丕的父亲是谁?")
曹丕的父亲是曹操

这就意味着我们需要保留前两个分组,而把第三个分组用查找到的答案替换掉,假设已经查到答案,方法如下:

ans = "曹操"
re.sub(template,r"\1的\2是%s" % ans,quest)

曹丕的父亲是曹操

 

其中的\1,\2就表示第1、第2匹配组的内容(“曹丕”、“父亲”)。
问题词可以出现在不同位置,不过经过调整以后依然可以用正则表达式解决这问题,效果比如:

>>> answer("谁的父亲是曹操?")
曹彰的父亲是曹操
曹丕的父亲是曹操
曹植的父亲是曹操
曹昂的父亲是曹操

这是我实现的一个极简的基于知识库的问答系统的一部分,如果对其中的实现细节(包括正则表达式的适应性调整、知识图谱的查询SPARQL)感兴趣,可以在这里看到我更详细的jupyter notebook演示。

 

>>> import re


>>> content = 'abc124hello46goodbye67shit'
>>> list1 = re.findall(r'\d+', content)
>>> print(list1)
['124', '46', '67']



>>> mylist = list(map(int, list1))
>>> print(mylist)
[124, 46, 67]



>>> print(sum(mylist))
237


>>> print(re.sub(r'\d+[hg]', 'aaaaaaaaa', content))
abcaaaaaaaaaelloaaaaaaaaaoodbye67shit



>>> print(re.sub(r'\d+', 'aaaaaaaaa', content))
abcaaaaaaaaahelloaaaaaaaaagoodbyeaaaaaaaaashit

 

 

 

 

 

 

 

(6)subn()

  替换匹配成功的指定位置字符串,并且返回替换次数,可以用两个变量分别接受

  subn(pattern, repl, string, count=0, flags=0)
    pattern: 正则模型
    repl : 要替换的字符串
    string : 要匹配的字符串
    count : 指定匹配个数
    flags : 匹配模式
a, b = re.subn("spring", "summer", "spring summer autumn winter spring spring ")  
print(a)            # summer summer autumn winter summer summer
print(b)            # 3

(7)compile()

编译正则表达式模式,返回一个正则对象的模式。这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。)

re.compile(pattern[,flags=0])
  • pattern: 编译时用的表达式字符串。
  • flags: 编译标志位,用于修改正则表达式的匹配方式,如:re.I(不区分大小写)、re.S等。取值可以使用按位或运算符'|'表示同时生效,比如re.I | re.M。
obj=re.compile('\d{2}')
print(obj.search('12spring3456summer autumn winter').group())     # 12
print(obj.findall('12spring3456summer autumn winter'))            # ['12', '34', '56']
import re

# 将正则表达式编译成Pattern对象
pattern = re.compile(r'hello')
# 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
match = pattern.match('hello world!')

if match:
    # 使用Match获得分组信息
    print(match.group())                # hello

(8)finditer()

  返回一个存放匹配结果的迭代器

ret = re.finditer('\d', '1spring2summer3autumn4winter')
print(ret)                              # <callable_iterator object at 0x02C43270>
print(next(ret).group())                # 查看第一个结果  1
print(next(ret).group())                # 查看第二个结果  2
print([i.group() for i in ret])         # 查看剩余的结果 ['3', '4']

 

小结:

#返回pattern对象
re.compile(string[,flag])  

#以下为匹配所用函数
re.match(pattern, string[, flags])
re.search(pattern, string[, flags])
re.split(pattern, string[, maxsplit])
re.findall(pattern, string[, flags])
re.finditer(pattern, string[, flags])
re.sub(pattern, repl, string[, count])
re.subn(pattern, repl, string[, count])

 

re.match与re.search与re.findall的区别:

  • re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;

  • 而re.search匹配整个字符串,直到找到一个匹配。

import re

a=re.search('[\d]',"abc33").group()
print(a)

p=re.match('[\d]',"abc33")
print(p)

b=re.findall('[\d]',"abc33")
print(b)

'''
执行结果:
3
None
['3', '3']
'''

 

特殊分组用法表:只对正则函数返回对象的有用

(?P<name>) ?P<>定义组里匹配内容的key(键),<>里写key名称,值就是匹配到的内容 (?P<id>abc){2} abcabc
(?P=name) 引用别名为<name>的分组匹配到字符串 (?P<id>\d)abc(?P=id) 1abc15abc5
\<number> 引用编号为<number>的分组匹配到字符串 (\d)abc\1 1abc15abc5

注意:

(1) r原生字符

  将在python里有特殊意义的字符,如\b,转换成原生字符(就是去除它在python的特殊意义),不然会给正则表达式有冲突,为了避免这种冲突可以在规则前加原始字符r

(2) 正则表达式,返回类型为表达式对象的如:<_sre.SRE_Match object; span=(6, 7), match='a'>  返回对象的,需要用正则方法取字符串,方法有

group()        # 获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来,有参取匹配到的第几个如2
groups()       # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分的结果
groupdict()      # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果

(3) 匹配到的字符串里出现空字符。注意:正则匹配到空字符的情况,如果规则里只有一个组,而组后面是*就表示组里的内容可以是0个或者多过,这样组里就有了两个意思,一个意思是匹配组里的内容,二个意思是匹配组里0内容(即是空白)所以尽量避免用*否则会有可能匹配出空字符串

(4) ?:在有分组的情况下findall()函数,不只拿分组里的字符串,拿所有匹配到的字符串,注意?:只用于不是返回正则对象的函数如findall()

小练习

import re

print(re.findall('\d+',"1-2*(60+(-40.35/5)-(-4*3))"))                        # ['1', '2', '60', '40', '35', '5', '4', '3']
# 匹配所有的数字(包含小数)
print(re.findall(r'\d+\.?\d*|\d+\.?\d+', "1-2*(60+(-40.35/5)-(-4*3))+(0.34)"))      # ['1', '2', '60', '40.35', '5', '4', '3', '0.34']
# 匹配所有的数字(包含小数包含负号)
print(re.findall(r'-?\d+\.?\d*|\d+\.?\d+', "1-2*(60+(-40.35/5)-(-4*3))+(0.34)-(-0.34)"))    # ['1', '-2', '60', '-40.35', '5', '-4', '3']

# 可以简写
# 匹配所有的数字(包含小数)
print(re.findall(r'\d+\.?(?:\d*|\d+)', "1-2*(60+(-40.35/5)-(-4*3))+(0.34)"))      # ['1', '2', '60', '40.35', '5', '4', '3', '0.34']
# 匹配所有的数字(包含小数包含负号)
print(re.findall(r'-?\d+\.?(?:\d*|\d+)', "1-2*(60+(-40.35/5)-(-4*3))+(0.34)-(-0.34)"))    # ['1', '-2', '60', '-40.35', '5', '-4', '3']

 

匹配一段你文本中的每行的时间字符串 这样的形式:'1997-07-01'

s = '''
香港回归时间1997-07-01
澳门回归时间1999-12-20
1997-07-01 1999-12-20
1997-07-01:1999-12-20
1997-07-01;1999-12-20
'''
print(re.findall('\d{4}-\d{2}-\d{2}', s))        # ['1997-07-01', '1999-12-20', '1997-07-01', '1999-12-20', '1997-07-01', '1999-12-20', '1997-07-01', '1999-12-20']

 

1、匹配电话号码

p = re.compile(r'\d{3}-\d{6}')
print(p.findall('010-628888'))

 

2、匹配IP

re.search(r"(([01]?\d?\d|2[0-4]\d|25[0-5])\.){3}([01]?\d?\d|2[0-4]\d|25[0-5]\.)","192.168.1.1")

 

 

二、时间模块

1. time模块

和时间有关系的我们就要用到时间模块。

在使用模块之前,应该首先导入这个模块。

import time

常用方法

1.time.sleep(secs)        # (线程)推迟指定的时间运行。单位为秒。此语法中第一个 time 表示 time 模块
2.time.time()          # 获取当前时间戳。计算执行代码的时间 time.time();让程序停在这里一段时间 sleep

记录时间的格式:

  • 时间戳        最接近计算机的时间给机器看的  
  • 格式化的时间     给人看的   
  • 元组                计算用户,最接近 python

 

表示时间的三种方式:

1时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。1970年1月1 是英国时间
2格式化的时间字符串(Format String) ‘1999-12-06’

python中时间日期格式化符号:
  %y 两位数的年份表示(00-99)
  %Y 四位数的年份表示(000-9999)
  %m 月份(01-12)

  %H 24小时制小时数(0-23)
  %M 分钟数(00=59)
  %S 秒(00-59)

  %a 本地简化星期名称
  %b 本地简化的月份名称
  %d 月内中的一天(0-31)

 

3元组(struct_time) struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等)

 

import time  # 导入时间模块

# 时间戳
time.time()  # 加print后,1569239423.635975

# 时间字符串
time.strftime("%Y-%m-%d %X") # 2019-09-23 19:50:55
time.strftime("%Y-%m-%d %H-%M-%S")   # 2019-09-23 19-51-13 标准时间

# 时间元组: localtime将一个时间戳转换为当前时区的struct_time
print(time.localtime())  # time.struct_time(tm_year=2019, tm_mon=9, tm_mday=23, tm_hour=19, tm_min=51, tm_sec=13, tm_wday=0, tm_yday=266, tm_isdst=0)

几种格式之间的转换

  str-format-time

  str-parse-time

  gmtime是把日期和时间转换为格林威治(GMT)时间的函数

 

 

import time

# 格式化时间 <---->  结构化时间
ft = time.strftime('%Y/%m/%d %H:%M:%S')    # 注意是大写的Y
print(ft)                                   # 2019/09/23 19:57:20
st = time.strptime(ft,'%Y/%m/%d %H:%M:%S')
print(st)                                   # time.struct_time(tm_year=2019, tm_mon=9, tm_mday=23, tm_hour=19, tm_min=57, tm_sec=20, tm_wday=0, tm_yday=266, tm_isdst=-1)

# 结构化时间 <---> 时间戳
import time
p = time.strptime('2015-8-8','%Y-%m-%d')
t = time.mktime(p)
print(t)        # 1438963200.0

t = time.time()
st = time.localtime(t)
print(st)# time.struct_time(tm_year=2019, tm_mon=9, tm_mday=23, tm_hour=20, tm_min=2, tm_sec=48, tm_wday=0, tm_yday=266, tm_isdst=0)

asctime是把时间换成ascii码。
ctime是把时间转换成字符串。char

 

asctime([t]) 函数
  该函数用于接收由 gmtime() 和 localtime() 函数返回的struct_time,并返回一个可读的形式为"Tue Dec 11 18:07:14 2008"(2008年12月11日 周二18时07分14秒)的24个字符的字符串。

  如果不传参数,直接返回当前时间的格式化串。

import time
time.asctime(time.localtime(1500000000))      # Fri Jul 14 10:40:00 2017
time.asctime()                                 #  Mon Sep 23 21:26:09 2019
print(time.strftime('%c'))                     #  Mon Sep 23 21:26:09 2019
print(time.ctime())                            #  Mon Sep 23 21:26:09 2019

ctime([ secs ])   

  用于把一个时间戳转换为time.asctime()的形式。如果未给参数  secs 或参数为  None,就会默认将  time.time() 作为参数。

print(time.ctime())                        # Mon Sep 23 21:30:31 2019
print(time.ctime(1500000000))             # Fri Jul 14 10:40:00 2017

计算时间差

import time

time1=time.mktime(time.strptime('2017-09-11 08:30:00','%Y-%m-%d %H:%M:%S'))
time2=time.mktime(time.strptime('2017-09-12 11:00:06','%Y-%m-%d %H:%M:%S'))
diff_time=time2-time1
print(time1,time2,diff_time)                                #1505089800.0    1505185206.0     95406.0
struct_time=time.gmtime(diff_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))

输出结果:

  1505089800.0 1505185206.0 95406.0
  过去了0年0月1天2小时30分钟6秒

# 详解
1.既然是比较2个时间的差值,就需要转化为时间戳,再做减法
当前的时间 时间戳;过去的时间 转成时间戳--->时间戳相减--->相减之后的结果转成结构化时间
结构化时间 - 1970.1.1 0:0:0  #英国时间

2.先来解释一下结构化时间,有2种方式,分别是
import time
struct_time = time.localtime(0)
ret = time.strftime('%Y-%m-%d %H:%M:%S',struct_time)
print(ret)  # 中国结构化时间
 
struct_time = time.gmtime(0)
ret = time.strftime('%Y-%m-%d %H:%M:%S',struct_time)
print(ret) # 英国结构化时间

执行输出:
1970-01-01 08:00:00
    1970-01-01 00:00:00
 
3.那么为什么要用英国时间呢?因为英国时间的时分秒都是0,没有数字比0更小了。但如果用中国时间,那么比8小的数字,就会出现负数,比如7:30。所以说,用英国时间,是最准确的。由于时分秒都是0,所以不需要相减
import time
def cal_time(fmt_time,fmt):
    now = time.time()
    time_before = time.mktime(time.strptime(fmt_time,fmt))
    sub_time = now - time_before
    struct_time = time.gmtime(sub_time)
    return '过去了%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)
 
ret = cal_time('2018-4-23 10:30:20','%Y-%m-%d %H:%M:%S')
print(ret)

执行输出:过去了0年0月2天4小时20分钟51秒
View Code

2. datetime模块

获取当前日期和时间

from datetime import datetime

now = datetime.now()
print(now)

 

获取指定日期和时间 

from datetime import datetime

dt = datetime(2020, 4, 19, 12, 20)             # 用指定日期时间创建datetime
print(dt)                                      

'''
2020-04-19 12:20:00
'''

 

datetime转换为timestamp

from datetime import datetime

dt = datetime(2020, 4, 19, 12, 20)      # 用指定日期时间创建datetime
ts = dt.timestamp()                     # 把datetime转换为timestamp
print(ts)

'''
1587270000.0
'''

 

timestamp转换为datetime

from datetime import datetime

ts = 1587270000.0
dt = datetime.fromtimestamp(ts)
print(dt)

'''
2020-04-19 12:20:00
'''

 

str转换为datetime

from datetime import datetime

cday = datetime.strptime('2020-6-1 18:19:59', '%Y-%m-%d %H:%M:%S')
print(cday)

'''
2020-06-01 18:19:59
'''

 

datetime转换为str

from datetime import datetime

now = datetime.now()
str = now.strftime('%a, %b %d %H:%M')
print(str)

'''
Sat, Jan 04 11:29
'''

 

datetime加减

from datetime import datetime, timedelta


future = datetime(2025, 5, 18, 16, 57, 3, 540997)
print(future)                                     

now = datetime.now()
print(now)                                         


time1 = now + timedelta(hours=10)                  
print(time1)


time2 = now - timedelta(days=1)
print(time2)

time3 = now + timedelta(days=2, hours=12)
print(time3)


'''
2020-01-04 11:36:15.958647
2025-05-18 16:57:03.540997
2020-01-04 21:36:15.958647
2020-01-03 11:36:15.958647
2020-01-06 23:36:15.958647
'''

 

import datetime

# 能调整的字段:weeks days hours minutes seconds
print(datetime.datetime.now() + datetime.timedelta(weeks=3))        # 三周后
print(datetime.datetime.now() + datetime.timedelta(weeks=-3))       # 三周前
print(datetime.datetime.now() + datetime.timedelta(days=-3))        # 三天前
print(datetime.datetime.now() + datetime.timedelta(days=3))         # 三天后
print(datetime.datetime.now() + datetime.timedelta(hours=5))        # 5小时后
print(datetime.datetime.now() + datetime.timedelta(hours=-5))       # 5小时前
print(datetime.datetime.now() + datetime.timedelta(minutes=-15))    # 15分钟前
print(datetime.datetime.now() + datetime.timedelta(minutes=15))     # 15分钟后
print(datetime.datetime.now() + datetime.timedelta(seconds=-70))    # 70秒前
print(datetime.datetime.now() + datetime.timedelta(seconds=70))     # 70秒后

current_time = datetime.datetime.now()                              # 现在的时间
print(current_time.replace(year=1977))                              # 直接调整到1977年
print(current_time.replace(month=1))                                # 直接调整到1月份
print(current_time.replace(year=1989,month=4,day=25))       

# 将时间戳转化成时间
print(datetime.date.fromtimestamp(1232132131))                      # 2009-01-17


# 输出结果
'''
2019-10-14 21:43:51.831900
2019-09-02 21:43:51.831900
2019-09-20 21:43:51.831900
2019-09-26 21:43:51.831900
2019-09-24 02:43:51.831900
2019-09-23 16:43:51.831900
2019-09-23 21:28:51.831900
2019-09-23 21:58:51.831900
2019-09-23 21:42:41.831900
2019-09-23 21:45:01.831900
1977-09-23 21:43:51.831900
2019-01-23 21:43:51.831900
1989-04-25 21:43:51.831900
2009-01-17
'''

 

datetime时区转换

Python标准库中的datetime模块提供了各种对日期和时间的处理方法。从本文的主题着手,首先利用datetime中提供的utcnow()方法获取到当前UTC时间:

>>> import datetime
>>> utc_now = datetime.datetime.utcnow()
>>> utc_now
datetime.datetime(2013, 12, 4, 15, 43, 21, 872000)

而此时其tzinfo为none:

>>> utc_now.tzinfo
>>>
 

当涉及国际时区时,时区转换则会经常使用到,比如来尝试将刚才的UTC时间转换为本地时间。对于Python3.3+版本,可以这么做:

>>> utc_now.replace(tzinfo=datetime.timezone.utc).astimezone(tz=None)
datetime.datetime(2013, 12, 4, 23, 43, 21, 872000, tzinfo=datetime.timezone(datetime.timedelta(0, 28800), '中国标准时间'))
 

不过该方法貌似并不方便,特别是在转换其他时区的时候。而对于更低版本的Python,则datetime.timezone可能压根就还没有。因此更便捷的方法是借助第三方包来实现 —— pyzt,下面就借助于它来实现时区转换:

>>> from pytz import timezone
>>> utc_now.tzinfo
>>> tzchina = timezone('Asia/Chongqing')
>>> tzchina
<DstTzInfo 'Asia/Chongqing' LMT+7:06:00 STD>
>>> utc = timezone('UTC')
>>> utc_now.replace(tzinfo=utc).astimezone(tzchina)
datetime.datetime(2013, 12, 4, 23, 43, 21, 872000, tzinfo=<DstTzInfo 'Asia/Chongqing' CST+8:00:00 STD>)
 

要转换为其他时区,则以此类推。

对于我自己来说,时区的转换主要出现在Django中,会经常需要将UTC时间转换为本地时间,而Django本身也已经为我们考虑到了这一点,因此实际操作起来更为方便:

>>> from django.utils.timezone import utc
>>> from django.utils.timezone import localtime
>>> now = datetime.datetime.utcnow().replace(tzinfo=utc)
>>> localtime(now)
datetime.datetime(2013, 12, 5, 0, 3, 13, 122000, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
 

在Python中转换时区的方法还有很多,通过探索也许还能找到更好的方法。

from pytz import timezone

def datetime_as_timezone(date_time, time_zone):
    tz = timezone(time_zone)
    utc = timezone('UTC')
    return date_time.replace(tzinfo=utc).astimezone(tz)


def datetime_to_str(date_time):
    date_time_tzone = datetime_as_timezone(date_time, 'Asia/Shanghai')
    return '{0:%Y-%m-%d %H:%M}'.format(date_time_tzone)

 

from datetime import datetime
from django.utils.timezone import utc


time1 = datetime.now()
time2 = datetime.utcnow()
time3 = datetime.utcnow().replace(tzinfo=utc)                        # 进行时区转换
print(time1)                    
print(time2)
print(time3)

'''
结果输出:
2019-11-19 12:27:13.752947
2019-11-19 04:27:13.752947
2019-11-19 04:27:13.752947+00:00
'''

 

三、random模块

random() 方法返回随机生成的一个实数。

主要有2个应用功能

  •   打印顺序,比如洗牌
  •   随机,比如彩票,验证码

使用前,首先导入模块

import random

1. random.random() 0到1的随机浮点数。

print(random.random())          # 0.7056803343481585

2. random.uniform(a,b) 用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。使用场景:发红包

print(random.uniform(1,3))        # 1.4427911142943668

3. random.randint() 随机整数。使用场景:验证码

print(random.randint(1,5))          # 1-5之间的整数   4    

4. random.randrange([start], stop[, step])  从指定范围内,按指定基数递增的集合中 获取一个随机数。注意:randrange顾头不顾尾

print(random.randrange(1,10,2))     # 1-10之间的奇数  3

5. random.choice() 随机选择一个。使用场景抽奖、验证码

random.choice([1,'23',[4,5]])

6. random.sample() 随机选择多个返回,返回的个数为函数的第二个参数。使用场景:抽多个中奖的

random.sample([1,'23',[4,5]],2)       # 列表元素任意2个组合  [[4, 5], '23']

取值几率是一样的,比如3个数,那么每个数的几率是1/3。sample,可以做抽奖。比如公司年终奖,三等奖10名,直接抽取10个就可以了。

7. random.shuffle() 打乱列表顺序。使用场景:洗牌

item=[1,3,5,7,9]
random.shuffle(item)             # 打乱次序

print(item)                         # [9, 3, 7, 5, 1]    #变了
print(random.shuffle(item))          # None
print(item)                         # [1, 9, 5, 7, 3]    #又变了

练习:生成随机验证码

1. 基础需求: 6位数字验证码 数字可以重复

1 数字,主要有0~9组成,使用random.randint生成
print(random.randint(0,9))        # 5

2 使用random模块取6个
import random
random_list = []
for i in range(6):    # 取6次
    random_num = random.randint(0,9)    #  大于等于0且小于等于9之间的整数
    random_list.append(random_num)      # 追加到列表
 
print(random_list)            # [5, 9, 5, 0, 5, 4]

3 将列表转换为字符串,使用join。注意,使用join,必须保证列表中的每一个元素为字符串类型
import random
random_list = []
for i in range(6):                        
    random_num = random.randint(0,9)          
    random_list.append(str(random_num))      # 将元素转换为str并追加到列表
 
ret = ''.join(random_list)
print(ret)                # 615411

import random
def code(num):
    ret = ''                        # 定义空字符串
    for i in range(num):
        n = random.randint(0,9)     # 数字由0~9组成
        ret += str(n)               # 将数字转换为字符串,并拼接
    return ret
print(code(6))                      # 803296

2. 进阶需求: 字母+数字 4位验证码 数字字母都可以重复

1. 需要用到ascci码
capital = [chr(i) for i in range(65,91)]           #所有大写字母,因为range取不到最后一个字母,所以要+1
lowercase = [chr(i) for i in range(97,123)]      #所有小写字母
 
print(capital) # ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
print(lowercase) #['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

2. 将数字和字母组合,生成4位
import random
for i in range(4):          # 取4位
    lowercase = chr(random.randint(97,123))          # 小写字母
    capital = chr(random.randint(65,91))            # 大写字母
    number = str(random.randint(0,9))                # 数字
print(lowercase,capital,number)                    # w J 8
 
3. 将随机数添加到列表中,并转化为字符串
import random
code = []
for i in range(4):  # 取4位
    lowercase = chr(random.randint(97,123))      #小写字母
    capital = chr(random.randint(65,91))        #大写字母
    number = str(random.randint(0,9))          # 数字
    code.append(random.choice([lowercase,capital,number]))  # 有3个元素,几率为1/3
ret = ''.join(code)  # 列表转换为字符串
print(ret)          # 7JmY        

完整代码

import random

def v_code():
    code = ''

    for i in range(4):
        num=random.randint(0,9)
        alf=chr(random.randint(65,90))
        add=random.choice([num,alf])
        code="".join([code,str(add)])
    return code

print(v_code())              # NKI2

import random
def id_code(num):                   # num、大写字母、小写字母每一位被取到的概率相同
    ret = ''
    for i in range(num):
        number = str(random.randint(0,9))       # 所有数字
        alph_num = random.randint(97,122)       # a97 z122  所有小写字母
        alph_num2 = random.randint(65,90)       # A65 Z97   所有大写字母
        alph = chr(alph_num)          # 大写
        alph2 = chr(alph_num2)         # 小写
        choice = random.choice([number,alph,alph2])      # 数字,大写,小写。每种是1/3的几率
        ret += choice  # 组合字符串
    return ret
print(id_code(6))  # 取6位

3.额外一个需求,字母和数字,取50%的概率

import random
def id_code(num):   # num、大写字母、小写字母 每一位被取到的概率相同
    ret = ''
    for i in range(num):
        number = str(random.randint(0,9))    # 数字
        alph1 = chr(random.randint(97,122))   # 大写
        alph2 = chr(random.randint(65,90))   # 小写
        alph = random.choice([alph1, alph2])  # 大小写字母,取50%的概率
        choice = random.choice([number,alph])  # 数字和字母,取50%的概率
        ret += choice  # 组合字符串
    return ret

print(id_code(6))  # 取6位,m1367P

四、os模块

  os模块是与操作系统交互的一个接口

1. 当前执行的python文件,目录相关的工作路径

os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径

import os
print(os.getcwd())

os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd

os.chdir('E:\Python学习')      # 这里输入你要进入的文件夹路径
print(os.getcwd())          # 打印验证即可

os.curdir 返回当前目录: ('.')

os.pardir 获取当前目录的父目录字符串名:('..')

print(os.curdir)    #  .
print(os.pardir)    #  ..

2. 和文件夹相关的

os.listdir('dirname') 列出指定目录下的所有文件名和目录名(不包含子目录文件夹),包括隐藏文件,并以列表方式打印

print(os.listdir())                 # 默认是打印当前文件夹所有文件夹及文件
print(os.listdir('E:\Python'))           # 打印E盘python文件下的所有   ['example.ini', 'file1', 'file2', 'new2.ini', 'test.log', 'test.py', 'userinfo.log', '随机码.py']

os.walk(path)   遍历该目录下的所有文件以及子目录, 返回一个元组包含三个元素(当前目录,子级目录,当前目录下的所有文件)

import os

li1 = os.listdir(os.getcwd())
li2 =os.walk(os.getcwd())

print(li1)
print(li2)

for i in os.walk(os.getcwd()):
    print(i)
    
    
    
'''
['1.txt', '2.txt', '3.txt', '4.txt', 'fold_eng']
<generator object walk at 0x00000000026F8200>
('E:\\test', ['fold_eng'], ['1.txt', '2.txt', '3.txt', '4.txt'])
('E:\\test\\fold_eng', [], ['a.txt', 'b.txt', 'c.txt', 'd.txt'])
'''

os.makedirs('dirname1/dirname2')   可生成多层递归目录

 

os.makedirs(name, mode=0o777, exist_ok=False)
  • name:你想创建的目录名;
  • mode:要为目录设置的权限数字模式,默认的模式为 0o777 (八进制);
  • exist_ok是否在目录存在时触发异常。如果exist_ok为False(默认值),则在目标目录已存在的情况下触发FileExistsError异常;如果exist_ok为True,则在目标目录已存在的情况下不会触发FileExistsError异常。
print(os.makedirs('a\\b\c'))           # b前面2个\\,是因为\b有特殊意义,需要转义

os.removedirs('dirname1')  若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推

print(os.removedirs('a\\b\c'))            # None刚才上面创建的3个文件,通过这个命令就可以直接删除

注:makedirs()和removedirs()是一组相反的函数,一个创建,一个删除(针对多个层级文件操作)

os.mkdir('dirname')  生成单级目录;相当于shell中mkdir dirname

print(os.mkdir('a'))                 # 创建一个名字为 a 的文件夹 

os.rmdir('dirname')  删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname

print(os.rmdir('a'))                 # 删除一个名为 a 的文件夹

注:mkdir()和remove()是一组相反的函数,一个创建一个删除(针对单个层级文件操作)

3. 和文件相关的

os.remove()  删除一个文件

print(os.remove())

os.rename("oldname","newname")  重命名文件/目录

os.rename("oldname","newname") 

os.stat('path/filename') 获取文件/目录信息

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)是创建时间(详细信息参见平台的文档)。=

print(os.stat('E:\Python'))   #打印结果:os.stat_result(st_mode=16895, st_ino=3096224743818679, st_dev=1789307272, st_nlink=1, st_uid=0, st_gid=0, st_size=4096, st_atime=1531755221,st_mtime=1531755221, st_ctime=1531628662)

4. 和操作系统差异相关

os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"

print(os.sep)      # 我在Windows上的pycharm运行结果:\

os.linesep   输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"

os.pathsep 输出用于分割文件路径的字符串 win下为; , Linux下为:

os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'

5. 和执行系统命名相关的

os.system("bash command")  运行shell命令,直接显示

os.system('dir')
# 打印结果: ''' 根据电脑内文件不同,打印略有不同 ������ C �еľ��� ϵͳ ������к��� 402B-B22D C:\Users\Administrator\Desktop\temp ��Ŀ¼ 2019/09/23 ��һ ���� 06:11 <DIR> . 2019/09/23 ��һ ���� 06:11 <DIR> .. 2019/09/08 ���� ���� 12:13 2,018 IP��.py 2019/09/18 ���� ���� 10:33 2 NCBI_URL.csv 2019/09/23 ��һ ���� 06:11 5,822 test.py 2019/09/08 ���� ���� 09:39 2,081 test2.py 2019/09/09 ��һ ���� 09:43 3,283 YunCode.py 2019/09/09 ��һ ���� 08:35 1,673 �����.py 6 ���ļ� 14,879 �ֽ� 2 ��Ŀ¼ 51,084,402,688 �����ֽ�

os.popen("bash command).read()  运行shell命令,获取执行结果

print(os.popen("dir").read())

# 打印结果:
'''
 驱动器 C 中的卷是 系统
 卷的序列号是 402B-B22D

 C:\Users\Administrator\Desktop\temp 的目录

2019/09/23 周一  下午 06:13    <DIR>          .
2019/09/23 周一  下午 06:13    <DIR>          ..
2019/09/08 周日  下午 12:13             2,018 IP池.py
2019/09/18 周三  下午 10:33                 2 NCBI_URL.csv
2019/09/23 周一  下午 06:13             5,835 test.py
2019/09/08 周日  下午 09:39             2,081 test2.py
2019/09/09 周一  上午 09:43             3,283 YunCode.py
2019/09/09 周一  上午 08:35             1,673 代理池.py
               6 个文件         14,892 字节
               2 个目录 51,083,599,872 可用字节
'''

 

samfile=os.popen("samtools view  {bamfile}".format(bamfile=bamfile)).read()

 

6.和环境变量相关的

(1) os.environ 获取所有系统环境变量

print(os.environ)

打印结果:environ({'ALLUSERSPROFILE': 'C:\\ProgramData', 'APPDATA': 'C:\\Users\\Administrator\\AppData\\Roaming', 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', 'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', 'COMPUTERNAME': 'SC-201805221553', 'COMSPEC': 'C:\\WINDOWS\\system32\\cmd.exe', 'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData', 'FPS_BROWSER_APP_PROFILE_STRING': 'Internet Explorer', 'FPS_BROWSER_USER_PROFILE_STRING': 'Default', 'HOMEDRIVE': 'C:', 'HOMEPATH': '\\Users\\Administrator', 'LOCALAPPDATA': 'C:\\Users\\Administrator\\AppData\\Local', 'LOGONSERVER': '\\\\SC-201805221553', 'NUMBER_OF_PROCESSORS': '12', 'ONEDRIVE': 'C:\\Users\\Administrator\\OneDrive', 'OS': 'Windows_NT', 'PATH': 'C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C:\\WINDOWS\\System32\\OpenSSH\\;F:\\software\\anzhuangbao\\python\\python.exe;F:\\software\\anzhuangbao\\python\\Scripts;;F:\\software\\anzhuangbao\\python3.7\\Scripts\\;F:\\software\\anzhuangbao\\python3.7\\;F:\\software\\anzhuangbao\\pycharm\\PyCharm 2019.1.3\\bin;;F:\\software\\anzhuangbao\\python3.7\\lib\\site-packages\\pywin32_system32', 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', 'PROCESSOR_ARCHITECTURE': 'AMD64', 'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 158 Stepping 10, GenuineIntel', 'PROCESSOR_LEVEL': '6', 'PROCESSOR_REVISION': '9e0a', 'PROGRAMDATA': 'C:\\ProgramData', 'PROGRAMFILES': 'C:\\Program Files', 'PROGRAMFILES(X86)': 'C:\\Program Files (x86)', 'PROGRAMW6432': 'C:\\Program Files', 'PSMODULEPATH': 'C:\\Program Files\\WindowsPowerShell\\Modules;C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules', 'PUBLIC': 'C:\\Users\\Public', 'PYCHARM': 'F:\\software\\anzhuangbao\\pycharm\\PyCharm 2019.1.3\\bin;', 'PYCHARM_DISPLAY_PORT': '58177', 'PYCHARM_HOSTED': '1', 'PYTHONIOENCODING': 'UTF-8', 'PYTHONPATH': 'C:\\Users\\Administrator\\maitian;F:\\software\\anzhuangbao\\pycharm\\PyCharm 2019.1.3\\helpers\\pycharm_matplotlib_backend;F:\\software\\anzhuangbao\\pycharm\\PyCharm 2019.1.3\\helpers\\pycharm_display', 'PYTHONUNBUFFERED': '1', 'SESSIONNAME': 'Console', 'SYSTEMDRIVE': 'C:', 'SYSTEMROOT': 'C:\\WINDOWS', 'TEMP': 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp', 'TMP': 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp', 'USERDOMAIN': 'SC-201805221553', 'USERDOMAIN_ROAMINGPROFILE': 'SC-201805221553', 'USERNAME': 'Administrator', 'USERPROFILE': 'C:\\Users\\Administrator', 'WINDIR': 'C:\\WINDOWS'})

(2)获得某个环境变量,其实就是从字典里面取某一个值

  获取环境变量方法1

>>> os.environ.get('PWD')
'/share/nas1/dengdj/project/X022/analysis/outdir2/01.align'

>>> os.environ['PWD'] '/share/nas1/dengdj/project/X022/analysis/outdir2/01.align'

  获取环境变量方法2(推荐使用这个方法)

>>> os.getenv('PWD')
'/share/nas1/dengdj/project/X022/analysis/outdir2/01.align'

(3)设置环境变量

>>> os.environ.setdefault('zzzzzz', "haha")
'haha'

(4)修改环境变量

os.environ["zzzzzz"] = "lalalala"

(5)删除环境变量

del os.environ['zzzzzz']

删除和smrtlink有关的环境变量:

def deal_with_environment():
    for key,value in os.environ.items():
        new_value = ""
        for v in value.split(":"):
            if "smrtlink" not in v:
                new_value += "{}:".format(v)
                os.environ[key] = new_value.strip(":")

 

7.path系列,和路径相关

os.path.abspath(path) 返回path规范化的绝对路径

import os
print(os.path.abspath('test.log'))    # E:\python_script\day26\test.log

os.path.split(path) 将path分割成目录和文件名二元组返回

print(os.path.split("C:\\Users\Administrator\maitian\\analysis\zufang.json"))       # ('C:\\Users\\Administrator\\maitian\\analysis', 'zufang.json')

os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略

print(os.path.join("C:\\Users\Administrator\maitian\\analysis","zufang.json"))       # C:\Users\Administrator\maitian\analysis\zufang.json

os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素

print(os.path.dirname("C:\\Users\Administrator\maitian\\analysis\zufang.json"))       # C:\Users\Administrator\maitian\analysis

os.path.basename(path) 返回path最后的文件名。即os.path.split(path)的第二个元素。如果path以/或\结尾,那么就会返回空值。

print(os.path.basename("C:\\Users\Administrator\maitian\\analysis\zufang.json"))       # zufang.json                      

os.path.exists(path)  文件或文件夹是否存在。如果path存在,返回True;如果path不存在,返回False

print(os.path.exists("C:\\Users\Administrator\maitian\\analysis\zufang.json"))       # True

os.path.isabs(path)  如果path是绝对路径,返回True

print(os.path.isabs("C:\\Users\Administrator\maitian\\analysis\zufang.json"))       # True
print(os.path.isabs("zufang.json"))       # False

os.path.isfile(path)  如果path是一个存在的文件,返回True。否则返回False。要使用绝对路径

print(os.path.isfile("C:\\Users\Administrator\maitian\\analysis\zufang.json"))       # True
print(os.path.isfile("zufang.json"))       # False

 

os.path.islink()

 

os.path.isdir(path)  如果path是一个存在的目录,则返回True。否则返回False

print(os.path.isdir("C:\\Users\Administrator\maitian\\analysis"))       # True

os.path.getatime(path)  返回path所指向的文件或者目录的最后访问时间

print(os.path.getatime("C:\\Users\Administrator\maitian\\analysis"))             # 1569217728.9961362

os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间

print(os.path.getmtime("C:\\Users\Administrator\maitian\\analysis\zufang.json"))       # 1529306814.0

 os.path.getctime(path):文件或文件夹的创建时间,从新纪元到访问时的秒数。

print(os.path.getctime("C:\\Users\Administrator\maitian\\analysis\zufang.json"))       # 1529306814.0

os.path.getsize(path) 文件或文件夹的大小,若是文件夹返回0统计文件夹小大,是不准的

print(os.path.getsize("C:\\Users\Administrator\maitian\\analysis\zufang.json"))       # 155267

 

获取文件夹大小,即遍历文件夹,将所有文件大小加和。遍历文件夹使用os.walk函数

  os.walk()可以得到一个三元tupple(dirpath, dirnames, filenames),

  1、第一个为起始路径,

  2、第二个为起始路径下的文件夹,

  3、第三个是起始路径下的文件。

  其中dirpath是一个string,代表目录的路径,dirnames是一个list,包含了dirpath下所有子目录的名字。filenames是一个list,包含了非目录文件的名字。这些名字不包含路径信息,如果需要得到全路径,需要使用os.path.join(dirpath, name).

import os
from os.path import join, getsize


def getdirsize(dir):
    size = 0
    for root, dirs, files in os.walk(dir):
        size += sum([getsize(join(root, name)) for name in files])
    return size


if __name__ == '__main__':
    filesize = getdirsize('E:\chengd')
    print('There are %.3f' % (filesize / 1024 / 1024 ), 'Mbytes in E:\\chengd')

执行结果:
There are 4747.763 Mbytes in E:\chengd

os.path.splitext(“文件路径”)    分离文件名与扩展名;默认返回(fname,fextension)元组,可做分片操作

import os

path_01='E:\STH\Foobar2000\install.log'
path_02='E:\STH\Foobar2000'
res_01=os.path.splitext(path_01)
res_02=os.path.splitext(path_02)
print(res_01)
print(res_02)

'''
('E:\\STH\\Foobar2000\\install', '.log')
('E:\\STH\\Foobar2000', '')
'''

os.path.splitext(“文件路径”) 和os.path.split()的比较。

import os

# os.path.join() 将分离的部分合成一个整体
filename = os.path.join('/home/ubuntu/python_coding', 'split_func')
print(filename)                 # /home/ubuntu/python_coding/split_func

# os.path.splitext()将文件名和扩展名分开
fname, fename = os.path.splitext('/home/ubuntu/python_coding/split_func/split_function.py')
print('fname is:', fname)       # fname is:/home/ubuntu/python_coding/split_func/split_function
print('fename is:', fename)     # fename is:.py

# os.path.split()返回文件的路径和文件名
dirname, filename = os.path.split('/home/ubuntu/python_coding/split_func/split_function.py')
print(dirname)                  # /home/ubuntu/python_coding/split_func
print(filename)                 # split_function.py

 

os.path.abspath和os.path.realpath区别

(1)os.path.abspath()返回一个目录的绝对路径 Return an absolute path.

>>> os.path.abspath("/etc/sysconfig/selinux")
'/etc/sysconfig/selinux'

>>> os.getcwd()
'/root'

>>> os.path.abspath("python_modu")
'/root/python_modu'


2.os.path.realpath()返回指定文件的标准路径,而非软链接所在的路径 Return the canonical path of the specified filename, eliminating any symbolic links encountered in the path.

 

>>> os.path.realpath("/etc/sysconfig/selinux")
'/etc/selinux/config'

>>> os.path.realpath("/usr/bin/python") '/usr/bin/python2.7'

 

 

 

参考链接:

https://www.runoob.com/python/os-file-methods.html

https://www.runoob.com/python/python-os-path.html

五、sys模块

  sys是system的缩写,用来获取操作系统和编译器的一些配置,设置及操作。sys模块是与python解释器交互的一个接口。

os模块和sys模块作用区别

  • os模块  操作系统打交道的
  • sys模块 python解释器打交道的

1. sys.argv

可以用sys.argv获取当前正在执行的命令行参数的参数列表(list)

变量解释:
  sys.argv[0]当前程序名
  sys.argv[1]第一个参数
  sys.argv[2]第二个参数
  ...

比如登录程序,可以通过传参的方式,验证。test.py文件内容如下:

import sys

if sys.argv[1] == 'summer' and sys.argv[2] == '123456':
    print(sys.argv)        # 列表 列表的第一项是当前文件所在的路径
else:
    sys.exit()

 典型用法:执行一个程序debug直接执行

   假如输入一个值,结果不是自己想要的这个时候,就需要debug一下。test.py代码如下:

import logging

num = int(input('>>>'))
a = num * 100
b = a - 10
c = b + 5
print(c)

首先想到的就是用pycharm的debug功能但是线上程序代码,不能使用Pycharm每一句加print ? 这样是不行的,影响程序使用,用户会察觉的使用logging,并使用level开关

import sys
import logging
inp = sys.argv[1].upper() if len(sys.argv)>1 else 'WARNING'         # 日志级别
logging.basicConfig(level=getattr(logging,inp))                        # DEBUG
num = int(input('请输入一个数字:'))
logging.debug(num)
a = num * 100
logging.debug(a)
b = a - 10
logging.debug(b)
c = b + 5
print(c)

进阶版,格式化输出每一个步骤

import sys
import logging

lev = sys.argv[1].upper() if len(sys.argv) > 1 else 'WARNING'
logging.basicConfig(level=getattr(logging, lev))
num = int(input('请输入一个数字:').strip())
logging.debug(num)
a = num * 100
logging.debug('{}*100={}'.format(num, a))
b = a - 10
logging.debug('{}-10={}'.format(a, b))
c = b + 5
logging.debug('{}+5={}'.format(b, c))
print(c)

 

2. sys.path

返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值。

如果在一个python文件里,print(sys.path)返回内容如下:

  • 当前路径
  • pycharm路径
  • python路径

比如就是我们在python源文件中import引入模块的时候就会在sys.path的目录中查找相应的模块,如果在这里面的目录中没有找到你要倒入的模块则会报错。

返回值是一个list则我们如果想倒入一个自定义模块下面的的包或者是模块则可以使用listappend方法在PYTHONPATH环境变量中增加相应的路径。 sys.path[0]表示的是当前脚本运行目录。

import sys
print(sys.path) # 结果输出 ''' ['C:\\Users\\Administrator\\Desktop\\temp', 'C:\\Users\\Administrator\\Desktop\\temp', 'F:\\software\\anzhuangbao\\pycharm\\PyCharm 2019.1.3\\helpers\\pycharm_display', 'F:\\software\\anzhuangbao\\python3.7\\python37.zip', 'F:\\software\\anzhuangbao\\python3.7\\DLLs', 'F:\\software\\anzhuangbao\\python3.7\\lib', 'F:\\software\\anzhuangbao\\python3.7', 'F:\\software\\anzhuangbao\\python3.7\\lib\\site-packages', 'F:\\software\\anzhuangbao\\python3.7\\lib\\site-packages\\win32', 'F:\\software\\anzhuangbao\\python3.7\\lib\\site-packages\\win32\\lib', 'F:\\software\\anzhuangbao\\python3.7\\lib\\site-packages\\Pythonwin', 'F:\\software\\anzhuangbao\\pycharm\\PyCharm 2019.1.3\\helpers\\pycharm_matplotlib_backend'] '''

 

为什么Import的时候,能找到对应的文件呢?

程序在运行起来的时候启动解释器 加载一些基础的内容 内置函数 内置模块 -->内存里sys.path把系统的路径加进去了,所以import的时候,能搜索到。

我们在python源文件中import引入模块的时候就会在sys.path的目录中查找相应的模块,如果在这里面的目录中没有找到你要倒入的模块则会报错。

 

如果想导入一个自定义模块下面的的包或者是模块则可以使用listappend方法在PYTHONPATH环境变量中增加相应的路径。

sys.path.append("文件路径")       # 直接指向搜寻路径

 

3、sys.modules  

功能:sys.modules是一个全局字典,该字典是python启动后就加载在内存中。每当程序员导入新的模块,sys.modules将自动记录该模块。当第二次再导入该模块时,python会直接到字典中查找,从而加快了程序运行的速度。它拥有字典所拥有的一切方法。

 

返回所有已经导入的模块列表。

返回系统导入的模块字段,key是模块名,value是模块。

import sys

print(sys.modules)
print('\n')
print(sys.modules.keys())
print('\n')
print(sys.modules.values())
print('\n')
print(sys.modules["os"])

'''
{'builtins': <module 'builtins' (built-in)>, 'sys': <module 'sys' (built-in)>, '_frozen_importlib': <module 'importlib._bootstrap' (frozen)>, '_imp': <module '_imp' (built-in)>, '_warnings': <module '_warnings' (built-in)>, '_thread': <module '_thread' (built-in)>, '_weakref': <module '_weakref' (built-in)>, '_frozen_importlib_external': <module 'importlib._bootstrap_external' (frozen)>, '_io': <module 'io' (built-in)>, 'marshal': <module 'marshal' (built-in)>, 'nt': <module 'nt' (built-in)>, 'winreg': <module 'winreg' (built-in)>, 'zipimport': <module 'zipimport' (built-in)>, 'encodings': <module 'encodings' from 'D:\\anzhuangbao\\python\\lib\\encodings\\__init__.py'>, 'codecs': <module 'codecs' from 'D:\\anzhuangbao\\python\\lib\\codecs.py'>, '_codecs': <module '_codecs' (built-in)>, 'encodings.aliases': <module 'encodings.aliases' from 'D:\\anzhuangbao\\python\\lib\\encodings\\aliases.py'>, 'encodings.utf_8': <module 'encodings.utf_8' from 'D:\\anzhuangbao\\python\\lib\\encodings\\utf_8.py'>, '_signal': <module '_signal' (built-in)>, '__main__': <module '__main__' from 'C:/Users/Administrator/Desktop/temp/test 03.py'>, 'encodings.latin_1': <module 'encodings.latin_1' from 'D:\\anzhuangbao\\python\\lib\\encodings\\latin_1.py'>, 'io': <module 'io' from 'D:\\anzhuangbao\\python\\lib\\io.py'>, 'abc': <module 'abc' from 'D:\\anzhuangbao\\python\\lib\\abc.py'>, '_weakrefset': <module '_weakrefset' from 'D:\\anzhuangbao\\python\\lib\\_weakrefset.py'>, 'site': <module 'site' from 'D:\\anzhuangbao\\python\\lib\\site.py'>, 'os': <module 'os' from 'D:\\anzhuangbao\\python\\lib\\os.py'>, 'errno': <module 'errno' (built-in)>, 'stat': <module 'stat' from 'D:\\anzhuangbao\\python\\lib\\stat.py'>, '_stat': <module '_stat' (built-in)>, 'ntpath': <module 'ntpath' from 'D:\\anzhuangbao\\python\\lib\\ntpath.py'>, 'genericpath': <module 'genericpath' from 'D:\\anzhuangbao\\python\\lib\\genericpath.py'>, 'os.path': <module 'ntpath' from 'D:\\anzhuangbao\\python\\lib\\ntpath.py'>, '_collections_abc': <module '_collections_abc' from 'D:\\anzhuangbao\\python\\lib\\_collections_abc.py'>, '_sitebuiltins': <module '_sitebuiltins' from 'D:\\anzhuangbao\\python\\lib\\_sitebuiltins.py'>, 'sysconfig': <module 'sysconfig' from 'D:\\anzhuangbao\\python\\lib\\sysconfig.py'>, '_bootlocale': <module '_bootlocale' from 'D:\\anzhuangbao\\python\\lib\\_bootlocale.py'>, '_locale': <module '_locale' (built-in)>, 'encodings.gbk': <module 'encodings.gbk' from 'D:\\anzhuangbao\\python\\lib\\encodings\\gbk.py'>, '_codecs_cn': <module '_codecs_cn' (built-in)>, '_multibytecodec': <module '_multibytecodec' (built-in)>, 'types': <module 'types' from 'D:\\anzhuangbao\\python\\lib\\types.py'>, 'functools': <module 'functools' from 'D:\\anzhuangbao\\python\\lib\\functools.py'>, '_functools': <module '_functools' (built-in)>, 'collections': <module 'collections' from 'D:\\anzhuangbao\\python\\lib\\collections\\__init__.py'>, 'operator': <module 'operator' from 'D:\\anzhuangbao\\python\\lib\\operator.py'>, '_operator': <module '_operator' (built-in)>, 'keyword': <module 'keyword' from 'D:\\anzhuangbao\\python\\lib\\keyword.py'>, 'heapq': <module 'heapq' from 'D:\\anzhuangbao\\python\\lib\\heapq.py'>, '_heapq': <module '_heapq' (built-in)>, 'itertools': <module 'itertools' (built-in)>, 'reprlib': <module 'reprlib' from 'D:\\anzhuangbao\\python\\lib\\reprlib.py'>, '_collections': <module '_collections' (built-in)>, 'weakref': <module 'weakref' from 'D:\\anzhuangbao\\python\\lib\\weakref.py'>, 'collections.abc': <module 'collections.abc' from 'D:\\anzhuangbao\\python\\lib\\collections\\abc.py'>, 'importlib': <module 'importlib' from 'D:\\anzhuangbao\\python\\lib\\importlib\\__init__.py'>, 'importlib._bootstrap': <module 'importlib._bootstrap' (frozen)>, 'importlib._bootstrap_external': <module 'importlib._bootstrap_external' (frozen)>, 'warnings': <module 'warnings' from 'D:\\anzhuangbao\\python\\lib\\warnings.py'>, 'importlib.util': <module 'importlib.util' from 'D:\\anzhuangbao\\python\\lib\\importlib\\util.py'>, 'importlib.abc': <module 'importlib.abc' from 'D:\\anzhuangbao\\python\\lib\\importlib\\abc.py'>, 'importlib.machinery': <module 'importlib.machinery' from 'D:\\anzhuangbao\\python\\lib\\importlib\\machinery.py'>, 'contextlib': <module 'contextlib' from 'D:\\anzhuangbao\\python\\lib\\contextlib.py'>, 'mpl_toolkits': <module 'mpl_toolkits' (namespace)>, 'ruamel': <module 'ruamel' (namespace)>, 'zope': <module 'zope' (namespace)>, 'sitecustomize': <module 'sitecustomize' from 'D:\\anzhuangbao\\pyCharm\\PyCharm 2019.1.3\\helpers\\pycharm_matplotlib_backend\\sitecustomize.py'>, 'matplotlib': <module 'matplotlib' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\matplotlib\\__init__.py'>, 'atexit': <module 'atexit' (built-in)>, 'distutils': <module 'distutils' from 'D:\\anzhuangbao\\python\\lib\\distutils\\__init__.py'>, 'distutils.version': <module 'distutils.version' from 'D:\\anzhuangbao\\python\\lib\\distutils\\version.py'>, 're': <module 're' from 'D:\\anzhuangbao\\python\\lib\\re.py'>, 'enum': <module 'enum' from 'D:\\anzhuangbao\\python\\lib\\enum.py'>, 'sre_compile': <module 'sre_compile' from 'D:\\anzhuangbao\\python\\lib\\sre_compile.py'>, '_sre': <module '_sre' (built-in)>, 'sre_parse': <module 'sre_parse' from 'D:\\anzhuangbao\\python\\lib\\sre_parse.py'>, 'sre_constants': <module 'sre_constants' from 'D:\\anzhuangbao\\python\\lib\\sre_constants.py'>, 'copyreg': <module 'copyreg' from 'D:\\anzhuangbao\\python\\lib\\copyreg.py'>, 'inspect': <module 'inspect' from 'D:\\anzhuangbao\\python\\lib\\inspect.py'>, 'ast': <module 'ast' from 'D:\\anzhuangbao\\python\\lib\\ast.py'>, '_ast': <module '_ast' (built-in)>, 'dis': <module 'dis' from 'D:\\anzhuangbao\\python\\lib\\dis.py'>, 'opcode': <module 'opcode' from 'D:\\anzhuangbao\\python\\lib\\opcode.py'>, '_opcode': <module '_opcode' (built-in)>, 'linecache': <module 'linecache' from 'D:\\anzhuangbao\\python\\lib\\linecache.py'>, 'tokenize': <module 'tokenize' from 'D:\\anzhuangbao\\python\\lib\\tokenize.py'>, 'token': <module 'token' from 'D:\\anzhuangbao\\python\\lib\\token.py'>, 'locale': <module 'locale' from 'D:\\anzhuangbao\\python\\lib\\locale.py'>, 'logging': <module 'logging' from 'D:\\anzhuangbao\\python\\lib\\logging\\__init__.py'>, 'time': <module 'time' (built-in)>, 'traceback': <module 'traceback' from 'D:\\anzhuangbao\\python\\lib\\traceback.py'>, 'string': <module 'string' from 'D:\\anzhuangbao\\python\\lib\\string.py'>, '_string': <module '_string' (built-in)>, 'threading': <module 'threading' from 'D:\\anzhuangbao\\python\\lib\\threading.py'>, 'pathlib': <module 'pathlib' from 'D:\\anzhuangbao\\python\\lib\\pathlib.py'>, 'fnmatch': <module 'fnmatch' from 'D:\\anzhuangbao\\python\\lib\\fnmatch.py'>, 'posixpath': <module 'posixpath' from 'D:\\anzhuangbao\\python\\lib\\posixpath.py'>, 'urllib': <module 'urllib' from 'D:\\anzhuangbao\\python\\lib\\urllib\\__init__.py'>, 'urllib.parse': <module 'urllib.parse' from 'D:\\anzhuangbao\\python\\lib\\urllib\\parse.py'>, 'pprint': <module 'pprint' from 'D:\\anzhuangbao\\python\\lib\\pprint.py'>, 'shutil': <module 'shutil' from 'D:\\anzhuangbao\\python\\lib\\shutil.py'>, 'zlib': <module 'zlib' (built-in)>, 'bz2': <module 'bz2' from 'D:\\anzhuangbao\\python\\lib\\bz2.py'>, '_compression': <module '_compression' from 'D:\\anzhuangbao\\python\\lib\\_compression.py'>, '_bz2': <module '_bz2' from 'D:\\anzhuangbao\\python\\DLLs\\_bz2.pyd'>, 'lzma': <module 'lzma' from 'D:\\anzhuangbao\\python\\lib\\lzma.py'>, '_lzma': <module '_lzma' from 'D:\\anzhuangbao\\python\\DLLs\\_lzma.pyd'>, 'subprocess': <module 'subprocess' from 'D:\\anzhuangbao\\python\\lib\\subprocess.py'>, 'signal': <module 'signal' from 'D:\\anzhuangbao\\python\\lib\\signal.py'>, 'msvcrt': <module 'msvcrt' (built-in)>, '_winapi': <module '_winapi' (built-in)>, 'tempfile': <module 'tempfile' from 'D:\\anzhuangbao\\python\\lib\\tempfile.py'>, 'random': <module 'random' from 'D:\\anzhuangbao\\python\\lib\\random.py'>, 'math': <module 'math' (built-in)>, 'hashlib': <module 'hashlib' from 'D:\\anzhuangbao\\python\\lib\\hashlib.py'>, '_hashlib': <module '_hashlib' from 'D:\\anzhuangbao\\python\\DLLs\\_hashlib.pyd'>, '_blake2': <module '_blake2' (built-in)>, '_sha3': <module '_sha3' (built-in)>, 'bisect': <module 'bisect' from 'D:\\anzhuangbao\\python\\lib\\bisect.py'>, '_bisect': <module '_bisect' (built-in)>, '_random': <module '_random' (built-in)>, 'matplotlib.cbook': <module 'matplotlib.cbook' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\matplotlib\\cbook\\__init__.py'>, 'glob': <module 'glob' from 'D:\\anzhuangbao\\python\\lib\\glob.py'>, 'gzip': <module 'gzip' from 'D:\\anzhuangbao\\python\\lib\\gzip.py'>, 'struct': <module 'struct' from 'D:\\anzhuangbao\\python\\lib\\struct.py'>, '_struct': <module '_struct' (built-in)>, 'numbers': <module 'numbers' from 'D:\\anzhuangbao\\python\\lib\\numbers.py'>, 'numpy': <module 'numpy' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\__init__.py'>, '__future__': <module '__future__' from 'D:\\anzhuangbao\\python\\lib\\__future__.py'>, 'numpy._globals': <module 'numpy._globals' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\_globals.py'>, 'numpy.__config__': <module 'numpy.__config__' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\__config__.py'>, 'numpy.version': <module 'numpy.version' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\version.py'>, 'numpy._distributor_init': <module 'numpy._distributor_init' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\_distributor_init.py'>, 'ctypes': <module 'ctypes' from 'D:\\anzhuangbao\\python\\lib\\ctypes\\__init__.py'>, '_ctypes': <module '_ctypes' from 'D:\\anzhuangbao\\python\\DLLs\\_ctypes.pyd'>, 'ctypes._endian': <module 'ctypes._endian' from 'D:\\anzhuangbao\\python\\lib\\ctypes\\_endian.py'>, 'numpy.core': <module 'numpy.core' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\__init__.py'>, 'numpy.core.info': <module 'numpy.core.info' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\info.py'>, 'numpy.core.multiarray': <module 'numpy.core.multiarray' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\multiarray.py'>, 'numpy.core.overrides': <module 'numpy.core.overrides' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\overrides.py'>, 'textwrap': <module 'textwrap' from 'D:\\anzhuangbao\\python\\lib\\textwrap.py'>, 'datetime': <module 'datetime' from 'D:\\anzhuangbao\\python\\lib\\datetime.py'>, '_datetime': <module '_datetime' (built-in)>, 'numpy.core._multiarray_umath': <module 'numpy.core._multiarray_umath' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\_multiarray_umath.cp36-win_amd64.pyd'>, 'numpy.compat': <module 'numpy.compat' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\compat\\__init__.py'>, 'numpy.compat._inspect': <module 'numpy.compat._inspect' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\compat\\_inspect.py'>, 'numpy.compat.py3k': <module 'numpy.compat.py3k' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\compat\\py3k.py'>, 'pickle': <module 'pickle' from 'D:\\anzhuangbao\\python\\lib\\pickle.py'>, '_compat_pickle': <module '_compat_pickle' from 'D:\\anzhuangbao\\python\\lib\\_compat_pickle.py'>, '_pickle': <module '_pickle' (built-in)>, 'numpy.core.umath': <module 'numpy.core.umath' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\umath.py'>, 'numpy.core.numerictypes': <module 'numpy.core.numerictypes' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\numerictypes.py'>, 'numpy.core._string_helpers': <module 'numpy.core._string_helpers' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\_string_helpers.py'>, 'numpy.core._type_aliases': <module 'numpy.core._type_aliases' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\_type_aliases.py'>, 'numpy.core._dtype': <module 'numpy.core._dtype' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\_dtype.py'>, 'numpy.core.numeric': <module 'numpy.core.numeric' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\numeric.py'>, 'numpy.core._exceptions': <module 'numpy.core._exceptions' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\_exceptions.py'>, 'numpy.core._asarray': <module 'numpy.core._asarray' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\_asarray.py'>, 'numpy.core._ufunc_config': <module 'numpy.core._ufunc_config' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\_ufunc_config.py'>, 'numpy.core.fromnumeric': <module 'numpy.core.fromnumeric' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\fromnumeric.py'>, 'numpy.core._methods': <module 'numpy.core._methods' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\_methods.py'>, 'numpy.core.arrayprint': <module 'numpy.core.arrayprint' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\arrayprint.py'>, 'numpy.core.defchararray': <module 'numpy.core.defchararray' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\defchararray.py'>, 'numpy.core.records': <module 'numpy.core.records' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\records.py'>, 'numpy.core.memmap': <module 'numpy.core.memmap' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\memmap.py'>, 'numpy.core.function_base': <module 'numpy.core.function_base' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\function_base.py'>, 'numpy.core.machar': <module 'numpy.core.machar' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\machar.py'>, 'numpy.core.getlimits': <module 'numpy.core.getlimits' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\getlimits.py'>, 'numpy.core.shape_base': <module 'numpy.core.shape_base' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\shape_base.py'>, 'numpy.core.einsumfunc': <module 'numpy.core.einsumfunc' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\einsumfunc.py'>, 'numpy.core._add_newdocs': <module 'numpy.core._add_newdocs' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\_add_newdocs.py'>, 'numpy.core._multiarray_tests': <module 'numpy.core._multiarray_tests' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\_multiarray_tests.cp36-win_amd64.pyd'>, 'numpy.core._dtype_ctypes': <module 'numpy.core._dtype_ctypes' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\_dtype_ctypes.py'>, 'numpy.core._internal': <module 'numpy.core._internal' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\_internal.py'>, 'platform': <module 'platform' from 'D:\\anzhuangbao\\python\\lib\\platform.py'>, 'numpy._pytesttester': <module 'numpy._pytesttester' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\_pytesttester.py'>, 'numpy.lib': <module 'numpy.lib' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\__init__.py'>, 'numpy.lib.info': <module 'numpy.lib.info' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\info.py'>, 'numpy.lib.type_check': <module 'numpy.lib.type_check' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\type_check.py'>, 'numpy.lib.ufunclike': <module 'numpy.lib.ufunclike' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\ufunclike.py'>, 'numpy.lib.index_tricks': <module 'numpy.lib.index_tricks' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\index_tricks.py'>, 'numpy.matrixlib': <module 'numpy.matrixlib' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\matrixlib\\__init__.py'>, 'numpy.matrixlib.defmatrix': <module 'numpy.matrixlib.defmatrix' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\matrixlib\\defmatrix.py'>, 'numpy.linalg': <module 'numpy.linalg' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\linalg\\__init__.py'>, 'numpy.linalg.info': <module 'numpy.linalg.info' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\linalg\\info.py'>, 'numpy.linalg.linalg': <module 'numpy.linalg.linalg' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\linalg\\linalg.py'>, 'numpy.lib.twodim_base': <module 'numpy.lib.twodim_base' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\twodim_base.py'>, 'numpy.linalg.lapack_lite': <module 'numpy.linalg.lapack_lite' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\linalg\\lapack_lite.cp36-win_amd64.pyd'>, 'numpy.linalg._umath_linalg': <module 'numpy.linalg._umath_linalg' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\linalg\\_umath_linalg.cp36-win_amd64.pyd'>, 'numpy.lib.function_base': <module 'numpy.lib.function_base' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\function_base.py'>, 'numpy.lib.histograms': <module 'numpy.lib.histograms' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\histograms.py'>, 'numpy.lib.stride_tricks': <module 'numpy.lib.stride_tricks' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\stride_tricks.py'>, 'numpy.lib.mixins': <module 'numpy.lib.mixins' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\mixins.py'>, 'numpy.lib.nanfunctions': <module 'numpy.lib.nanfunctions' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\nanfunctions.py'>, 'numpy.lib.shape_base': <module 'numpy.lib.shape_base' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\shape_base.py'>, 'numpy.lib.scimath': <module 'numpy.lib.scimath' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\scimath.py'>, 'numpy.lib.polynomial': <module 'numpy.lib.polynomial' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\polynomial.py'>, 'numpy.lib.utils': <module 'numpy.lib.utils' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\utils.py'>, 'numpy.lib.arraysetops': <module 'numpy.lib.arraysetops' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\arraysetops.py'>, 'numpy.lib.npyio': <module 'numpy.lib.npyio' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\npyio.py'>, 'numpy.lib.format': <module 'numpy.lib.format' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\format.py'>, 'numpy.lib._datasource': <module 'numpy.lib._datasource' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\_datasource.py'>, 'numpy.lib._iotools': <module 'numpy.lib._iotools' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\_iotools.py'>, 'numpy.lib.financial': <module 'numpy.lib.financial' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\financial.py'>, 'decimal': <module 'decimal' from 'D:\\anzhuangbao\\python\\lib\\decimal.py'>, '_decimal': <module '_decimal' from 'D:\\anzhuangbao\\python\\DLLs\\_decimal.pyd'>, 'numpy.lib.arrayterator': <module 'numpy.lib.arrayterator' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\arrayterator.py'>, 'numpy.lib.arraypad': <module 'numpy.lib.arraypad' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\arraypad.py'>, 'numpy.lib._version': <module 'numpy.lib._version' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\_version.py'>, 'numpy.fft': <module 'numpy.fft' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\fft\\__init__.py'>, 'numpy.fft.info': <module 'numpy.fft.info' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\fft\\info.py'>, 'numpy.fft.pocketfft': <module 'numpy.fft.pocketfft' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\fft\\pocketfft.py'>, 'numpy.fft.pocketfft_internal': <module 'numpy.fft.pocketfft_internal' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\fft\\pocketfft_internal.cp36-win_amd64.pyd'>, 'numpy.fft.helper': <module 'numpy.fft.helper' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\fft\\helper.py'>, 'numpy.polynomial': <module 'numpy.polynomial' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\polynomial\\__init__.py'>, 'numpy.polynomial.polynomial': <module 'numpy.polynomial.polynomial' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\polynomial\\polynomial.py'>, 'numpy.polynomial.polyutils': <module 'numpy.polynomial.polyutils' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\polynomial\\polyutils.py'>, 'numpy.polynomial._polybase': <module 'numpy.polynomial._polybase' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\polynomial\\_polybase.py'>, 'numpy.polynomial.chebyshev': <module 'numpy.polynomial.chebyshev' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\polynomial\\chebyshev.py'>, 'numpy.polynomial.legendre': <module 'numpy.polynomial.legendre' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\polynomial\\legendre.py'>, 'numpy.polynomial.hermite': <module 'numpy.polynomial.hermite' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\polynomial\\hermite.py'>, 'numpy.polynomial.hermite_e': <module 'numpy.polynomial.hermite_e' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\polynomial\\hermite_e.py'>, 'numpy.polynomial.laguerre': <module 'numpy.polynomial.laguerre' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\polynomial\\laguerre.py'>, 'numpy.random': <module 'numpy.random' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\random\\__init__.py'>, 'numpy.random.mtrand': <module 'numpy.random.mtrand' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\random\\mtrand.cp36-win_amd64.pyd'>, 'cython_runtime': <module 'cython_runtime'>, 'numpy.random.common': <module 'numpy.random.common' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\random\\common.cp36-win_amd64.pyd'>, 'numpy.random.bounded_integers': <module 'numpy.random.bounded_integers' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\random\\bounded_integers.cp36-win_amd64.pyd'>, 'numpy.random.mt19937': <module 'numpy.random.mt19937' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\random\\mt19937.cp36-win_amd64.pyd'>, 'numpy.random.bit_generator': <module 'numpy.random.bit_generator' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\random\\bit_generator.cp36-win_amd64.pyd'>, '_cython_0_29_13': <module '_cython_0_29_13'>, 'secrets': <module 'secrets' from 'D:\\anzhuangbao\\python\\lib\\secrets.py'>, 'base64': <module 'base64' from 'D:\\anzhuangbao\\python\\lib\\base64.py'>, 'binascii': <module 'binascii' (built-in)>, 'hmac': <module 'hmac' from 'D:\\anzhuangbao\\python\\lib\\hmac.py'>, 'numpy.random.entropy': <module 'numpy.random.entropy' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\random\\entropy.cp36-win_amd64.pyd'>, 'numpy.random.generator': <module 'numpy.random.generator' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\random\\generator.cp36-win_amd64.pyd'>, 'numpy.random.pcg64': <module 'numpy.random.pcg64' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\random\\pcg64.cp36-win_amd64.pyd'>, 'numpy.random.philox': <module 'numpy.random.philox' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\random\\philox.cp36-win_amd64.pyd'>, 'numpy.random.sfc64': <module 'numpy.random.sfc64' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\random\\sfc64.cp36-win_amd64.pyd'>, 'numpy.ctypeslib': <module 'numpy.ctypeslib' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\ctypeslib.py'>, 'numpy.ma': <module 'numpy.ma' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\ma\\__init__.py'>, 'numpy.ma.core': <module 'numpy.ma.core' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\ma\\core.py'>, 'numpy.ma.extras': <module 'numpy.ma.extras' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\ma\\extras.py'>, 'numpy.testing': <module 'numpy.testing' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\testing\\__init__.py'>, 'unittest': <module 'unittest' from 'D:\\anzhuangbao\\python\\lib\\unittest\\__init__.py'>, 'unittest.result': <module 'unittest.result' from 'D:\\anzhuangbao\\python\\lib\\unittest\\result.py'>, 'unittest.util': <module 'unittest.util' from 'D:\\anzhuangbao\\python\\lib\\unittest\\util.py'>, 'unittest.case': <module 'unittest.case' from 'D:\\anzhuangbao\\python\\lib\\unittest\\case.py'>, 'difflib': <module 'difflib' from 'D:\\anzhuangbao\\python\\lib\\difflib.py'>, 'unittest.suite': <module 'unittest.suite' from 'D:\\anzhuangbao\\python\\lib\\unittest\\suite.py'>, 'unittest.loader': <module 'unittest.loader' from 'D:\\anzhuangbao\\python\\lib\\unittest\\loader.py'>, 'unittest.main': <module 'unittest.main' from 'D:\\anzhuangbao\\python\\lib\\unittest\\main.py'>, 'argparse': <module 'argparse' from 'D:\\anzhuangbao\\python\\lib\\argparse.py'>, 'copy': <module 'copy' from 'D:\\anzhuangbao\\python\\lib\\copy.py'>, 'gettext': <module 'gettext' from 'D:\\anzhuangbao\\python\\lib\\gettext.py'>, 'unittest.runner': <module 'unittest.runner' from 'D:\\anzhuangbao\\python\\lib\\unittest\\runner.py'>, 'unittest.signals': <module 'unittest.signals' from 'D:\\anzhuangbao\\python\\lib\\unittest\\signals.py'>, 'numpy.testing._private': <module 'numpy.testing._private' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\testing\\_private\\__init__.py'>, 'numpy.testing._private.utils': <module 'numpy.testing._private.utils' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\testing\\_private\\utils.py'>, 'gc': <module 'gc' (built-in)>, 'numpy.testing._private.decorators': <module 'numpy.testing._private.decorators' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\testing\\_private\\decorators.py'>, 'numpy.testing._private.nosetester': <module 'numpy.testing._private.nosetester' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\testing\\_private\\nosetester.py'>, 'matplotlib.cbook.deprecation': <module 'matplotlib.cbook.deprecation' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\matplotlib\\cbook\\deprecation.py'>, 'matplotlib.rcsetup': <module 'matplotlib.rcsetup' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\matplotlib\\rcsetup.py'>, 'matplotlib.fontconfig_pattern': <module 'matplotlib.fontconfig_pattern' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\matplotlib\\fontconfig_pattern.py'>, 'pyparsing': <module 'pyparsing' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\pyparsing.py'>, 'matplotlib.colors': <module 'matplotlib.colors' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\matplotlib\\colors.py'>, 'matplotlib._color_data': <module 'matplotlib._color_data' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\matplotlib\\_color_data.py'>, 'cycler': <module 'cycler' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\cycler.py'>, 'six': <module 'six' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\six.py'>, 'six.moves': <module 'six.moves' (<six._SixMetaPathImporter object at 0x0000000009DF5320>)>, 'matplotlib._version': <module 'matplotlib._version' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\matplotlib\\_version.py'>, 'json': <module 'json' from 'D:\\anzhuangbao\\python\\lib\\json\\__init__.py'>, 'json.decoder': <module 'json.decoder' from 'D:\\anzhuangbao\\python\\lib\\json\\decoder.py'>, 'json.scanner': <module 'json.scanner' from 'D:\\anzhuangbao\\python\\lib\\json\\scanner.py'>, '_json': <module '_json' (built-in)>, 'json.encoder': <module 'json.encoder' from 'D:\\anzhuangbao\\python\\lib\\json\\encoder.py'>, 'matplotlib.ft2font': <module 'matplotlib.ft2font' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\matplotlib\\ft2font.cp36-win_amd64.pyd'>, 'dateutil': <module 'dateutil' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\dateutil\\__init__.py'>, 'dateutil._version': <module 'dateutil._version' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\dateutil\\_version.py'>, 'kiwisolver': <module 'kiwisolver' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\kiwisolver.cp36-win_amd64.pyd'>, 'socket': <module 'socket' from 'D:\\anzhuangbao\\python\\lib\\socket.py'>, '_socket': <module '_socket' from 'D:\\anzhuangbao\\python\\DLLs\\_socket.pyd'>, 'selectors': <module 'selectors' from 'D:\\anzhuangbao\\python\\lib\\selectors.py'>, 'select': <module 'select' from 'D:\\anzhuangbao\\python\\DLLs\\select.pyd'>}


dict_keys(['builtins', 'sys', '_frozen_importlib', '_imp', '_warnings', '_thread', '_weakref', '_frozen_importlib_external', '_io', 'marshal', 'nt', 'winreg', 'zipimport', 'encodings', 'codecs', '_codecs', 'encodings.aliases', 'encodings.utf_8', '_signal', '__main__', 'encodings.latin_1', 'io', 'abc', '_weakrefset', 'site', 'os', 'errno', 'stat', '_stat', 'ntpath', 'genericpath', 'os.path', '_collections_abc', '_sitebuiltins', 'sysconfig', '_bootlocale', '_locale', 'encodings.gbk', '_codecs_cn', '_multibytecodec', 'types', 'functools', '_functools', 'collections', 'operator', '_operator', 'keyword', 'heapq', '_heapq', 'itertools', 'reprlib', '_collections', 'weakref', 'collections.abc', 'importlib', 'importlib._bootstrap', 'importlib._bootstrap_external', 'warnings', 'importlib.util', 'importlib.abc', 'importlib.machinery', 'contextlib', 'mpl_toolkits', 'ruamel', 'zope', 'sitecustomize', 'matplotlib', 'atexit', 'distutils', 'distutils.version', 're', 'enum', 'sre_compile', '_sre', 'sre_parse', 'sre_constants', 'copyreg', 'inspect', 'ast', '_ast', 'dis', 'opcode', '_opcode', 'linecache', 'tokenize', 'token', 'locale', 'logging', 'time', 'traceback', 'string', '_string', 'threading', 'pathlib', 'fnmatch', 'posixpath', 'urllib', 'urllib.parse', 'pprint', 'shutil', 'zlib', 'bz2', '_compression', '_bz2', 'lzma', '_lzma', 'subprocess', 'signal', 'msvcrt', '_winapi', 'tempfile', 'random', 'math', 'hashlib', '_hashlib', '_blake2', '_sha3', 'bisect', '_bisect', '_random', 'matplotlib.cbook', 'glob', 'gzip', 'struct', '_struct', 'numbers', 'numpy', '__future__', 'numpy._globals', 'numpy.__config__', 'numpy.version', 'numpy._distributor_init', 'ctypes', '_ctypes', 'ctypes._endian', 'numpy.core', 'numpy.core.info', 'numpy.core.multiarray', 'numpy.core.overrides', 'textwrap', 'datetime', '_datetime', 'numpy.core._multiarray_umath', 'numpy.compat', 'numpy.compat._inspect', 'numpy.compat.py3k', 'pickle', '_compat_pickle', '_pickle', 'numpy.core.umath', 'numpy.core.numerictypes', 'numpy.core._string_helpers', 'numpy.core._type_aliases', 'numpy.core._dtype', 'numpy.core.numeric', 'numpy.core._exceptions', 'numpy.core._asarray', 'numpy.core._ufunc_config', 'numpy.core.fromnumeric', 'numpy.core._methods', 'numpy.core.arrayprint', 'numpy.core.defchararray', 'numpy.core.records', 'numpy.core.memmap', 'numpy.core.function_base', 'numpy.core.machar', 'numpy.core.getlimits', 'numpy.core.shape_base', 'numpy.core.einsumfunc', 'numpy.core._add_newdocs', 'numpy.core._multiarray_tests', 'numpy.core._dtype_ctypes', 'numpy.core._internal', 'platform', 'numpy._pytesttester', 'numpy.lib', 'numpy.lib.info', 'numpy.lib.type_check', 'numpy.lib.ufunclike', 'numpy.lib.index_tricks', 'numpy.matrixlib', 'numpy.matrixlib.defmatrix', 'numpy.linalg', 'numpy.linalg.info', 'numpy.linalg.linalg', 'numpy.lib.twodim_base', 'numpy.linalg.lapack_lite', 'numpy.linalg._umath_linalg', 'numpy.lib.function_base', 'numpy.lib.histograms', 'numpy.lib.stride_tricks', 'numpy.lib.mixins', 'numpy.lib.nanfunctions', 'numpy.lib.shape_base', 'numpy.lib.scimath', 'numpy.lib.polynomial', 'numpy.lib.utils', 'numpy.lib.arraysetops', 'numpy.lib.npyio', 'numpy.lib.format', 'numpy.lib._datasource', 'numpy.lib._iotools', 'numpy.lib.financial', 'decimal', '_decimal', 'numpy.lib.arrayterator', 'numpy.lib.arraypad', 'numpy.lib._version', 'numpy.fft', 'numpy.fft.info', 'numpy.fft.pocketfft', 'numpy.fft.pocketfft_internal', 'numpy.fft.helper', 'numpy.polynomial', 'numpy.polynomial.polynomial', 'numpy.polynomial.polyutils', 'numpy.polynomial._polybase', 'numpy.polynomial.chebyshev', 'numpy.polynomial.legendre', 'numpy.polynomial.hermite', 'numpy.polynomial.hermite_e', 'numpy.polynomial.laguerre', 'numpy.random', 'numpy.random.mtrand', 'cython_runtime', 'numpy.random.common', 'numpy.random.bounded_integers', 'numpy.random.mt19937', 'numpy.random.bit_generator', '_cython_0_29_13', 'secrets', 'base64', 'binascii', 'hmac', 'numpy.random.entropy', 'numpy.random.generator', 'numpy.random.pcg64', 'numpy.random.philox', 'numpy.random.sfc64', 'numpy.ctypeslib', 'numpy.ma', 'numpy.ma.core', 'numpy.ma.extras', 'numpy.testing', 'unittest', 'unittest.result', 'unittest.util', 'unittest.case', 'difflib', 'unittest.suite', 'unittest.loader', 'unittest.main', 'argparse', 'copy', 'gettext', 'unittest.runner', 'unittest.signals', 'numpy.testing._private', 'numpy.testing._private.utils', 'gc', 'numpy.testing._private.decorators', 'numpy.testing._private.nosetester', 'matplotlib.cbook.deprecation', 'matplotlib.rcsetup', 'matplotlib.fontconfig_pattern', 'pyparsing', 'matplotlib.colors', 'matplotlib._color_data', 'cycler', 'six', 'six.moves', 'matplotlib._version', 'json', 'json.decoder', 'json.scanner', '_json', 'json.encoder', 'matplotlib.ft2font', 'dateutil', 'dateutil._version', 'kiwisolver', 'socket', '_socket', 'selectors', 'select'])


dict_values([<module 'builtins' (built-in)>, <module 'sys' (built-in)>, <module 'importlib._bootstrap' (frozen)>, <module '_imp' (built-in)>, <module '_warnings' (built-in)>, <module '_thread' (built-in)>, <module '_weakref' (built-in)>, <module 'importlib._bootstrap_external' (frozen)>, <module 'io' (built-in)>, <module 'marshal' (built-in)>, <module 'nt' (built-in)>, <module 'winreg' (built-in)>, <module 'zipimport' (built-in)>, <module 'encodings' from 'D:\\anzhuangbao\\python\\lib\\encodings\\__init__.py'>, <module 'codecs' from 'D:\\anzhuangbao\\python\\lib\\codecs.py'>, <module '_codecs' (built-in)>, <module 'encodings.aliases' from 'D:\\anzhuangbao\\python\\lib\\encodings\\aliases.py'>, <module 'encodings.utf_8' from 'D:\\anzhuangbao\\python\\lib\\encodings\\utf_8.py'>, <module '_signal' (built-in)>, <module '__main__' from 'C:/Users/Administrator/Desktop/temp/test 03.py'>, <module 'encodings.latin_1' from 'D:\\anzhuangbao\\python\\lib\\encodings\\latin_1.py'>, <module 'io' from 'D:\\anzhuangbao\\python\\lib\\io.py'>, <module 'abc' from 'D:\\anzhuangbao\\python\\lib\\abc.py'>, <module '_weakrefset' from 'D:\\anzhuangbao\\python\\lib\\_weakrefset.py'>, <module 'site' from 'D:\\anzhuangbao\\python\\lib\\site.py'>, <module 'os' from 'D:\\anzhuangbao\\python\\lib\\os.py'>, <module 'errno' (built-in)>, <module 'stat' from 'D:\\anzhuangbao\\python\\lib\\stat.py'>, <module '_stat' (built-in)>, <module 'ntpath' from 'D:\\anzhuangbao\\python\\lib\\ntpath.py'>, <module 'genericpath' from 'D:\\anzhuangbao\\python\\lib\\genericpath.py'>, <module 'ntpath' from 'D:\\anzhuangbao\\python\\lib\\ntpath.py'>, <module '_collections_abc' from 'D:\\anzhuangbao\\python\\lib\\_collections_abc.py'>, <module '_sitebuiltins' from 'D:\\anzhuangbao\\python\\lib\\_sitebuiltins.py'>, <module 'sysconfig' from 'D:\\anzhuangbao\\python\\lib\\sysconfig.py'>, <module '_bootlocale' from 'D:\\anzhuangbao\\python\\lib\\_bootlocale.py'>, <module '_locale' (built-in)>, <module 'encodings.gbk' from 'D:\\anzhuangbao\\python\\lib\\encodings\\gbk.py'>, <module '_codecs_cn' (built-in)>, <module '_multibytecodec' (built-in)>, <module 'types' from 'D:\\anzhuangbao\\python\\lib\\types.py'>, <module 'functools' from 'D:\\anzhuangbao\\python\\lib\\functools.py'>, <module '_functools' (built-in)>, <module 'collections' from 'D:\\anzhuangbao\\python\\lib\\collections\\__init__.py'>, <module 'operator' from 'D:\\anzhuangbao\\python\\lib\\operator.py'>, <module '_operator' (built-in)>, <module 'keyword' from 'D:\\anzhuangbao\\python\\lib\\keyword.py'>, <module 'heapq' from 'D:\\anzhuangbao\\python\\lib\\heapq.py'>, <module '_heapq' (built-in)>, <module 'itertools' (built-in)>, <module 'reprlib' from 'D:\\anzhuangbao\\python\\lib\\reprlib.py'>, <module '_collections' (built-in)>, <module 'weakref' from 'D:\\anzhuangbao\\python\\lib\\weakref.py'>, <module 'collections.abc' from 'D:\\anzhuangbao\\python\\lib\\collections\\abc.py'>, <module 'importlib' from 'D:\\anzhuangbao\\python\\lib\\importlib\\__init__.py'>, <module 'importlib._bootstrap' (frozen)>, <module 'importlib._bootstrap_external' (frozen)>, <module 'warnings' from 'D:\\anzhuangbao\\python\\lib\\warnings.py'>, <module 'importlib.util' from 'D:\\anzhuangbao\\python\\lib\\importlib\\util.py'>, <module 'importlib.abc' from 'D:\\anzhuangbao\\python\\lib\\importlib\\abc.py'>, <module 'importlib.machinery' from 'D:\\anzhuangbao\\python\\lib\\importlib\\machinery.py'>, <module 'contextlib' from 'D:\\anzhuangbao\\python\\lib\\contextlib.py'>, <module 'mpl_toolkits' (namespace)>, <module 'ruamel' (namespace)>, <module 'zope' (namespace)>, <module 'sitecustomize' from 'D:\\anzhuangbao\\pyCharm\\PyCharm 2019.1.3\\helpers\\pycharm_matplotlib_backend\\sitecustomize.py'>, <module 'matplotlib' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\matplotlib\\__init__.py'>, <module 'atexit' (built-in)>, <module 'distutils' from 'D:\\anzhuangbao\\python\\lib\\distutils\\__init__.py'>, <module 'distutils.version' from 'D:\\anzhuangbao\\python\\lib\\distutils\\version.py'>, <module 're' from 'D:\\anzhuangbao\\python\\lib\\re.py'>, <module 'enum' from 'D:\\anzhuangbao\\python\\lib\\enum.py'>, <module 'sre_compile' from 'D:\\anzhuangbao\\python\\lib\\sre_compile.py'>, <module '_sre' (built-in)>, <module 'sre_parse' from 'D:\\anzhuangbao\\python\\lib\\sre_parse.py'>, <module 'sre_constants' from 'D:\\anzhuangbao\\python\\lib\\sre_constants.py'>, <module 'copyreg' from 'D:\\anzhuangbao\\python\\lib\\copyreg.py'>, <module 'inspect' from 'D:\\anzhuangbao\\python\\lib\\inspect.py'>, <module 'ast' from 'D:\\anzhuangbao\\python\\lib\\ast.py'>, <module '_ast' (built-in)>, <module 'dis' from 'D:\\anzhuangbao\\python\\lib\\dis.py'>, <module 'opcode' from 'D:\\anzhuangbao\\python\\lib\\opcode.py'>, <module '_opcode' (built-in)>, <module 'linecache' from 'D:\\anzhuangbao\\python\\lib\\linecache.py'>, <module 'tokenize' from 'D:\\anzhuangbao\\python\\lib\\tokenize.py'>, <module 'token' from 'D:\\anzhuangbao\\python\\lib\\token.py'>, <module 'locale' from 'D:\\anzhuangbao\\python\\lib\\locale.py'>, <module 'logging' from 'D:\\anzhuangbao\\python\\lib\\logging\\__init__.py'>, <module 'time' (built-in)>, <module 'traceback' from 'D:\\anzhuangbao\\python\\lib\\traceback.py'>, <module 'string' from 'D:\\anzhuangbao\\python\\lib\\string.py'>, <module '_string' (built-in)>, <module 'threading' from 'D:\\anzhuangbao\\python\\lib\\threading.py'>, <module 'pathlib' from 'D:\\anzhuangbao\\python\\lib\\pathlib.py'>, <module 'fnmatch' from 'D:\\anzhuangbao\\python\\lib\\fnmatch.py'>, <module 'posixpath' from 'D:\\anzhuangbao\\python\\lib\\posixpath.py'>, <module 'urllib' from 'D:\\anzhuangbao\\python\\lib\\urllib\\__init__.py'>, <module 'urllib.parse' from 'D:\\anzhuangbao\\python\\lib\\urllib\\parse.py'>, <module 'pprint' from 'D:\\anzhuangbao\\python\\lib\\pprint.py'>, <module 'shutil' from 'D:\\anzhuangbao\\python\\lib\\shutil.py'>, <module 'zlib' (built-in)>, <module 'bz2' from 'D:\\anzhuangbao\\python\\lib\\bz2.py'>, <module '_compression' from 'D:\\anzhuangbao\\python\\lib\\_compression.py'>, <module '_bz2' from 'D:\\anzhuangbao\\python\\DLLs\\_bz2.pyd'>, <module 'lzma' from 'D:\\anzhuangbao\\python\\lib\\lzma.py'>, <module '_lzma' from 'D:\\anzhuangbao\\python\\DLLs\\_lzma.pyd'>, <module 'subprocess' from 'D:\\anzhuangbao\\python\\lib\\subprocess.py'>, <module 'signal' from 'D:\\anzhuangbao\\python\\lib\\signal.py'>, <module 'msvcrt' (built-in)>, <module '_winapi' (built-in)>, <module 'tempfile' from 'D:\\anzhuangbao\\python\\lib\\tempfile.py'>, <module 'random' from 'D:\\anzhuangbao\\python\\lib\\random.py'>, <module 'math' (built-in)>, <module 'hashlib' from 'D:\\anzhuangbao\\python\\lib\\hashlib.py'>, <module '_hashlib' from 'D:\\anzhuangbao\\python\\DLLs\\_hashlib.pyd'>, <module '_blake2' (built-in)>, <module '_sha3' (built-in)>, <module 'bisect' from 'D:\\anzhuangbao\\python\\lib\\bisect.py'>, <module '_bisect' (built-in)>, <module '_random' (built-in)>, <module 'matplotlib.cbook' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\matplotlib\\cbook\\__init__.py'>, <module 'glob' from 'D:\\anzhuangbao\\python\\lib\\glob.py'>, <module 'gzip' from 'D:\\anzhuangbao\\python\\lib\\gzip.py'>, <module 'struct' from 'D:\\anzhuangbao\\python\\lib\\struct.py'>, <module '_struct' (built-in)>, <module 'numbers' from 'D:\\anzhuangbao\\python\\lib\\numbers.py'>, <module 'numpy' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\__init__.py'>, <module '__future__' from 'D:\\anzhuangbao\\python\\lib\\__future__.py'>, <module 'numpy._globals' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\_globals.py'>, <module 'numpy.__config__' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\__config__.py'>, <module 'numpy.version' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\version.py'>, <module 'numpy._distributor_init' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\_distributor_init.py'>, <module 'ctypes' from 'D:\\anzhuangbao\\python\\lib\\ctypes\\__init__.py'>, <module '_ctypes' from 'D:\\anzhuangbao\\python\\DLLs\\_ctypes.pyd'>, <module 'ctypes._endian' from 'D:\\anzhuangbao\\python\\lib\\ctypes\\_endian.py'>, <module 'numpy.core' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\__init__.py'>, <module 'numpy.core.info' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\info.py'>, <module 'numpy.core.multiarray' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\multiarray.py'>, <module 'numpy.core.overrides' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\overrides.py'>, <module 'textwrap' from 'D:\\anzhuangbao\\python\\lib\\textwrap.py'>, <module 'datetime' from 'D:\\anzhuangbao\\python\\lib\\datetime.py'>, <module '_datetime' (built-in)>, <module 'numpy.core._multiarray_umath' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\_multiarray_umath.cp36-win_amd64.pyd'>, <module 'numpy.compat' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\compat\\__init__.py'>, <module 'numpy.compat._inspect' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\compat\\_inspect.py'>, <module 'numpy.compat.py3k' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\compat\\py3k.py'>, <module 'pickle' from 'D:\\anzhuangbao\\python\\lib\\pickle.py'>, <module '_compat_pickle' from 'D:\\anzhuangbao\\python\\lib\\_compat_pickle.py'>, <module '_pickle' (built-in)>, <module 'numpy.core.umath' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\umath.py'>, <module 'numpy.core.numerictypes' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\numerictypes.py'>, <module 'numpy.core._string_helpers' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\_string_helpers.py'>, <module 'numpy.core._type_aliases' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\_type_aliases.py'>, <module 'numpy.core._dtype' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\_dtype.py'>, <module 'numpy.core.numeric' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\numeric.py'>, <module 'numpy.core._exceptions' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\_exceptions.py'>, <module 'numpy.core._asarray' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\_asarray.py'>, <module 'numpy.core._ufunc_config' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\_ufunc_config.py'>, <module 'numpy.core.fromnumeric' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\fromnumeric.py'>, <module 'numpy.core._methods' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\_methods.py'>, <module 'numpy.core.arrayprint' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\arrayprint.py'>, <module 'numpy.core.defchararray' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\defchararray.py'>, <module 'numpy.core.records' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\records.py'>, <module 'numpy.core.memmap' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\memmap.py'>, <module 'numpy.core.function_base' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\function_base.py'>, <module 'numpy.core.machar' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\machar.py'>, <module 'numpy.core.getlimits' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\getlimits.py'>, <module 'numpy.core.shape_base' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\shape_base.py'>, <module 'numpy.core.einsumfunc' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\einsumfunc.py'>, <module 'numpy.core._add_newdocs' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\_add_newdocs.py'>, <module 'numpy.core._multiarray_tests' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\_multiarray_tests.cp36-win_amd64.pyd'>, <module 'numpy.core._dtype_ctypes' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\_dtype_ctypes.py'>, <module 'numpy.core._internal' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\core\\_internal.py'>, <module 'platform' from 'D:\\anzhuangbao\\python\\lib\\platform.py'>, <module 'numpy._pytesttester' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\_pytesttester.py'>, <module 'numpy.lib' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\__init__.py'>, <module 'numpy.lib.info' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\info.py'>, <module 'numpy.lib.type_check' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\type_check.py'>, <module 'numpy.lib.ufunclike' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\ufunclike.py'>, <module 'numpy.lib.index_tricks' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\index_tricks.py'>, <module 'numpy.matrixlib' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\matrixlib\\__init__.py'>, <module 'numpy.matrixlib.defmatrix' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\matrixlib\\defmatrix.py'>, <module 'numpy.linalg' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\linalg\\__init__.py'>, <module 'numpy.linalg.info' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\linalg\\info.py'>, <module 'numpy.linalg.linalg' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\linalg\\linalg.py'>, <module 'numpy.lib.twodim_base' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\twodim_base.py'>, <module 'numpy.linalg.lapack_lite' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\linalg\\lapack_lite.cp36-win_amd64.pyd'>, <module 'numpy.linalg._umath_linalg' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\linalg\\_umath_linalg.cp36-win_amd64.pyd'>, <module 'numpy.lib.function_base' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\function_base.py'>, <module 'numpy.lib.histograms' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\histograms.py'>, <module 'numpy.lib.stride_tricks' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\stride_tricks.py'>, <module 'numpy.lib.mixins' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\mixins.py'>, <module 'numpy.lib.nanfunctions' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\nanfunctions.py'>, <module 'numpy.lib.shape_base' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\shape_base.py'>, <module 'numpy.lib.scimath' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\scimath.py'>, <module 'numpy.lib.polynomial' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\polynomial.py'>, <module 'numpy.lib.utils' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\utils.py'>, <module 'numpy.lib.arraysetops' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\arraysetops.py'>, <module 'numpy.lib.npyio' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\npyio.py'>, <module 'numpy.lib.format' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\format.py'>, <module 'numpy.lib._datasource' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\_datasource.py'>, <module 'numpy.lib._iotools' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\_iotools.py'>, <module 'numpy.lib.financial' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\financial.py'>, <module 'decimal' from 'D:\\anzhuangbao\\python\\lib\\decimal.py'>, <module '_decimal' from 'D:\\anzhuangbao\\python\\DLLs\\_decimal.pyd'>, <module 'numpy.lib.arrayterator' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\arrayterator.py'>, <module 'numpy.lib.arraypad' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\arraypad.py'>, <module 'numpy.lib._version' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\lib\\_version.py'>, <module 'numpy.fft' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\fft\\__init__.py'>, <module 'numpy.fft.info' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\fft\\info.py'>, <module 'numpy.fft.pocketfft' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\fft\\pocketfft.py'>, <module 'numpy.fft.pocketfft_internal' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\fft\\pocketfft_internal.cp36-win_amd64.pyd'>, <module 'numpy.fft.helper' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\fft\\helper.py'>, <module 'numpy.polynomial' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\polynomial\\__init__.py'>, <module 'numpy.polynomial.polynomial' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\polynomial\\polynomial.py'>, <module 'numpy.polynomial.polyutils' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\polynomial\\polyutils.py'>, <module 'numpy.polynomial._polybase' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\polynomial\\_polybase.py'>, <module 'numpy.polynomial.chebyshev' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\polynomial\\chebyshev.py'>, <module 'numpy.polynomial.legendre' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\polynomial\\legendre.py'>, <module 'numpy.polynomial.hermite' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\polynomial\\hermite.py'>, <module 'numpy.polynomial.hermite_e' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\polynomial\\hermite_e.py'>, <module 'numpy.polynomial.laguerre' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\polynomial\\laguerre.py'>, <module 'numpy.random' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\random\\__init__.py'>, <module 'numpy.random.mtrand' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\random\\mtrand.cp36-win_amd64.pyd'>, <module 'cython_runtime'>, <module 'numpy.random.common' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\random\\common.cp36-win_amd64.pyd'>, <module 'numpy.random.bounded_integers' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\random\\bounded_integers.cp36-win_amd64.pyd'>, <module 'numpy.random.mt19937' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\random\\mt19937.cp36-win_amd64.pyd'>, <module 'numpy.random.bit_generator' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\random\\bit_generator.cp36-win_amd64.pyd'>, <module '_cython_0_29_13'>, <module 'secrets' from 'D:\\anzhuangbao\\python\\lib\\secrets.py'>, <module 'base64' from 'D:\\anzhuangbao\\python\\lib\\base64.py'>, <module 'binascii' (built-in)>, <module 'hmac' from 'D:\\anzhuangbao\\python\\lib\\hmac.py'>, <module 'numpy.random.entropy' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\random\\entropy.cp36-win_amd64.pyd'>, <module 'numpy.random.generator' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\random\\generator.cp36-win_amd64.pyd'>, <module 'numpy.random.pcg64' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\random\\pcg64.cp36-win_amd64.pyd'>, <module 'numpy.random.philox' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\random\\philox.cp36-win_amd64.pyd'>, <module 'numpy.random.sfc64' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\random\\sfc64.cp36-win_amd64.pyd'>, <module 'numpy.ctypeslib' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\ctypeslib.py'>, <module 'numpy.ma' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\ma\\__init__.py'>, <module 'numpy.ma.core' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\ma\\core.py'>, <module 'numpy.ma.extras' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\ma\\extras.py'>, <module 'numpy.testing' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\testing\\__init__.py'>, <module 'unittest' from 'D:\\anzhuangbao\\python\\lib\\unittest\\__init__.py'>, <module 'unittest.result' from 'D:\\anzhuangbao\\python\\lib\\unittest\\result.py'>, <module 'unittest.util' from 'D:\\anzhuangbao\\python\\lib\\unittest\\util.py'>, <module 'unittest.case' from 'D:\\anzhuangbao\\python\\lib\\unittest\\case.py'>, <module 'difflib' from 'D:\\anzhuangbao\\python\\lib\\difflib.py'>, <module 'unittest.suite' from 'D:\\anzhuangbao\\python\\lib\\unittest\\suite.py'>, <module 'unittest.loader' from 'D:\\anzhuangbao\\python\\lib\\unittest\\loader.py'>, <module 'unittest.main' from 'D:\\anzhuangbao\\python\\lib\\unittest\\main.py'>, <module 'argparse' from 'D:\\anzhuangbao\\python\\lib\\argparse.py'>, <module 'copy' from 'D:\\anzhuangbao\\python\\lib\\copy.py'>, <module 'gettext' from 'D:\\anzhuangbao\\python\\lib\\gettext.py'>, <module 'unittest.runner' from 'D:\\anzhuangbao\\python\\lib\\unittest\\runner.py'>, <module 'unittest.signals' from 'D:\\anzhuangbao\\python\\lib\\unittest\\signals.py'>, <module 'numpy.testing._private' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\testing\\_private\\__init__.py'>, <module 'numpy.testing._private.utils' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\testing\\_private\\utils.py'>, <module 'gc' (built-in)>, <module 'numpy.testing._private.decorators' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\testing\\_private\\decorators.py'>, <module 'numpy.testing._private.nosetester' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\numpy\\testing\\_private\\nosetester.py'>, <module 'matplotlib.cbook.deprecation' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\matplotlib\\cbook\\deprecation.py'>, <module 'matplotlib.rcsetup' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\matplotlib\\rcsetup.py'>, <module 'matplotlib.fontconfig_pattern' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\matplotlib\\fontconfig_pattern.py'>, <module 'pyparsing' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\pyparsing.py'>, <module 'matplotlib.colors' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\matplotlib\\colors.py'>, <module 'matplotlib._color_data' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\matplotlib\\_color_data.py'>, <module 'cycler' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\cycler.py'>, <module 'six' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\six.py'>, <module 'six.moves' (<six._SixMetaPathImporter object at 0x0000000009DF5320>)>, <module 'matplotlib._version' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\matplotlib\\_version.py'>, <module 'json' from 'D:\\anzhuangbao\\python\\lib\\json\\__init__.py'>, <module 'json.decoder' from 'D:\\anzhuangbao\\python\\lib\\json\\decoder.py'>, <module 'json.scanner' from 'D:\\anzhuangbao\\python\\lib\\json\\scanner.py'>, <module '_json' (built-in)>, <module 'json.encoder' from 'D:\\anzhuangbao\\python\\lib\\json\\encoder.py'>, <module 'matplotlib.ft2font' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\matplotlib\\ft2font.cp36-win_amd64.pyd'>, <module 'dateutil' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\dateutil\\__init__.py'>, <module 'dateutil._version' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\dateutil\\_version.py'>, <module 'kiwisolver' from 'D:\\anzhuangbao\\python\\lib\\site-packages\\kiwisolver.cp36-win_amd64.pyd'>, <module 'socket' from 'D:\\anzhuangbao\\python\\lib\\socket.py'>, <module '_socket' from 'D:\\anzhuangbao\\python\\DLLs\\_socket.pyd'>, <module 'selectors' from 'D:\\anzhuangbao\\python\\lib\\selectors.py'>, <module 'select' from 'D:\\anzhuangbao\\python\\DLLs\\select.pyd'>])


<module 'os' from 'D:\\anzhuangbao\\python\\lib\\os.py'>

'''
View Code

 

4 、sys.stdin、sys.stdout、sys.stderr

分别和输出输入,错误输出相关。

概念:这三个方法都是文件属性,对应的方法可以读、写、创建文件及编码操作。

  • 1、Python程序的标准输入/输出/出错流,定义在sys模块中; 

  • 2、python启动时自动与Shell环境中的标准输入,输出,出错 关联;

如果需要更好的控制输出,而print不能满足需求,sys.stdout,sys.stdin,sys.stderr就是你需要的

变量包含与标准I/O 流对应的流对象. 如果需要更好地控制输出,而print 不能满足你的要求, 它们就是你所需要的. 你也可以替换它们, 这时候你就可以重定向输出和输入到其它设备( device ), 或者以非标准的方式处理它们。

 

sys.stdin 标准输入

所有交互式输入,类似input的方法

  

 

  

 

sys.stdin.readline 和input的区别

可以看到sys.stdin.readline()获取全部的标准输入包括换行符,在使用该方法时使用strip方法去掉换行符

name = sys.stdin.readline().strip('\n')

 

sys.stdin.readline()的优势(牢记知识点)

  看上去sys.stdin.readline() 还不如input() 好用,它有一个input没有的优势,该方法可以直接限制输出的字节长度,输出的字节长度不会超过给定参数,这是在开发中较为常用的功能之一。

 

sys.stdout 标准输出流

牢记知识点:sys.stdout:print(obj)其实就是调用sys.stdout.write(obj+’\n’)

sys.stdout涉及到一个重定向的功能,print把字符打印在屏幕上是通过sys.stdout的默认输出流,sys.stdout默认映射到打开脚本的窗口,我们可以通过修改sys.stdout的映射关系来改变print的输出位置,方法如下:

  后续所有的print输入都会写入到 test.txt内,我们同时想要恢复怎么办,方法如下:

sys.stdout.writeprint 都是输出相关的函数,print内部也是调用的sys.stdoutsys.stdout默认输出是屏幕。

import sys
s = 'test stdout'

print('--')
sys.stdout.write(s)
print('--')

class A(object):
    pass

print(A)

sys.stdout.write(A)

'''
--
test stdout--                                       # sys.stdout.write(s)后面没有换行
<class '__main__.A'>
Traceback (most recent call last):
    sys.stdout.write(A)
TypeError: write() argument must be str, not type  
'''
  • print 什么类型都可以输出,但是sys.stdout.write只可以输出字符串类型,否则报错。
  • print默认是最后换行,但是sys.stdout.write默认不换行。

下面看我在百度找到的别人大佬写的一段代码:

import sys

file = sys.stdout                   # 存储原始的输出对象
sys.stdout = open('1.txt', 'w')     # 重定向所有的写入内容到 1.txt 文件,
print('Citizen_Wang')               # 写入到 1.txt 文件中,在上一行语句中改变了输出流到文件中
print('Always fall in love with neighbours')  # 继续写入到文件中
sys.stdout.close()                  # 其实就是 open 文件之后的关闭
sys.stdout = file                   # 将 print 命令的结果返回给控制台
print('输出信息返回在控制台')          # 该信息会在控制台也显示

最后控制台只输出:输出信息返回在控制台。

 

python实现命令行进度提示

特别是在使用linux下载依赖或者软件的时候,都会提示一个百分数的进度,这种进度提示是怎么实现的呢?

我猜你肯定知道\n, \t, \d等转移字符,但是你应该不知道、\r这个转移字符,这个转移字符有什么用呢?看如下代码:

import time
import sys

for i in range(20):
    print("---" + str(i), end="")
    sys.stdout.flush()                      # 刷新缓冲区
    time.sleep(1)

这是一个简单的不能再简单的代码了,但是注意这里一直没有输出换行,接着看下面的代码,感受其中\r的作用:

import time
import sys

for i in range(20):
    if i%5 == 0:
        print("\r", end="")
    print("---" + str(i), end="")
    sys.stdout.flush()
    time.sleep(1)

 

 当我们输出\r的时候,在一行中并且在\r前的所有字符将被清理掉。修改下代码继续运行测试:

import time
import sys

for i in range(20):
    if i%5 == 0:
        print("\r", end="")
    print("---" + str(i))       # 去掉了, end="",末尾会打印出换行
    sys.stdout.flush()
    time.sleep(1)

 

当出现换行时,并不会清理掉在\r字符前的内容,所以\r只会清理掉只在一行中的内容。

for i in range(20):
    print("\r", end="")
    time.sleep(1)
    print("---" + str(i), end="")
    sys.stdout.flush()
    time.sleep(1)

 

我们清楚了\r的用法那就可以实现一个命令行进度提示了

import sys
import time

print("downloading:")
def view_bar(num, total):
    rate = float(num) / float(total)
    rate_num = int(rate * 100)
    r = "\r"+("="*(2*rate_num//10)+">")+(" "*(20-2*rate_num//10))+'%d%%' % (rate_num, )
    sys.stdout.write(r)
    sys.stdout.flush()          # 刷新缓冲区


if __name__ == '__main__':
    for i in range(0, 101):
        time.sleep(0.1)
        view_bar(i, 100)


print("\ndownload successful\n")

 

 

 

 

sys.stderr 错误输出

返回错误的信息,python 程序内报错信息都基于该方法如图红色报错

  

 

牢记知识点:该方法与sys.stdout一样都可以重定向映射写入其他文件

 

 

5. sys.exit(n)

调用sys.exit(n)可以中途退出程序,当参数非0时,会引发一个SystemExit异常,从而可以在主程序中捕获该异常。
程序中间的退出,arg=0为正常退出。
正常退出时exit(0),错误退出sys.exit(1)
import sys
print('*'*6)
sys.exit()                # 下面的代码不会执行
print('-'*6)

执行输出:******

 

6. sys.version

获取Python解释程序的版本信息 

import sys
print(sys.version)      # 3.7.4 (tags/v3.7.4:e09359112e, Jul  8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)]

 

7. sys.platform

返回当前操作系统平台名称. win32表示是Windows系统,linux2表示是linux平台。不管windows是64位还是32位,统一显示win32

import sys
print(sys.platform)     # win32

 

sys.getdefaultencoding()

  获取系统当前编码,一般默认为ascii。

 

sys.setdefaultencoding()

  设置系统默认编码,执行dir(sys)时不会看到这个方法,在解释器中执行不通过,可以先执行reload(sys),在执行 setdefaultencoding('utf8'),此时将系统默认编码设置为utf8。(见设置系统默认编码 )

 

sys.getfilesystemencoding()

  获取文件系统使用编码方式,Windows下返回'mbcs',mac下返回'utf-8'。

 

sys.maxsize

  获取最大的Int值。

 

参考链接:https://blog.csdn.net/qq_38526635/article/details/81739321

 

六、序列化模块

什么叫序列化——将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化。

序列化的目的

  1、以某种存储形式使自定义对象持久化
  2、将对象从一个地方传递到另一个地方。
  3、使程序更具维护性

总之,序列化 因为在网络上和文件中能存在的只有字节

# 比如a发送一个数据给b,由于发送数据,必须是二进制的。所以需要经历编码到解码的过程
dic = {'a':(1,2,3)}
s = str(dic).encode(encoding='utf-8'# 编码
ret = s.decode(encoding='utf-8'# 解码
print(ret)                                              # 查看数据
print(type(ret))                                  # 查看类型
print(type(eval(ret)))                          # 还原为字典

'''
执行输出:
{'a': (1, 2, 3)}
    <class 'str'>
    <class 'dict'>
'''

# 使用eval不安全,有可能是病毒。这个时候,就需要用到序列化了。   
View Code

python中的序列化模块
  json :所有的编程语言都通用的序列化格式;  它支持的数据类型非常有限 数字 字符串 列表 字典
  pickle:只能在python语言的程序之间传递数据用的; pickle支持python中所有的数据类型
  shelve: python3.* 之后才有的

1. json

json.dumps()序列化,存储。(对数据进行编码,形成json格式的数据)

import json
dic = {"spring":("微风","细雨","暖阳")}
ret = json.dumps(dic)           # 序列化
print(type(dic),dic)            # <class 'dict'> {'spring': ('微风', '细雨', '暖阳')}
print(type(ret),ret)            # <class 'str'> {"spring": ["\u5fae\u98ce", "\u7ec6\u96e8", "\u6696\u9633"]}


# 从结果中,可以看出:原始数据类型是字典,序列化之后,就是字符串类型。而且中文变成了看不懂的字符串。这是因为json.dumps 序列化时对中文默认使用的ascii编码。

# 想输出真正的中文需要指定ensure_ascii=False
dic = {"spring":('微风','细雨','暖阳')}
ret = json.dumps(dic,ensure_ascii=False)  # 序列化时,不使用ascii码
print(type(dic),dic)            # <class 'dict'> {'spring': ('微风', '细雨', '暖阳')}
print(type(ret),ret)            # <class 'str'> {"spring": ["微风", "细雨", "暖阳"]}

#注意,json转换完的字符串类型的字典中的字符串是由""表示的

列举一下dumps()的可填参数:

  1. skipkey:默认为False,当dict对象里的数据不是Python的基本数据类型(str,unicode,int,long,float,bool,None)时,如果skipkey为False,就会报错,如果skipkey为True,则可以跳过这类key;

  2. indent:如果填0或者不填,则按照一行进行打印,否则按照indent的数值显示前面的空格(正整数形式);

  3. separators:分隔符,默认为“(',',':')”,它表示key之间用“,”隔开,key和value之间用“:”隔开;这表示dictionary内keys之间用","隔开,而key和value之间用":"隔开。 

  4. encoding:编码格式,默认值是UTF-8;

  5. sort_keys:对key、value进行排序,默认值是False,即不排序;

  6. ensure_ascii:默认为True,如果dict对象里含有none-ASCII的字符,则显示\uXX的格式,如果为False,则能正常显示出来;

import json
dic = {"spring":("春天"),"summer":("夏天"),"autumn":("球天"),"winter":("冬天")}
json_dic = json.dumps(dic,sort_keys=True,indent=4,separators=(',',':'),ensure_ascii=False)
print(json_dic)

'''
输出结果:
{
    "autumn":"球天",
    "spring":"春天",
    "summer":"夏天",
    "winter":"冬天"
}
'''

json.loads()反序列化,读取。(和dumps相反,loads函数则是将json格式的数据解码,转换为Python字典)

import json
dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}]
ret = json.dumps(dic,ensure_ascii=False)    # 序列化时,不使用ascii码
res = json.loads(ret)                       # 反序列化
print(type(ret),ret)                        # <class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
print(type(res),res)                        # <class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]

json.dump() 将序列化内容写入文件

import json
dic = {"spring":("春天"),"summer":("夏天"),"autumn":("球天"),"winter":("冬天")}
f = open('test.txt','w',encoding='utf-8')

#dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
json.dump(dic,f)        # 先接收要序列化的对象,再接收文件句柄
f.close()
# 执行程序,查看文件内容为:{"spring": "\u6625\u5929", "summer": "\u590f\u5929", "autumn": "\u7403\u5929", "winter": "\u51ac\u5929"}

# 要想文件写入中文,可以加参数ensure_ascii=False import json dic = dic = {"spring":("春天"),"summer":("夏天"),"autumn":("球天"),"winter":("冬天")} f = open('test.txt','w',encoding='utf-8') json.dump(dic,f,ensure_ascii=False) f.close() #执行程序,再次查看文件内容:{"spring": "春天", "summer": "夏天", "autumn": "球天", "winter": "冬天"}

 json.load()   读取文件中的序列化内容

import json
dic = {"spring":("春天"),"summer":("夏天"),"autumn":("球天"),"winter":("冬天")}
f = open('test.txt','r',encoding='utf-8')

# load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
ret = json.load(f)                  #接收文件句柄
print(type(ret),ret)                    # 查看内容
f.close()                          # 最后记得关闭文件句柄

# 执行输出:<class 'dict'> {'spring': '春天', 'summer': '夏天', 'autumn': '球天', 'winter': '冬天'}

dump和load 依赖一个文件句柄

 

下面有4个字典,如何写入文件?使用常规方法json.dump一行行写入,再次读取时,会报错。

dic1 = {"spring":"春天"}
dic2 = {"summer":"夏天"}
dic3 = {"autumn":"球天"}
dic4 = {"winter":"冬天"}

写入多行

import json
dic1 = {"spring":"春天"}
dic2 = {"summer":"夏天"}
dic3 = {"autumn":"球天"}
dic4 = {"winter":"冬天"}
f = open('season','a',encoding='utf-8')
f.write(json.dumps(dic1)+'\n')         # 写入一行内容,注意,一定要加换行符
f.write(json.dumps(dic2)+'\n')
f.write(json.dumps(dic3)+'\n')
f.write(json.dumps(dic4)+'\n')
f.close()                            # 关闭文件句柄

# 执行程序,文件内容
'''
{"spring": "\u6625\u5929"}
{"summer": "\u590f\u5929"}
{"autumn": "\u7403\u5929"}
{"winter": "\u51ac\u5929"}
'''

读取多行文件内容

import json

f = open('season','r',encoding='utf-8')
for i in f:
    print(json.loads(i.strip()))

f.close()
# 执行程序,文件内容
'''
{'spring': '春天'}
{'summer': '夏天'}
{'autumn': '球天'}
{'winter': '冬天'}
'''

 注意:json不支持元组 不支持除了str数据类型之外的key

总结:

  • dumps序列化 loads反序列化 只在内存中操作数据 主要用于网络传输 和多个数据与文件打交道
  • dump序列化 load反序列化 主要用于一个数据直接存在文件里—— 直接和文件打交道

 

2. pickle

用于python特有的类型 和 python的数据类型间进行转换。pickle模块提供了四个功能:dumps、dump(序列化,存)、loads(反序列化,读)、load (不仅可以序列化字典,列表...可以把python中任意的数据类型序列化

dumps和loads

import pickle
dic = {'k1':'v1','k2':'v2','k3':'v3'}
str_dic = pickle.dumps(dic)
print(str_dic)                          # 一串二进制内容,输出结果是bytes类型的。b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01X\x02\x00\x00\x00v1q\x02X\x02\x00\x00\x00k2q\x03X\x02\x00\x00\x00v2q\x04X\x02\x00\x00\x00k3q\x05X\x02\x00\x00\x00v3q\x06u.'

dic2 = pickle.loads(str_dic)
print(dic2)                             # 字典 {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}

dump 写入文件。文件模式必须带b,因为它是bytes类型

# 文件模式必须带b,因为它是bytes类型
import pickle
dic = {"spring": "春天", "summer": "夏天", "autumn": "球天", "winter": "冬天"}
f = open('test.txt','wb')              # 使用dump必须以+b的形式打开文件,编码不需要指定,因为是bytes类型
pickle.dump(dic,f)
f.close()                           # 注意要关闭文件句柄

''' 执行程序,查看文件,文件内容是乱码的: �}q (X springqX 春天qX summerqX 夏天qX autumnqX 球天qX winterqX 冬天qu. '''

load 读取文件内容

import pickle
f = open('test.txt','rb')            # bytes类型不需要指定编码
print(pickle.load(f))
f.close()                     # 注意要关闭文件句柄

'''
执行输出:
{'spring': '春天', 'summer': '夏天', 'autumn': '球天', 'winter': '冬天'}
'''

dump 写入多行内容

import pickle
dic1 = {"张靓颖":(170,60,'唱歌')}
dic2 = {"张韶涵":(170,60,'唱歌')}
dic3 = {"梁静茹":(170,60,'唱歌')}
f = open('singer','wb')
pickle.dump(dic1,f)
pickle.dump(dic2,f)
pickle.dump(dic3,f)
f.close()

执行程序,查看文件内容,是乱码的

load 读取多行内容

import pickle
f = open('singer','rb')
print(pickle.load(f))
print(pickle.load(f))
print(pickle.load(f))
print(pickle.load(f))      # 多读取一行,就会报错
f.close()

为了解决多读取一行就会报错的问题,需要用到while循环+try

import pickle
f = open('singer','rb')
while True:
    try:
        print(pickle.load(f))
    except Exception:           # 接收一切错误
        break                   # 跳出循环
f.close()

'''
执行输出:
{'张靓颖': (170, 60, '唱歌')}
{'张韶涵': (170, 60, '唱歌')}
{'梁静茹': (170, 60, '唱歌')}
'''

Json和pickle比较:

  • json 在写入多次dump的时候不能对应执行多次load来取出数据,pickle可以
  • json 如果要写入多个元素可以先将元素dumps序列化,f.write(序列化+'\n')写入文件;读出元素的时候,应该先按行读文件,再使用loads将读出来的字符串转换成对应的数据类型
  • json不能序列化对象,pickle可以序列化对象
# json不能序列化对象
class A:
    def __init__(self,name,age):
        self.name=name
        self.age=age
a = A('aaa',20)
import json
json.dumps(a)

'''
执行报错:
TypeError: Object of type A is not JSON serializable
'''
# pickle可以序列化对象
import pickle
class A:
    def __init__(self,name,age):
        self.name=name
        self.age=age
a = A('aaa',20)
ret = pickle.dumps(a)        # 序列化对象
print(ret)

obj = pickle.loads(ret)     # 反序列化
print(obj.__dict__)         # 查看对象属性<br>f.close()

'''
执行输出:
b'\x80\x03c__main__\nA\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\x03X\x04\x00\x00\x00alexq\x04X\x03\x00\x00\x00ageq\x05KPub.'
    {'name': 'aaa', 'age': 20}
'''

# 将对象a写入文件
import pickle
class A:
    def __init__(self,name,age):
        self.name=name
        self.age=age

a = A('alex',80)
f = open('a','wb')
obj = pickle.dump(a,f)
f.close()

'''
执行程序,查看文件内容,是乱码的
'''

假设是一款python游戏,就可以将人物的属性,写入文件。再次登录时,就可以重新加载了。用pickle就比较方便了。当删除一个类的时候(注释代码),再次读取文件,就会报错

import pickle
class A:
    def __init__(self,name,age):
        self.name=name
        self.age=age

a = A('summer',3)
f = open('a','rb')

obj = pickle.load(f)
print(obj.__dict__)
f.close()
'''
执行报错 AttributeError: Can't get attribute 'A' on <module '__main__' from 'E:/python/test.py'> 提示找不到类A
'''

将对象反序列时,必须保证该对象的类必须存在,否则读取报错

3. shelve

shelve也是python提供给我们的序列化工具,比pickle用起来更简单一些。
shelve只提供给我们一个open方法,是用key来访问的,使用起来和字典类似。

特点:

  1、shelve模块是一个简单的key,value将内存数据通过文件持久化的模块。
  2、shelve模块可以持久化任何pickle可支持的python数据格式。
  3、shelve就是pickle模块的一个封装。
  4、shelve模块是可以多次dump和load。

优点:

  • 轻量级,键值存储系统;

缺点:

  • 适合读,不适合更新,在writeback时会把所有的数据都重新写入,结果就是可能消耗内存很多,写入耗时;
  • 不能并发的读写,不过可以使用Unix文件锁进行控制(fcntl);

存入文件

import shelve
f = shelve.open('shelve_file')     # 打开文件
f['key'] = {'int':10, 'float':9.5, 'string':'Sample data'}     #直接对文件句柄操作,就可以存入数据
f.close()
''' 执行程序,会产生3个文件 shelve_file.bak shelve_file.dat shelve_file.dir 这和MySQL的MyISAM表,有点类似。创建一个表时,也会创建3个文件。 '''

读取文件

import shelve
f1 = shelve.open('shelve_file')
existing = f1['key']                 #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错
f1.close()
print(existing)
'''
执行输出:{'string': 'Sample data', 'int': 10, 'float': 9.5}
'''

# 这个模块有个限制,它不支持多个应用同一时间往同一个DB进行写操作。所以当我们知道我们的应用如果只进行读操作,我们可以让shelve通过只读方式打开DB
import shelve
f = shelve.open('shelve_file', flag='r')         # flag = 'r' 表示只读方式
existing = f['key']
f.close()
print(existing)

'''
执行输出:{'float': 9.5, 'int': 10, 'string': 'Sample data'}
'''

修改变量

import shelve
f = shelve.open('shelve_file', flag='r')
f['key']['int'] = 50                        # 修改一个值
existing = f['key']                         # 取值
f.close()
print(existing)                             # 打印结果

'''
执行输出:
{'string': 'Sample data', 'int': 10, 'float': 9.5}
从结果上来,并没有改变,因为此时是只读模式
'''

# 先把数据覆盖一次
import shelve
f = shelve.open('shelve_file')
f['key'] = {'int':10, 'float':9.5, 'string':'Sample data'}
f.close()

# 但是下面一种情况,是可以改变的
import shelve
f = shelve.open('shelve_file', flag='r')
f['key']['int'] = 50                 # 不能修改已有结构中的值
f['key']['new'] = 'new'             # 不能在已有的结构中添加新的项
f['key'] = 'new'                     # 但是可以覆盖原来的结构
existing = f['key']                 # 取值
f.close()
print(existing)                      # 打印结果

'''
执行输出:
new
 
明明是只读,却可以改。说明有bug,shelve 尽量少用,有坑
'''

新增一个属性

import shelve
#重新覆盖数据
f = shelve.open('shelve_file')
f['key'] = {'int':10, 'float':9.5, 'string':'Sample data'}   #直接对文件句柄操作,就可以存入数据
f.close()

#新增一个属性
f1 = shelve.open('shelve_file')
f1['key']['new_value'] = 'this was not here before'
print(f1['key'])
f1.close()

'''
执行输出:
{'float': 9.5, 'int': 10, 'string': 'Sample data'}
发现新增的属性没有
'''

# 由于shelve在默认情况下是不会记录待持久化对象的任何修改的,所以我们在shelve.open()时候需要修改默认参数,否    则对象的修改不会保存。
import shelve
#新增一个属性
f1 = shelve.open('shelve_file', writeback=True)
f1['key']['new_value'] = 'this was not here before'
print(f1['key'])
f1.close()

'''
执行输出:
{'new_value': 'this was not here before', 'string': 'Sample data', 'int': 10, 'float': 9.5}
新增的属性就出现了
'''

writeback方式有优点也有缺点。优点是减少了我们出错的概率,并且让对象的持久化对用户更加的透明了;但这种方式并不是所有的情况下都需要,首先,使用writeback以后,shelf在open()的时候会增加额外的内存消耗,并且当DB在close()的时候会将缓存中的每一个对象都写入到DB,这也会带来额外的等待时间。因为shelve没有办法知道缓存中哪些对象修改了,哪些对象没有修改,因此所有的对象都会被写入

shelve由很多坑,不建议使用,推荐使用Json和picker

 

posted @ 2020-05-20 21:15  PythonGirl  阅读(161)  评论(0)    收藏  举报