python之路:Day05 --- 常用模块-程序员宅基地

本节内容

  1.模块介绍

  2.sys

  3.os

  4.time & datetime 模块

  5.random

  6.shutil

  7.hashlib

  8.logging

  9.re正则表达式 

  10、shelve

  11、xml 处理

  12、yaml 处理

  13、configpareser

  14、subprocess

一、模块介绍

模块,用一砣代码实现了某个功能的代码集合。 

类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。

如:os 是系统相关的模块;file是文件操作相关的模块

模块分为三种:

  • 自定义模块
  • 内置标准模块(又称标准库)
  • 第三方模块

 二、导入模块   

import module
from module.xx.xx import xx
from module.xx.xx import xx as rename 
from module.xx.xx import *

 导入模块其实就是告诉Python解释器去解释那个py文件

 导入模块要根据 sys.path 系统路径为基准来进行的

import sys
print(sys.path)

结果:
['D:\\pythonDM\\day6', 'D:\\pythonDM', 'C:\\Python3.5\\python36.zip', 'C:\\Python3.5\\DLLs', 'C:\\Python3.5\\lib', 'C:\\Python3.5', 'C:\\Python3.5\\lib\\site-packages']

 如果sys.path路径列表没有你想要的路径,可以通过 sys.path.append('路径') 添加

import sys
import os
project_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(project_path)

二、sys 模块

 用于提供对Python解释器相关的操作:

sys.argv           命令行参数List,第一个元素是程序本身路径
sys.exit(n)        退出程序,正常退出时exit(0)
sys.version        获取Python解释程序的版本信息
sys.maxint         最大的Int值
sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform       返回操作系统平台名称
sys.stdin          输入相关
sys.stdout         输出相关
sys.stderror       错误相关

 三、os 模块

用于提供系统级别的操作:

os.getcwd()                 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname")         改变当前脚本工作目录;相当于shell下cd
os.curdir                   返回当前目录: ('.')
os.pardir                   获取当前目录的父目录字符串名:('..')
os.makedirs('dir1/dir2')    可生成多层递归目录
os.removedirs('dirname1')   若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname')         生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname')         删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname')       列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove()                 删除一个文件
os.rename("oldname","new")  重命名文件/目录
os.stat('path/filename')    获取文件/目录信息
os.pathsep                  用于分割文件路径的字符串
os.system("bash command")   运行shell命令,直接显示
os.environ                  获取系统环境变量
os.path.abspath(path)       返回path规范化的绝对路径
os.path.split(path)         将path分割成目录和文件名二元组返回
os.path.dirname(path)       返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.split(path)的第二个元素
os.path.exists(path)        如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path)         如果path是绝对路径,返回True
os.path.isfile(path)        如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path)         如果path是一个存在的目录,则返回True。否则返回False
os.path.getatime(path)      返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path)      返回path所指向的文件或者目录的最后修改时间

四、time & datetime 模块

时间相关的操作,时间有三种表示方式:

  • 时间戳               1970年1月1日之后的秒,即:time.time()
  • 格式化的字符串    2014-11-11 11:11,    即:time.strftime('%Y-%m-%d')
  • 结构化时间          元组包含了:年、日、星期等... time.struct_time    即:time.localtime()
print time.time()
print time.mktime(time.localtime())
   
print time.gmtime()    #可加时间戳参数
print time.localtime() #可加时间戳参数
print time.strptime('2014-11-11', '%Y-%m-%d')
   
print time.strftime('%Y-%m-%d') #默认当前时间
print time.strftime('%Y-%m-%d',time.localtime()) #默认当前时间
print time.asctime()
print time.asctime(time.localtime())
print time.ctime(time.time())
   
import datetime
'''
datetime.date:表示日期的类。常用的属性有year, month, day
datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond
datetime.datetime:表示日期时间
datetime.timedelta:表示时间间隔,即两个时间点之间的长度
timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
strftime("%Y-%m-%d")
'''
import datetime
print datetime.datetime.now()
print datetime.datetime.now() - datetime.timedelta(days=5)

五、random

import random
 
import random
print(random.random()) # 随机取一个小于1的数字
print(random.randint(1,2)) # 随机取1 或 2
print(random.randrange(1,10)) # 随机取1~9之间的数字
import random
checkcode = ''
for i in range(4):
    current = random.randrange(0,4)
    if current != i:
        temp = chr(random.randint(65,90))
    else:
        temp = random.randint(0,9)
    checkcode += str(temp)
print checkcode
验证码

六、shutil

高级的 文件、文件夹、压缩包 处理模块

shutil.copyfileobj(fsrc, fdst[, length])
将文件内容拷贝到另一个文件中

import shutil
 
shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))

shutil.copyfile(src, dst)
拷贝文件

shutil.copyfile('f1.log', 'f2.log')

 shutil.copymode(src, dst)
仅拷贝权限。内容、组、用户均不变

shutil.copymode('f1.log', 'f2.log'

 shutil.move(src, dst)
递归的去移动文件,它类似mv命令,其实就是重命名。

import shutil
 
shutil.move('folder1', 'folder3')
  

七、hashlib

用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

import hashlib
 
# ######## md5 ########
hash = hashlib.md5()
# help(hash.update)
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest())
print(hash.digest())
 
 
######## sha1 ########
 
hash = hashlib.sha1()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest())
 
# ######## sha256 ########
 
hash = hashlib.sha256()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest())
 
 
# ######## sha384 ########
 
hash = hashlib.sha384()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest())
 
# ######## sha512 ########
 
hash = hashlib.sha512()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest())

 以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。

import hashlib
 
# ######## md5 ########
 
hash = hashlib.md5(bytes('898oaFs09f',encoding="utf-8"))
hash.update(bytes('admin',encoding="utf-8"))
print(hash.hexdigest())

八、logging

用于便捷记录日志

单文件日志
import logging
  
  
logging.basicConfig(filename='log.log',
                    format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S %p',
                    level=10)
  
logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')
logging.log(10,'log')

 日志等级:

CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0

九、re正则表达式

python中re模块提供了正则表达式相关操作

字符:

  . 匹配除换行符以外的任意字符
  \w 匹配字母或数字或下划线或汉字
  \s 匹配任意的空白符
  \d 匹配数字
  \b 匹配单词的开始或结束
  ^ 匹配字符串的开始
  $ 匹配字符串的结束 

次数:

  * 重复零次或更多次
  + 重复一次或更多次
  ? 重复零次或一次
  {n} 重复n次
  {n,} 重复n次或更多次
  {n,m} 重复n到m次

'.'     默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
'^'     匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$'     匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
'*'     匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac")  结果为['abb', 'ab', 'a']
'+'     匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
'?'     匹配前一个字符1次或0次
'{m}'   匹配前一个字符m次
'{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
'|'     匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
'(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c
 
 
'\A'    只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的
'\Z'    匹配字符结尾,同$
'\d'    匹配数字0-9
'\D'    匹配非数字
'\w'    匹配[A-Za-z0-9]
'\W'    匹配非[A-Za-z0-9]
's'     匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
 
'(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").g
常用正则表达式符号

最常用的匹配语法

e.match 从头开始匹配
re.search 匹配包含
re.findall 把所有匹配到的字符放到以列表中的元素返回
re.splitall 以匹配到的字符当做列表分隔符
re.sub      匹配字符并替换 

match

# 无分组
        r = re.match("h\w+", origin)
        print(r.group())     # 获取匹配到的所有结果
        print(r.groups())    # 获取模型中匹配到的分组结果
        print(r.groupdict()) # 获取模型中匹配到的分组结果

# 有分组

        # 为何要有分组?提取匹配成功的指定内容(先匹配成功全部正则,再匹配成功的局部内容提取出来)

        r = re.match("h(\w+).*(?P<name>\d)$", origin)
        print(r.group())     # 获取匹配到的所有结果
        print(r.groups())    # 获取模型中匹配到的分组结果
        print(r.groupdict()) # 获取模型中匹配到的分组中所有执行了key的组
View Code

search

 # 无分组

        r = re.search("a\w+", origin)
        print(r.group())     # 获取匹配到的所有结果
        print(r.groups())    # 获取模型中匹配到的分组结果
        print(r.groupdict()) # 获取模型中匹配到的分组结果

        # 有分组

        r = re.search("a(\w+).*(?P<name>\d)$", origin)
        print(r.group())     # 获取匹配到的所有结果
        print(r.groups())    # 获取模型中匹配到的分组结果
        print(r.groupdict()) # 获取模型中匹配到的分组中所有执行了key的组
View Code

findall

# 无分组
        r = re.findall("a\w+",origin)
        print(r)

        # 有分组
        origin = "hello alex bcd abcd lge acd 19"
        r = re.findall("a((\w*)c)(d)", origin)
        print(r)
View Code

sub

# sub,替换匹配成功的指定位置字符串
 
sub(pattern, repl, string, count=0, flags=0)
# pattern: 正则模型
# repl   : 要替换的字符串或可执行对象
# string : 要匹配的字符串
# count  : 指定匹配个数
# flags  : 匹配模式


# 与分组无关

        origin = "hello alex bcd alex lge alex acd 19"
        r = re.sub("a\w+", "999", origin, 2)
        print(r)
View Code

split

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

 # 无分组
        origin = "hello alex bcd alex lge alex acd 19"
        r = re.split("alex", origin, 1)
        print(r)

        # 有分组
        
        origin = "hello alex bcd alex lge alex acd 19"
        r1 = re.split("(alex)", origin, 1)
        print(r1)
        r2 = re.split("(al(ex))", origin, 1)
        print(r2)
View Code
iP:
^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$
手机号:
^1[3|4|5|8][0-9]\d{8}$
邮箱:
[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+
常用的正则匹配表达式

 

 

、shelve

十一、xml 处理

十二、yaml 处理

十三、configpareser

十四、subprocess

转载于:https://www.cnblogs.com/pizhiyou/p/6284312.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a575771207/article/details/101142619

智能推荐

bootstrap 响应式_Bootstrap-响应式Web设计框架-程序员宅基地

bootstrap 响应式 引导程序 (Bootstrap )Bootstrap - a framework for responsive web design: Web development is on hype and boom these days. And, a web developer has sought out everywhere in the IT industry. Ea..._html.to.design

《从你的全世界路过》观后感-程序员宅基地

九月末上映的电影《从你的全世界路过》到今天我才看了,那么今天我看完这个电影还是有感动到我的,因为我不是一个小说控,不像很多的爱读书的人一般,都有看过原著是什么样的,但是我深深地了解每一部书籍被改编成影视作品都会和原著有所出入的,所以我自己仅仅是想说一下看完影视作品后的感受。 首先开场是陈沫的电台开场独白:“我希望有个如你一般的人,如山间清爽的风,如古城温暖的光。...

vb分页读取word内容_vb6 读取word文本-程序员宅基地

最近在研究word插件开发 ,在读取word内容碰到棘手的地方一一记录下来,下面是分页读取word的内容Dim document As Document = Globals.ThisAddIn.Application.ActiveDocument Dim application As Microsoft.Office.Interop.Word.Application = Gl_vb6 读取word文本

Java 中的 long 与 byte 互转_java long转byte数组-程序员宅基地

long 占 8 个字节,在网络传输时经常用到!public static byte[] LongToBytes(long values) { byte[] buffer = new byte[8]; for (int i = 0; i < 8; i++) { int offset = 64 - (i + 1) * 8;_java long转byte数组

仿知乎首页学习 CoordinateLayout-程序员宅基地

前言第一次接触CoordinateLayout的时候深深的被其炫酷的特效所吸引;想着什么时候在实际项目中可以使用一下,无奈实际项目因行业特点,并不需要使用到CoordinateLayout这么高端的交互体验;所以本着学习的态度,便用CoordinateLayout模仿了一下知乎首页效果,这也是现在掘金APP首页的效果;这种效果其实很友好,能让用户最大限度的使用到手机屏幕。好了,废话不多说,先看...

Android——C语言、JNI与低层调用-程序员宅基地

JNI  java native interfacec的基本数据类型int:32位,能表示的数字是2的32次方个最高位用来表示符号位,那么还剩下31位可以表示数值,所以能表示的数字就是2的31次方个int的表示范围:当最高位是0时:0~2147483647当最高位是1是:-2147483648~-1java的基本数据类型长度c的基...

随便推点

基于LNMP的Discuz论坛的实现-程序员宅基地

1. 源码安装mysql鉴于前边的文章已经详细说过mysql的源码安装 可以点击基于LAMP的Discuz论坛的实现(源码安装)自行查看 这里为了节省时间 用一个shell脚本进行mysql的源码安装 用到的mysql依然是5.6.46 没有源码包的同学可以点击 【mysql-5.6.46.tar.gz 提取码:nli5】进行下载[root@localhost ~]# cat my.sh #!/bin/bashyum -y install bison cmake ncurses-devel open

.Net向微信小程序传回Json被识别为普通string_小程序json数据传过来不是数组_狗子七号的博客-程序员宅基地

问题描述.Net向前台传送Json数据仅被识别为普通的string类型数据。本次开发环境是.net Framework 4.7.2+微信小程序v2.16.0 (2021-03-03)+MongoDB4.4.4。正确的情况:应该是数组类型可以直接在js文件中调用。错误的情况:data中收到的message是“image_sec:http…”这样的普通字符串,无法采用json调用方式。寻根溯源正确的JSON数据格式有三种表示 1. 第一种(纯字典) {key:value,key:v_小程序json数据传过来不是数组

flink 本机运行指定用户_flink 指定用户-程序员宅基地

好久没写东西了 ~~~代码中加个参数就行了System.setProperty("HADOOP_USER_NAME", "hadoop")_flink 指定用户

mysql数据库的crud_mySQL CRUD操作(数据库的增删改查)-程序员宅基地

一、数据库操作1.创建数据库create database数据库名称2.删除数据库drop database数据库名称二、表操作1.创建表create table表名(列名类型(长度)自增长非空主键,)**自增长:auto_increment**主键:primary key**非空:not null**外键:foreign key 从表列名references 主表名(列名)2.删除表drop t..._mysql的crud

利用pyinstaller将Python3.6文件打包成exe程序-程序员宅基地

1.电脑系统为win10 安装的是Python3.6(32位) 2.安装pyinstaller 因为我Python3.6安装在D盘,所以在CMD中定位到D:\Python\Scripts,然后执行命令pip install pyinstaller,等待安装成功之后到https://github.com/pyinstaller/pyinstaller下载ZIP安装包,解压之后将PyInstal

vmware安装找不到虚拟网卡解决方案-程序员宅基地

  前一段实际,win7升级到win10发现vmware12没有虚拟网卡vnet1/vnet8.这不坑爹吗,没网卡能通信吗?在网上搜寻一下发现可以重置网络,即可再次安装虚拟网卡。。。算是对问题的记录学习吧。00、现状发现没有VMnet1/VMnet811、直接在编辑---虚拟网络编辑器---还原默认设置...