python 模块

1.导入模块方法

import module
from module.xx.xx import xx
from module.xx.xx import xx as rename 
from module.xx.xx import *
 
test.py下面代码
if __name__ == '__main__':
  pass
 
a   被调用:text.py被调用时,main里面语句不执行,
b.  自己调用:自身执行时main里面语句执行,用于逻辑测试

1、time

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

  • 时间戳               1970年1月1日之后的秒,即:time.time()
  • 格式化的字符串    2014-11-11 11:11,    即:time.strftime('%Y-%m-%d') 
  • 结构化时间          元组包含了:年、日、星期等... time.struct_time    即:time.localtime()
# 时间模块
import time

# 时间戳
print(time.time())  # 1537550201.7291784

# 时间结构
print(time.localtime())  # time.struct_time(tm_year=2018, tm_mon=9, tm_mday=22, tm_hour=1, tm_min=19, tm_sec=50, tm_wday=5, tm_yday=265, tm_isdst=0)

print(time.localtime().tm_year)  # 2018

# 结构化时间转换为字符串时间
print(time.strftime("%Y-%m-%d %X", time.localtime()))  # 2018-09-22 01:34:01
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))  # 2018-09-22 01:34:01

# 字符串时间转换为结构化时间
print(time.strptime("2018-09-22 01:34:01",
                    "%Y-%m-%d %H:%M:%S"))  # time.struct_time(tm_year=2018, tm_mon=9, tm_mday=22, tm_hour=1, tm_min=34, tm_sec=1, tm_wday=5, tm_yday=265, tm_isdst=-1)

#
print(time.asctime())  # Sat Sep 22 01:40:29 2018
print(time.ctime())  # Sat Sep 22 01:40:29 2018

# datetime模块
import datetime

print(datetime.datetime.now())  # 2018-09-22 01:44:16.817567

2、random

# random模块
import random

print(random.random() * 1000)  # 893.8943826322712
print(random.randint(0, 9))  # 1到100
print(random.randrange(1, 100))  # 1到99
print(random.choice([32, 23, 5, 3]))  # 随机选一个
print(random.sample([32, 23, 5, 3, 2], 3))  # 随机选3个


# 四位数随机验证码 A-Z 65-90 a-z 97-122 0-9
def ident_code(num=4):
    res = ""
    for i in range(num):
        num1 = str(random.randint(0, 9))
        a = chr(random.randint(65, 90))
        b = chr(random.randint(97, 122))
        res += random.choice([num1, a, b])
    return res


print(ident_code())

3、sys BASE_DIR

用于提供对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       错误相关
# BASER_DIR 添加环境变量
import sys, os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)

# from package import module
print(__file__) # C:/Disk_D/pycharm_stu/svn/python/macboy/study/模块.py
print(os.path.dirname(__file__)) # C:/Disk_D/pycharm_stu/svn/python/macboy/study
print(BASE_DIR) # C:/Disk_D/pycharm_stu/svn/python/macboy

# 进度条
for i in range(11):
time.sleep(0.1)
sys.stdout.write('#')
sys.stdout.flush()

4、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.sep                      操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep                  当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep                  用于分割文件路径的字符串
os.name                     字符串指示当前使用平台。win->'nt'; Linux->'posix'
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.basename(path)      返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path)        如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path)         如果path是绝对路径,返回True
os.path.isfile(path)        如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path)         如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path)      返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path)      返回path所指向的文件或者目录的最后修改时间

5、序列化

Python中用于序列化的两个模块

  • json     用于【字符串】和 【python基本数据类型】 间进行转换 序列化字符串
  • pickle   用于【python特有的类型】 和 【python基本数据类型】间进行转换 序列化字节 也可以序列化对象

Json模块提供了四个功能:dumps、dump、loads、load

pickle模块提供了四个功能:dumps、dump、loads、load


# json json字符串必须是双引号
# dumps 字典序列化为json格式
# loads json格式反序列化为dict
import json

dic = {'name': 'zq', 'age': 101}
print(json.dumps(dic))  # {"age": 101, "name": "zq"}
with open('json_text.txt', "w", encoding='utf-8') as f:
    f.write(json.dumps(dic) + "\n")
l = []
with open('json_text.txt', encoding='utf-8') as f:
    for i in f:
        l.append(json.loads(i.strip()))

for i in range(len(l)):
    print("名字是:%s,年龄是:%s" % (l[i]['name'], l[i]['age'])) # 名字是:zq,年龄是:101
# pickle 序列化bit流
import pickle
d = {'name':'zxq','age':12}
d_dumps = pickle.dumps(d) #生成bit流
print(d_dumps)

d_loads = pickle.loads(d_dumps) #反序列化字典
print(d_loads)

6、xml

7、re

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

字符:

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

次数:

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

#match(pattern, string, flags=0)
# pattern: 正则模型
# string : 要匹配的字符串
# falgs : 匹配模式


# search,浏览整个字符串去匹配第一个,未匹配成功返回None
# search(pattern, string, flags=0)


# findall,获取非重复的匹配列表;如果有一个组则以列表形式返回,且每一个匹配均是字符串;如果模型中有多个组,则以列表形式返回,且每一个匹配均是元祖;
# 空的匹配也会包含在结果中
# findall(pattern, string, flags=0)


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


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



# split,根据正则匹配分割字符串


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

 

 推荐格式:

pattern = "正则匹配项"
re.compile(pattern).findall("内容")

'''
参考
https://www.cnblogs.com/tina-python/p/5508402.html
常用匹配
ip地址 ipaddr = r'\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b'
手机号 phone_num = r'1\d{10}'
邮箱 email = r"\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}\b"
链接地址 url = r"http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*,]|(?:%[0-9a-fA-F][0-9a-fA-F]))+"

'''

匹配ip地址
content = ['dfdui256.3.1.1d=1232 df', 'abdffuid=22222 dfsf', '256.5.1.24dffd', 'fdsuid=rrfa', '1.2.1.2', '2.2.2.2','电放费256.1.1.1d']
ipaddr1 = r'\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b' #['1.2.1.2', '2.2.2.2']
ipaddr2 = r'\w(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' #['256.3.1.1', '256.5.1.24', '256.1.1.1']
ipaddr3 = r'\w*(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' #['dfdui256.3.1.1', '256.5.1.24', '1.2.1.2', '2.2.2.2', '电放费256.1.1.1']

pattern = r"\wuid=(\d+)"
pattern1 = r"\b(\d+)\b" # ['3', '1', '1232', '22222', '256', '5', '1', '1', '2', '1', '2', '2', '2', '2', '2', '1', '1']
res_ip = re.compile(ipaddr1)
list_ip = []
for i in content:
res = res_ip.findall(i)
if len(res) > 0:
list_ip += res
print(list_ip)

8、configparser

configparser用于处理特定格式的文件,其本质上是利用open来操作文件。

# configparser模块

#  创建文件
'''
[DEFAULT]
forwardx11 = yes

[default]
serveraliveinterval = 45
compressionlevel = 9
compression = yes

[bitbucket.org]
user = hg

[topsecret.server.com]
host port = 50022
forwardx11 = no

[MYSQL]
ip addr = 10.1.1.1
host port = 3306
user name = zxq
pssword = zxq
'''
import configparser as confpar

data = {'ServerAliveInterval': '45',
        'Compression': 'yes',
        'CompressionLevel': '9', }
config = confpar.ConfigParser()  # 生成对象
config["default"] = data  # 将字典写入

config['bitbucket.org'] = {}  # 用生成类似文件内容头
config['bitbucket.org']['User'] = 'hg'  # 内容头添加字段

config['topsecret.server.com'] = {}
topsecret = config['topsecret.server.com']
topsecret['Host Port'] = '50022'  #
topsecret['ForwardX11'] = 'no'  #

config['DEFAULT']['ForwardX11'] = 'yes'

config['MYSQL'] = {}
mysqlconf = config['MYSQL']
mysqlconf['Ip Addr'] = '10.1.1.1'
mysqlconf['Host Port'] = '3306'
mysqlconf['User Name'] = 'zxq'
mysqlconf['Password'] = 'zxq'

with open('config.ini', 'w', encoding='utf-8') as f:
    config.write(f)
 
# configparse 文件操作 增删改查
import configparser as confpar

config = confpar.ConfigParser()
config.read('config.ini')

# 查询
print(config.sections())  # ['default', 'bitbucket.org', 'topsecret.server.com', 'MYSQL']
print(config.options('MYSQL'))  # ['ip addr', 'host port', 'user name', 'pssword', 'forwardx11']
print(config.items(
    "MYSQL"))  # [('forwardx11', 'yes'), ('ip addr', '10.1.1.1'), ('host port', '3306'), ('user name', 'zxq'), ('pssword', 'zxq')]
print(config['MYSQL']['ip addr'])  # 10.1.1.1
print(config.get("MYSQL", "ip addr"))  # 10.1.1.1

# 添加
# config.add_section('TEST')  # 添加标签头
# config.set('TEST', 'age', '10')  # 添加内容
#  显示
# [TEST]
# age = 10


# 删除
# config.remove_option('TEST', 'name')
# config.remove_section("TEST")

# 修改
# config.set('TEST', 'name', 'zhangsan')
# print(config.get("TEST", "name"))

# 保存
# config.write(open('config.ini', 'w'))

9、logging

用于便捷记录日志且线程安全的模块

日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET

默认情况下logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING,默认的日志格式为日志级别:Logger名称:用户输出消息。

logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有
filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。
level:设置rootlogger(后边会讲解具体概念)的日志级别
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open('test.log','w')),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。

format参数中可能用到的格式化串:
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s用户输出的消息

 

# 模块logging
import logging as log
import time


file_name = "access_"+str(time.strftime("%Y%m%d", time.localtime()))+".log"
log.basicConfig(
    level=log.ERROR,   # 日志级别
    filename=file_name,  # 保存的文件名
    filemode='a',        # 文件打开没事
    format="%(asctime)s %(levelno)s %(message)s"
)
log.debug('debug message')
log.info('info message')
log.warning('warning message')
log.error('error message')
log.critical('critical message')

# 显示
# 2019-02-27 17:58:24,829 40 error message
# 2019-02-27 17:58:24,829 50 critical message
# 2019-02-27 17:58:26,463 40 error message
# 2019-02-27 17:58:26,469 50 critical message
# 2019-02-27 17:58:27,877 40 error message
# 2019-02-27 17:58:27,877 50 critical message

 

 

logger对象:

上述几个例子中我们了解到了logging.debug()、logging.info()、logging.warning()、logging.error()、logging.critical()(分别用以记录不同级别的日志信息),logging.basicConfig()(用默认日志格式(Formatter)为日志系统建立一个默认的流处理器(StreamHandler),设置基础配置(如日志级别等)并加到root logger(根Logger)中)这几个logging模块级别的函数,另外还有一个模块级别的函数是logging.getLogger([name])(返回一个logger对象,如果没有指定名字将返回root logger)

import logging as log
import time


file_name = "access_"+str(time.strftime("%Y%m%d", time.localtime()))+".log"

def logger(root='root'):
    logger = log.getLogger(root)  # 创建log对象
    logger.setLevel("ERROR")  # 定义日志级别
    fm = log.Formatter("%(asctime)s | %(name)s | %(levelname)s | %(module)s:%(message)s",
                       datefmt='%Y-%m-%d %H:%M:%S %p', )  # 日志格式

    fileh = log.FileHandler(file_name)  # 创建一个handler,用于写入日志文件
    fileh.setFormatter(fm)
    logger.addHandler(fileh)

    streamh = log.StreamHandler()  # 再创建一个handler,用于输出到控制台
    streamh.setFormatter(fm)
    logger.addHandler(streamh)

    return logger

l = logger()
l.debug('debug message')
l.info('info message')
l.warning('warning message')
l.error('error message')
l.critical('critical message')

# 显示
# 2019-02-27 18:21:24 PM | root | ERROR | test:error message
# 2019-02-27 18:21:24 PM | root | CRITICAL | test:critical message
# 2019-02-27 18:21:26 PM | root | ERROR | test:error message
# 2019-02-27 18:21:26 PM | root | CRITICAL | test:critical message
# 2019-02-27 18:21:27 PM | root | ERROR | test:error message
# 2019-02-27 18:21:27 PM | root | CRITICAL | test:critical message

10.hashlib

用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 解密网站:https://cmd5.com/

#  hashlib
import hashlib

# 简单用法
# ######## md5 ########
hash = hashlib.md5()
# help(hash.update)
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest())
print(hash.digest())



# 加盐
import hashlib

# ######## md5 ########

hash = hashlib.md5(bytes('df23df12sf', encoding="utf-8"))
hash.update(bytes('admin', encoding="utf-8"))
print(hash.hexdigest())


# hmac
import hmac

h = hmac.new(bytes('898oaFs09f', encoding="utf-8"))
h.update(bytes('admin', encoding="utf-8"))
print(h.hexdigest())

11.subprocess

call 

执行命令,返回状态码

check_call

执行命令,如果执行状态码是 0 ,则返回0,否则抛异常

check_output

执行命令,如果状态码是 0 ,则返回执行结果,否则抛异常

import subprocess

ret = subprocess.call(["ls", "-l"], shell=False)
ret = subprocess.call("ls -l", shell=True)

subprocess.check_call(["ls", "-l"])
subprocess.check_call("exit 1", shell=True)

subprocess.check_output(["echo", "Hello World!"])
subprocess.check_output("exit 1", shell=True)

subprocess.Popen(...)

用于执行复杂的系统命令

subprocess.PIPE

在创建Popen对象时,subprocess.PIPE可以初始化stdin, stdout或stderr参数。表示与子进程通信的标准流。

 


import subprocess
cmd = input(">>: ").strip()

cmd = '''netstat -ant | awk '/tcp/{print $5}' | cut -d ":" -f1 |grep -v "^$" | grep -v "0.0.0.0" |uniq'''
res = subprocess.Popen(cmd, shell=True,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE,
stdin=subprocess.PIPE)

res_error = res.stderr.read() # 读取错误信息标准流
res_out = res.stdout.read() # 读取正确信息标准流

print(res_error.decode("gbk"))
print(res_out.decode("gbk"))
 

 

参数:

    • args:shell命令,可以是字符串或者序列类型(如:list,元组)
    • bufsize:指定缓冲。0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲
    • stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
    • preexec_fn:只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用
    • close_sfs:在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道。
      所以不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。
    • shell:同上
    • cwd:用于设置子进程的当前目录
    • env:用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。
    • universal_newlines:不同系统的换行符不同,True -> 同意使用 \n
    • startupinfo与createionflags只在windows下有效
      将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等

 12.struct

import struct
length_data = len("alldata") #7个字节
print(length_data) # 7
length = struct.pack('i',length_data) #生成bit流
print(length) # b'\x07\x00\x00\x00'

length_data=struct.unpack('i',length) #是一个tuple
print(length_data[0]) # 7

 

 

 

 

参考:

http://www.cnblogs.com/wupeiqi/articles/5501365.html

http://www.cnblogs.com/yuanchenqi/articles/5732581.html

 

posted @ 2019-02-27 00:09  风追海浪  阅读(164)  评论(0)    收藏  举报