Python模块

  1 #author F
  2 
  3 #模块的定义:用来从逻辑上组织python代码(变量/函数/类/逻辑),本质就是实现一个功能(以py结尾的python文件 module.py, 使用模块->import module)
  4 #包:本质就是一个文件夹(目录),必须带有一个__init.py__文件, 是从逻辑上组织模块的
  5 
  6 name = "Aux Air conditioner"
  7 def sayHello():
  8     print("hello aoteman")
  9 
 10 
 11 #导入方法
 12 # 1.直接import,导入多个时用逗号分隔
 13 # 2.from module import *,from module import logger,from module import logger as logger_module 和 import module 的区别;
 14 # 3.from module import logger() 错误
 15 # 如何导入一个包?
 16 
 17 
 18 #import本质
 19 # 导入模块的本质就是把python文件解释一遍
 20 # 导入包的本质就是在解释包下面的 __init.py__文件
 21 # import的前提是 找到他的目录 把包或者模块的目录加入到sys.path中sys.path.[append/insert](os.path.dirname(os.path.abspath(__file__)))
 22 # import test (test = test.py all code)
 23 # from test import name (name = 'code')
 24 # 如何使用包下面的模块中的方法?
 25 # import package
 26 # package.test.test() ##init.py中使用import test (from . import test#从当前目录导入test ###.代表当前init.py的路径)
 27 
 28 
 29 #导入优化
 30 # from module import test #可以避免重复检索`
 31 
 32 
 33 #模块的分类
 34 # 1.标准库
 35 # 2.开源模块(第三方模块)
 36 # 3.自定义模块
 37 
 38 #===============================标准库=======================================
 39 # a.时间模块=>time与datetime
 40 #     1)time.time():时间戳
 41 #       time.timezone:和UTC差的时间
 42 #       time.sleep():睡
 43 #       gmtime():把s转换成utc时间
 44 #       localtime():转换为本地时间(元组)
 45 #       time.mktime():元组形式转换为时间戳
 46 #       strftime("%Y-%m-%d %H:%M:%S", 元组的时间格式)  元组转格式化时间      strftime("格式",struct_time)
 47 #       strptime("2016-11-25 7:08:26","%Y-%m-%d %H:%M:%S") 格式化时间转元组 strptime(struct_time,"格式")
 48 #       asctime():转换元祖时间为str
 49 #       ctime():转换时间戳为str
 50 #       datetime.datetime类和date类
 51 #       datetime.datetime.now(): 获取当前时间
 52 #       datetime.datetime.now()+datetime.timedelta(+3): 获取时间,几天前几天后的时间 ; 默认是天
 53 #       datetime.datetime.now()+datetime.timedelta(-3): 获取时间,几天前几天后的时间
 54 #       datetime.datetime.now()+datetime.timedelta(hours=3): 获取时间,几天前几天后的时间
 55 #       datetime.datetime.now()+datetime.timedelta(minutes=-3): 获取时间,几天前几天后的时间
 56 #     2)格式化的字符串
 57 #     3)struct time元组的九个元素 time.localtime()
 58 #     世界标准时间UTC 中国时间UTC+8
 59 
 60 # b.random模块
 61 #     1)random
 62 #         random.random() #0.26596789
 63 #         random.uniform(1,10) #9.894946
 64 #         random.randomint(1,3) #[1,3] 包括两端
 65 #         random.randrange(1,3) #[1,3) 顾前不顾后
 66 #         random.choice("hello") #随机取值 传参序列或字符串
 67 #         random.sample("sfetryeyety",3) #[t, e, y]
 68 #         items = [1,2,3,4,5,6,7]
 69 #         random.shuffle(items) #洗牌 [5,6,...] 乱序
 70 
 71 # c.os模块:提供对操作系统调用的一些接口
 72 #     1)os.getcwd()获取当前目录
 73 #       os.chdir("dirname") #changedir 改变工作目录 #os.chdir("c:\\Users") os.chdir(r"c:\Users\Data")
 74 #       os.curdir #返回当前目录
 75 #       os.pardir #返回上级目录
 76 #       os.mkdirs("dirname1/diename2") #递归创建目录
 77 #       os.removedirs("dirname1") #目录为空则删除并递归到上级目录 如若也为空 也删除
 78 #       os.mkdir("dirname") #生成单级目录 相当于shell 中 的mkdie dirname
 79 #       os.rmdir("dirname") #删除单级目录 若目录不为空则无法删除,报错 相当于shell中的rmdir dirname
 80 #       os.listdir("dirname") #列出指定目录下的所有文件和子目录 包括隐藏文件 并以列表方式打印
 81 #       os.remove() #删除一个文件
 82 #       os.rename("oldname","newname") #重命名文件/目录
 83 #       os.stat("path/filename") #获取其文件/目录信息
 84 #       os.sep    #输出操作系统指定路径分隔符 win \\ linux \
 85 #       os.linesep #输出当前平台的 行终符 win \r\n linux \n os \r
 86 #       os.pathsep #输出用于分割文件路径的字符串
 87 #       os.name #输出字符串 只是当前使用平台 win>>nt linux>>posix
 88 #       os.system("bash command") #运行shell命令 直接显示
 89 #       os.environ #获取系统环境变量
 90 #       os.path.abspath(path) #返回path规范化的绝对路径
 91 #       os.path.split(path) #将path分割成路径和文件名 以二元组形式返回
 92 #       os.path.dirname(path) #返回path的目录 其实就是os.path.spilit的第一个目录
 93 #       os.path.basename(path) #返回path最后的文件名 如果path以\或者/结尾 则返回空值
 94 #       os.path.exists(path) #path存在 返回True 不存在则返回 False
 95 #       os.path.isabs(path) #path是绝对路径则返回True
 96 #       os.path.isfile(path) #path是一个存在的文件 返回True  不存在返回False
 97 #       os.path.isdir(path) #path是一个存在的目录 返回True
 98 #       os.path.join(path1[,path2,...]) #将多个路径组合后返回 第一个绝对路径之前的参数将被忽略
 99 #       os.path.getatime(path) #返回path所指向的目录或文件的最后存储时间
100 #       os.path.getmtime(path) #返回path所指向的目录或文件的最后修改时间
101 
102 # d.sys模块
103 #     1)sys.argv 命令行参数List,第一个元素是程序本身路径
104 #       sys.exit(n) 退出程序,正常退出时exit(0)
105 #       sys.version 获取python解释程序的版本信息
106 #       sys.maxint 最大的int值
107 #       sys.path 返回模块的搜索路径,初始化时使用python环境变量的值
108 #       sys.platform  返回操作系统平台名称
109 #       sys.stdout.write('please:')
110 #       val = sys.stdin.readline()[:-1]
111 
112 # e.shutil模块 : 用来copy文件 , 高级的文件文件夹压缩包处理模块
113 #     1)shutil.copyfileobj(fsrc,fdst[,length])
114 #       shutil.copyfile(src,dst)
115 #       shutil.copymode(src,dst)  仅拷贝权限 用户属组等都保持原来的 不变
116 #       shutil.sopystat(src,dst)  拷贝权限的 所有信息 但不创建文件
117 #       shutil.copy(src,dst)  拷贝文件和 权限
118 #       shutil.copy(src,dst) 拷贝文件和状态信息
119 #       shutil.ignore_patterns(*pattens)
120 #       shutil.copytree(src,dst)  递归拷贝
121 #       shutil.rmtree()  递归压缩
122 #       shutil.move(src,dst) 递归移动文件
123 #       shutil.make_archive(base_name,format,...) 创建压缩包并返回文件路径  路径最好不要包含自己压缩包所在的地方
124 #         base_name:压缩包的文件名 也可以是压缩包的路径
125 #         format:压缩包的种类 zip tar bztar gatar
126 #         root_dir:要压缩的文件夹路径
127 #         owner:用户 默认当前用户
128 #         group:组, 默认当前组
129 #         logger:用于记录日志, if 通常是logging.Logger对象
130 #  zipfile模块:
131 #       z = zipfile.Zipfile("manmanjieya.zip","w")
132 #       z.write("a.log")
133 #       print("休息一下")
134 #       z.write("b.log")
135 #       z.close()
136 #       #解压
137 #       z = zipfile.Zipfile("manmanjieya.zip","r")
138 #       z.extractall()
139 #       z.close()
140 #
141 #  tarfile模块:
142 #     t = tarfile.open("you.tar","r")
143 #     t.add(".../a.zip",arcname="bbs.zip")
144 #     t.add(".../b.zip",arcname="bbs2.zip")
145 #     tar.close()
146 #     #解压
147 #     z = tarfile.open("manmanjieya.zip","r")
148 #     z.extractall()
149 #     z.close()
150 
151 # f.json与packle模块 : 用于序列化的两个模块
152 #     json:用于字符串与python数据类型之间的转换
153 #     packle:用于python特有的类型和python的数据类型之间的转换
154 #     json:dumps , dump , loads , load
155 #     pickle:dumps, dump , loads, load
156 #   shelve模块
157 #     sf = shelve.open("filename")
158 #     info = {"name":"ASD", "job":"workkk"}
159 #     name = ["sss", "asdasda", "asd"]
160 #     sf["name"] = name
161 #     sf["info"] = info
162 #     sf.close()
163 #     file = shelve.open("filename")
164 #     file.get("name")
165 #     file.get("info")
166 #     file.get("date")
167 
168 # g.xml.etree.ElementTree as ET
169 #     tree = ET.parse("xmltest.xml")
170 #     root = tree.getroot()
171 #     print(root) #返回内存地址
172 #     print(root.tag) #根目录的标签名
173 #     遍历整个xml文档
174 #     for child in root:
175 #         print(child.tag, child.attrib)
176 #         for i in child:
177 #             print(i.tag, i.attrib, i.text)
178 #
179 #     只遍历year节点
180 #     for node in root.iter('year'):
181 #         print(node.tag, node.text)
182 #     修改
183 #     for node in root.iter('year'):
184 #         new_year = int(node.text)+1
185 #         node.text = str(new_year)
186 #         node.set("updated","yes")
187 #     tree.write("xmltest.xml")
188 #
189 #     删除
190 #     for country in root.findall("country"):
191 #         rank = int(country.find('rank').text)
192 #         if rank > 50:
193 #             root.remove(country)
194 #     自己创建xml
195 #     new_xml = ET.Element("namelist")
196 #     name = ET.SubElement(new_xml, "name", attrib={"enrolled": "yes"})
197 #     age = ET.SubElement(name, "age", attrib={"checked": "no"})
198 #     sex = ET.SubElement(name, "sex")
199 #     sex.text = '33'
200 #     name2 = ET.SubElement(new_xml, "name", attrib={"enrolled": "no"})
201 #     age = ET.SubElement(name2, "age")
202 #     age.text = '19'
203 #
204 #     et = ET.ElementTree(new_xml)  # 生成文档对象
205 #     et.write("test.xml", encoding="utf-8", xml_declaration=True)
206 #
207 #     ET.dump(new_xml)  # 打印生成的格式
208 
209 # h.pyYAML:处理ymal文档格式(配置文档) http://pyyaml.org/wiki/PyYAMLDocumentation
210 
211 # i.ConfigParse模块:用于生成和修改常见配置文档,当前模块的名称在 python 3.x 版本中变更为 configparser。
212 #
213 #     [DEFAULT]
214 #     ServerAliveInterval = 45
215 #     Compression = yes
216 #     CompressionLevel = 9
217 #     ForwardX11 = yes
218 #
219 #     [bitbucket.org]
220 #     User = hg
221 #
222 #     [topsecret.server.com]
223 #     Port = 50022
224 #     ForwardX11 = no
225 #
226 # 如果想用python生成一个这样的文档怎么做呢?
227 #
228 #     import configparser
229 #
230 #     config = configparser.ConfigParser()
231 #     config["DEFAULT"] = {'ServerAliveInterval': '45',
232 #                           'Compression': 'yes',
233 #                          'CompressionLevel': '9'}
234 #
235 #     config['bitbucket.org'] = {}
236 #     config['bitbucket.org']['User'] = 'hg'
237 #     config['topsecret.server.com'] = {}
238 #     topsecret = config['topsecret.server.com']
239 #     topsecret['Host Port'] = '50022'     # mutates the parser
240 #     topsecret['ForwardX11'] = 'no'  # same here
241 #     config['DEFAULT']['ForwardX11'] = 'yes'
242 #     with open('example.ini', 'w') as configfile:
243 #        config.write(configfile)
244 # 配置文件的读取
245 #     import configparser
246 #     >>> config = configparser.ConfigParser()
247 #     >>> config.sections()
248 #     []
249 #     >>> config.defaults()
250 #     >>> config.read('example.ini')
251 #     ['example.ini']
252 #     >>> config.sections()
253 #     ['bitbucket.org', 'topsecret.server.com']
254 #     >>> 'bitbucket.org' in config
255 #     True
256 #     >>> 'bytebong.com' in config
257 #     False
258 #     >>> config['bitbucket.org']['User']
259 #     'hg'
260 #     >>> config['DEFAULT']['Compression']
261 #     'yes'
262 #     >>> topsecret = config['topsecret.server.com']
263 #     >>> topsecret['ForwardX11']
264 #     'no'
265 #     >>> topsecret['Port']
266 #     '50022'
267 #     >>> for key in config['bitbucket.org']: print(key)
268 #     user
269 #     compressionlevel
270 #     serveraliveinterval
271 #     compression
272 #     forwardx11
273 #     >>> config['bitbucket.org']['ForwardX11']
274 #     'yes'
275 #
276 #     configparser增删改查语法
277 #
278 #     [section1]
279 #     k1 = v1
280 #     k2: v2
281 #
282 #     [section2]
283 #     k1 = v1
284 #
285 #     import ConfigParser
286 #
287 #     config = ConfigParser.ConfigParser()
288 #     config.read('i.cfg')
289 #     ########## 读 ##########
290 #     secs = config.sections()
291 #     print secs
292 #     options = config.options('group2')
293 #     print options
294 #
295 #     item_list = config.items('group2')
296 #     print item_list
297 #
298 #     val = config.get('group1','key')
299 #     val = config.getint('group1','key')
300 #
301 #     ########## 改写 ##########
302 #     sec = config.remove_section('group1')
303 #     config.write(open('i.cfg', "w"))
304 #
305 #     sec = config.has_section('wupeiqi')
306 #     sec = config.add_section('wupeiqi')
307 #     config.write(open('i.cfg', "w"))
308 #
309 #
310 #     config.set('group2','k1',11111)
311 #     config.write(open('i.cfg', "w"))
312 #
313 #     config.remove_option('group2','age')
314 #     config.write(open('i.cfg', "w"))
315 
316 # j.hashlib模块:用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5算法
317 #     import hashlib
318 #
319 #     m = hashlib.md5()
320 #     m.update(b"Hello")
321 #     m.update(b"It's me")
322 #     print(m.digest())
323 #     m.update(b"It's been a long time since last time we ...")
324 #
325 #     print(m.digest())  # 2进制格式hash
326 #     print(len(m.hexdigest()))  # 16进制格式hash
327 #     '''
328 #     def digest(self, *args, **kwargs): # real signature unknown
329 #         """ Return the digest value as a string of binary data. """
330 #         pass
331 #
332 #     def hexdigest(self, *args, **kwargs): # real signature unknown
333 #         """ Return the digest value as a string of hexadecimal digits. """
334 #         pass
335 #
336 #     '''
337 #     import hashlib
338 #
339 #     # ######## md5 ########
340 #
341 #     hash = hashlib.md5()
342 #     hash.update('admin')
343 #     print(hash.hexdigest())
344 #
345 #     # ######## sha1 ########
346 #
347 #     hash = hashlib.sha1()
348 #     hash.update('admin')
349 #     print(hash.hexdigest())
350 #
351 #     # ######## sha256 ########
352 #
353 #     hash = hashlib.sha256()
354 #     hash.update('admin')
355 #     print(hash.hexdigest())
356 #
357 #     # ######## sha384 ########
358 #
359 #     hash = hashlib.sha384()
360 #     hash.update('admin')
361 #     print(hash.hexdigest())
362 #
363 #     # ######## sha512 ########
364 #
365 #     hash = hashlib.sha512()
366 #     hash.update('admin')
367 #     print(hash.hexdigest())
368 #
369 #     还不够吊?python还有一个hmac模块,它内部对我们创建key和内容再进行处理然后再加密散列消息鉴别码,简称HMAC,是一种基于消息鉴别码MAC(Message Authentication Code)的鉴别机制。使用HMAC时, 消息通讯的双方,通过验证消息中加入的鉴别密钥K来鉴别消息的真伪;
370 #     一般用于网络通信中消息加密,前提是双方先要约定好key, 就像接头暗号一样,然后消息发送把用key把消息加密,接收方用key + 消息明文再加密,拿加密后的值跟发送者的相对比是否相等,这样就能验证消息的真实性,及发送者的合法性了。
371 
372     # import hmac
373     # h = hmac.new('天王盖地虎'.encode(encoding="utf-8"), '宝塔镇河妖'.encode(encoding="utf-8"))
374     # print(h.hexdigest())
375     # https: // www.tbs - certificates.co.uk / FAQ / en / sha256.html
376 
377 # k.re模块:常用正则表达式符号
378 #         '.'
379 #         默认匹配除\n之外的任意一个字符,若指定flagDOTALL, 则匹配任意字符,包括换行
380 #         '^'
381 #         匹配字符开头,若指定flags
382 #         MULTILINE, 这种也可以匹配上(r"^a", "\nabc\neee", flags=re.MULTILINE)
383 #         '$'
384 #         匹配字符结尾(整个字符串以xx结尾),或e.search("foo$", "bfoo\nsdfsf", flags=re.MULTILINE).group()
385 #         也可以
386 #         '*'
387 #         匹配 * 号前的字符0次或多次,re.findall("ab*", "cabb3abcbbac")结果为['abb', 'ab', 'a']
388 #         '+'
389 #         匹配前一个字符1次或多次,re.findall("ab+", "ab+cd+abb+bba")
390 #         结果['ab', 'abb']
391 #         '?'
392 #         匹配前一个字符1次或0次
393 #         '{m}'
394 #         匹配前一个字符m次
395 #         '{n,m}'
396 #         匹配前一个字符n到m次,re.findall("ab{1,3}", "abb abc abbcbbb")
397 #         结果
398 #         ['abb', 'ab', 'abb']
399 #         '|'
400 #         匹配 | 左或 | 右的字符,re.search("abc|ABC", "ABCBabcCD").group()结果'ABC'
401 #         '(...)'
402 #         分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group()结果abcabca456c
403 #         '\A'
404 #         只从字符开头匹配,re.search("\Aabc", "alexabc")是匹配不到的
405 #         '\Z'
406 #         匹配字符结尾,同$
407 #         '\d'
408 #         匹配数字0 - 9
409 #         '\D'
410 #         匹配非数字
411 #         '\w'
412 #         匹配[A-Za-z0-9]
413 #         '\W'
414 #         匹配非[A-Za-z0-9]
415 #         '\s'
416 #         匹配空白字符、\t、\n、\r, re.search("\s+", "ab\tc1\n3").group()结果'\t'
417 #         [a-z]
418 #         匹配[a-z]之间的一个字符
419 
420 #         '(?P<name>...)'
421 #         分组匹配
422 #         re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})", "371481199306143242").groupdict("city")
423 #         结果
424 #         {'province': '3714', 'city': '81', 'birthday': '1993'}
425 #
426 #     最常用的匹配语法
427 #         re.match 从头开始匹配
428 #         re.search 匹配包含  (用的最多)
429 #         re.findall 把所有匹配到的字符放到以列表中的元素返回
430 #         re.split 以匹配到的字符当做列表分隔符
431 #         re.sub      匹配字符并替换
432 #
433 #     反斜杠的困扰:与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。同样,匹配一个数字的"\\d"可以写成r"\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。
434 #
435 #         re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
436 #         M(MULTILINE): 多行模式,改变'^'和'$'的行为(参见上图)
437 #         S(DOTALL): 点任意匹配模式,改变'.'的行为

 

posted @ 2017-06-28 15:52  Bird_getUpEarly  阅读(240)  评论(0编辑  收藏  举报