9. python 模块

Python的datetime模块提供了一个fromtimestamp函数,能够方便地将时间戳转换为datetime类型的时间对象,便于进行日期和时间的操作。
摘要由CSDN通过智能技术生成
什么是模块?
在日常的开发工作中,我们要写很多的python代码,如果都写在一个文件中,会导致代码特别难维护,为了拓展代码的可维护性,我们把函写在不同的文件里,这样每个文件包含的文件就比较少,逻辑更加清楚。在python中,我们创建的文件基本都是以.py结尾,那一个.py的文件就称之为模块。
为了方便管理方便管理模块,python中又引了包(Package)这个概念。每个包下面都有一个__init__.py文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。__init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,举个例子:test目录下面有__init__.py, aaa.py,bbb.py三个文件,如下所示:
[root@localhost ~]# tree test
test
├── aaa.py
├── bbb.py
└── __init__.py

0 directories, 3 files

1. import
Pycharm常用的导入模块的快捷键:alt + enter
有时候一个文件或者一个包中已经出现了一个函数,我们在另一个python代码中需要引入该文件或者该文件的某个函数,那怎么解决呢?
python给我们提供一个关键字import,下面我们来了解一下它的用法:
1,如果是本地导入文件,直接使用:import filename (即:import filename.py)
2,如果导入的是一个包,该包下面必须是有__init__.py文件才可以导入,否则报错,只有有了__init__.py文件,python解析器才会把这个目录当成是的包

常用的导入模块常用的格式:
form xxx import xxx
import xxx
在导入的时候,.py的后缀直接省略,如果是多级的包,或者想导入包里面的函数等,可以使用from进行导入
举个例子:
from aaa import bbb
import os
import ccc.qqq
from ddd.eee import fff
解释:
第一个例子:导入 aaa 包下面的 bbb 模块或者导入 aaa 文件下面的 bbb 类或者函数
第二个例子:直接导入系统模块os模块
第三个例子:直接导入自定义模块文件(这样写比较麻烦,一般都用第一种和第四种)
第四个例子:第一个例子的深化,导入ddd模块包里eee模块文件内的 fff 方法(方法==> "函数" 或者 "类" 或者 "ddd.eee的 别名")
栗子如下:
import ling.test as aaa ##aaa 就是ling.test的别名
print('aaaaaaaaaaaaaaaaaaaaaa')
aaa.hello() ## 别名用法。
print('aaaaaaaaaaaaaaaaaaaaaa')

总结:
导入模块,就是一层一层的调用
仅使用 import导入时, import后面导入的什么,在调用的时候就必须写什么,除非你添加用 from 进行导入。
导入 模块文件 的时候不写后缀名字

2. datetime 时间模块 获取时间
时间模块工作中经常用到的,打印日志等等都会用到时间模块。
先来看看几个子类之间的关系
object
timedelta
tzinfo
time
date
datetime

① time 模块
基本不用于取时间,要取时间推荐使用 datetime 模块
time 独有的用法:
for i in xrange(1,10):
print (i)
time.sleep(3) ##休眠3秒

② datetime 模块
from datetime import datetime
now_time = datetime.now()
print (now_time)
a = now_time.strftime('%Y-%m-%d %H:%M:%S')
print(a)
解释:
1,先导入datetime类
2,通过datetime的now方法就获得当前所需要的时间
3,datetime还是有好多方法的,可以获取year, month,等,请通过dir()方法查看
4,此时我们获得的now_time还是一个datetime类,所以我们需用用strftime方法转换成字符串,strftime的参数就是最终需要字符串的形式。
5,Strftime需要便是时间的参数有很多,下面我们介绍一下最长用的一些参数:
格式参数如下:
%Y 带世纪部分的十制年份
%m 十进制表示的月份
%d 十进制表示的每月的第几天
%H 24小时制的小时
%M 十时制表示的分钟数
%S 十进制的秒数
%c 标准时间,如:04/25/17 14:35:14 类似于这种形式
以上,这几个参数就是最常用到的我们用的时间

另外,在开发过程中,经常要取 昨天的时间,或者 明天的时间,应该怎么办呢?
例子:
from datetime import datetime, timedelta
now_time = datetime.now()
a = now_time.strftime('%c')
print(now_time)
print(a)
b = now_time + timedelta(days=-1)
print(b)
解释:
timedelta 可以接收 days 和 seconds 两个参数,正数代表几天之后的,负数代表几天之前的
所以,b 代表的是一天之前的时间。

3.时间格式互相转换
时间的三种存在方式:时间对象,时间字符串,时间戳。
(1)字符串 转 datetime:
from datetime import datetime
string = '2017-04-25 11:59:58'
time1 = datetime.strptime(string, '%Y-%m-%d %H:%M:%S')
print(time1)
结果:
2017-04-25 11:59:58

(2)datetime 转 字符串:
from datetime import datetime
string = '2017-04-25 11:59:58'
time1 = datetime.strptime(string, '%Y-%m-%d %H:%M:%S')
print(time1)
print(type(time1))
time1_str = datetime.strftime(time1, '%Y-%m-%d %H:%M:%S')
print(time1_str)
print(type(time1_str))
结果:
2017-04-25 11:59:58
<type 'datetime.datetime'>
2017-04-25 11:59:58
<type 'str'>

(3)时间戳 转 时间对象:
from datetime import datetime
import time
time1 = time.time()
print(time1)
time1_str = datetime.fromtimestamp(time1)
print(time1_str)
print(type(time1_str))

结果:
1493107955.66
2017-04-25 16:12:35.660000
<type 'datetime.datetime'>

解释:
1,datetime模块是包装了time模块的,所以只需要了解datetime模块就可以。
2,time.time()是获取当前时间的时间戳,时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。

3,datetime下面下面有个函数 fromtimestamp (时间戳)会把时间戳自动转换成 datetime 类型(时间对象类型)


1. logging 模块
日志是我们排查问题的关键利器,写好日志记录,当我们发生问题时,可以快速定位代码范围进行修改。
Python有给开发者们提供好的日志模块,下面介绍一下logging模块:
首先,我们先来看一个例子:
import logging
logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')
logging.error('This is error message')
logging.critical('This is critical message')
结果:
WARNING:root:This is warning message
ERROR:root:This is error message
CRITICAL:root:This is critical message

默认情况下,logging将日志打印到屏幕
日志级别大小关系为:
CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,当然也可以自己定义日志级别。

● DEBUG:详细的信息,通常只出现在诊断问题上。
● INFO:确认一切按预期运行
● WARNING:一个警告,可能会有一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”),这个软件还能按预期工作
● ERROR:个更严重的问题,软件没能执行一些功能
● CRITICAL:一个严重的错误,这表明程序本身可能无法继续运行

默认logging默认的日志级别是 info,一般基本上所有的程序都是这个级别,有助于我们排查问题,但是当发生问题,我们没法定位到问题,很多情况下我们需要把日志级别提升到debug级别。
如何提升日志级别:
通过logging.basicConfig函数对日志的输出格式及方式做相关配置
import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',datefmt=' %Y/%m/%d %H:%M:%S', filename='myapp.log', filemode='w')
logger = logging.getLogger(__name__)
logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')
logging.error('This is error message')
logging.critical('This is critical message')

结果:
在当前文件新增了一个myapp.log文件,文件的内容如下:
2017/11/10 21:17:42 read.py[line:12] DEBUG This is debug message
2017/11/10 21:17:42 read.py[line:13] INFO This is info message
2017/11/10 21:17:42 read.py[line:14] WARNING This is warning message
2017/11/10 21:17:42 read.py[line:15] ERROR This is error message
2017/11/10 21:17:42 read.py[line:16] CRITICAL This is critical message

解释:
主要是通过logging.basicConfig函数进行操作,现在我们来介绍一下该函数参数的用法:
level: 设置日志级别,默认为logging.WARNING
filename: 指定日志文件名。
filemode: 和file函数意义相同,指定日志文件的打开模式,'w'或'a'
format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示:
%(levelname)s: 打印日志级别名称
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号
%(asctime)s: 打印日志的时间
%(thread)d: 打印线程ID
%(process)d: 打印进程ID
%(message)s: 打印日志信息
datefmt: 指定时间格式,同time.strftime()
stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略
logging.getLogger(__name__)
创建一个日志对象:
返回一个logger实例,如果没有指定name,返回root logger。
只要name相同,返回的logger实例都是同一个而且只有一个,即name和logger实例是一一对应的。
这意味着,无需把logger实例在各个模块中传递。
只要知道name,就能得到同一个logger实例。
logging.getLogger(__name__) 在上述实例中__name__就指的是__main__。

2.os模块
os模块也是我们平时工作中很常用到的一个模块,通过os模块调用系统命令,获得路劲,获取操作系统的类型等都是使用该模块。
下面我们就了解一下os模块。
(1)通过os获取系统类型
import os
print(os.name)
这个就是查看我们系统的类型:
如果是windows系统,os.name = 'nt';
如果是linux系统os.name = 'posix';
不同的操作系统是命令可能不一样。
所以在使用系统命令之前,我们先要判断系统是linux系统还是windows系统。

(2)执行系统命令
通过python来代用系统命令
import os
os.system(‘ipconfig’)
content= os.popen('ipconfig').read()
print(content)
解释:
该代码调用了windows系统的ipconfig命令,ipconfig是用来查看windows系统ip的。
os.system(‘ifconfig’)只会调用系统的命令,但是当我们需要获得系统命令最后的执行结果的时候该怎么办呢?
这时候我们就用 os.popen()方法, os.popen()返回的是一个file对象,我们可以通过 file.read()来获得最后系统命令最终的结果

(3)目录和文件相关操作
① 获得当前目录的路径
import os
print(os.getcwd())
② 列出当前目录的文件
print(os.listdir(os.getcwd()))
③ 切换目录
os.chdir('d:')
④ 列出C:\Python27目录下的文件
print(os.listdir('C:\Python27'))
⑤ 在当前目录下创建abc目录
os.mkdir('abc')
⑥ 删除当前目录下的1.txt文件,(若文件不存在会报错)
os.remove('1.txt')
⑦ 打印操作系统的分隔符,linux系统的分隔符\n,windows系统的分隔符\r\n,mac系统的分隔符\r
print(os.linesep)
⑧ 在当前目录拼接字段,并不出创建 # E:\test\abc.txt 文件
print(os.path.join(os.getcwd(), 'abc.txt'))
返回 # E:\test\abc.txt
print(os.path.islink(os.getcwd()))
返回 # False
⑨ 把最后的文件名和目录分开
path1 = os.path.join(os.getcwd(), 'abc.txt')
print(os.path.split(path1))
返回 # ('E:\\test', 'abc.txt')
⑩ 把第一节目录和后面的分开
print(os.path.splitdrive(path1))
返回 # ('E:', '\\test\\abc.txt')
(11) 把目录文件名和后缀名分开
print(os.path.splitext(path1))
返回 # ('E:\\test\\abc', '.txt')
(12) 若当前目录下存在aaa目录,不创建,当前不存在aaa目录,创建aaa目录
if not os.path.exists(r'E:\test\aaa'):
os.makedirs(r'E:\test\aaa')
(13) 获得E:\test\test.py文件的目录
print(os.path.dirname(r'E:\test\test.py'))
返回 # E:\test

解释:
1,os.getcwd() 获得目录的当前系统程序工作路劲
2,os. chdir(‘目标目录’) 切换到目标目录
3,os.listdir(‘字符串目录’) 列出字符串目录下的所有文件
4,os.makedirs('目录') 创建目录
5,os.remove('1.txt') 删除文件,文件不存在时会报错
6,os.linesep 打印操作系统的分隔符,linux系统的分隔符\n,windows系统的分隔符\r\n,mac系统的分隔符\r
7,os.path.join(os.getcwd(), 'aaa', ‘bbb’, ‘ccc’) 拼接出来多级目录:E:\test\aaa\bbb\ccc
8,os.path.exists(‘目录’) 判断目录是否存在
9,os.path.split(‘文件或者目录’) 把最后的一个目录或者文件和前面的目录分开,返回一个tuple
10,os.path.splitext(‘文件’) 把文件的后缀名和前面分开,返回一个tuple


3.commands 模块只使用于linux的shell模式下
在我们平时码字时,经常需要调用系统脚本或者系统命令来解决很多问题;
一个很好用的模块command,可以通过python调用系统命令;
commands是提供linux系统环境下支持使用shell命令的一个模块;
调用系统命令command模块提供了三种方法:cmd代表系统命令。
(1)commands.getoutput(cmd)
作用:只返回执行shell命令的结果
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import commands
cmd = 'ls /home/admin'
a = commands.getoutput(cmd)
print(type(a))
print(a)
结果:
<type 'str'>
nginx.conf
test.py



(2)commands.getstatusoutput(cmd)
作用:在上面我们在执行shell命令的时候,我们的shell命令可能执行报错,或者异常退出,我们就要有一个条件来判断shell最终执行的结果是什么,commands.getstatusoutput(cmd)的返回结果有两个值。
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import commands
cmd = 'ls /home/admin'
c = commands.getstatusoutput(cmd)
print(type(c))
status, output = commands.getstatusoutput(cmd)
print(status)
print(output)
print(type(output))
结果
<type 'tuple'>
0
nginx.conf
test.py
<type 'str'>
解释:
Commands.getstatusoutput(cmd)的返回结果是一个tuple,第一个值是shell执行的结果,如果 shell 执行成功,返回0,否则,为非0;
第二个是一个字符串,就是我们shell命令的执行结果,python通过一一对应的方式复制给status和output
4. sys 模块
(1) 通过sys模块获取程序的参数
import sys
print('argv[0] = {0} argv [1] = {1}'.format( sys.argv[0], sys.argv[1]))
执行:
python test.py hello
结果:
argv[0] = E:/test/test.py argv [1] = hello
解释:
和其他语言一样,python的sys模块默认是把第一个参数默认是程序本省,从第二个参数起都是代码后面跟着的参数,通过sys.arg[n]就可以获得传入到程序中的参数。


(2) sys.stdin \ stdout \ stderr
功能:stdin , stdout , 以及stderr 变量包含与标准I/O 流对应的流对象。
如果需要更好地控制输出,而print 不能满足你的要求, 它们就是你所需要的。
你也可以替换它们, 这时候你就可以重定向输出和输入到其它设备( device ), 或者以非标准的方式处理它们
(2.1) sys.stdout 与 print
当我们在 Python 中打印对象调用 print obj 时候,事实上是调用了sys.stdout.write(obj+'\n'),print 将你需要的内容打印到了控制台,然后追加了一个换行符,print 会调用 sys.stdout 的 write 方法。
以下两行在事实上等价:
import sys
sys.stdout.write('hello \n') #默认不加换行符,如需要换行,手动添加换行符。
print 'hello'

(2.2)sys.stdin 与 raw_input
import sys
a = raw_input('raw_input_name: ')
print(a)
print 'stdin_name: ' , #逗号保持在同一行上
b = sys.stdin.readline()[:-1] # -1 表示丢弃换行符\n
print(b)

(2.3)从控制台重定向到文件
mport sys
f_handler=open('out.log', 'w')
sys.stdout=f_handler
print 'hello'
在当前文件下新生成一个文件out.log,文件内容为hello


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值