OS 模块javascript
os模块就是对操做系统进行操做,使用该模块必须先导入模块:import oshtml
getcwd() 获取当前工做目录(当前工做目录默认都是当前文件所在的文件夹)
result = os.getcwd()
print(result)java
chdir()改变当前工做目录
os.chdir('/home/sy')
result = os.getcwd()
print(result)node
open('02.txt','w')python
操做时若是书写完整的路径则不须要考虑默认工做目录的问题,按照实际书写路径操做
open('/home/sy/下载/02.txt','w')linux
listdir() 获取指定文件夹中全部内容的名称列表
result = os.listdir('/home/sy')
print(result)git
mkdir() 建立文件夹
os.mkdir('girls')
os.mkdir('boys',0o777)github
makedirs() 递归建立文件夹
os.makedirs('/home/sy/a/b/c/d')web
rmdir() 删除空目录
os.rmdir('girls')算法
removedirs 递归删除文件夹 必须都是空目录
os.removedirs('/home/sy/a/b/c/d')
rename() 文件或文件夹重命名
os.rename('/home/sy/a','/home/sy/alibaba'
os.rename('02.txt','002.txt')
stat() 获取文件或者文件夹的信息
result = os.stat('/home/sy/PycharmProject/Python3/10.27/01.py)
print(result)
system() 执行系统命令(危险函数)
result = os.system('ls -al') #获取隐藏文件
print(result)
环境变量
环境变量就是一些命令的集合
操做系统的环境变量就是操做系统在执行系统命令时搜索命令的目录的集合
导入os模块 import os:
abspath() 将相对路径转化为绝对路径
path = './boys'#相对
result = os.path.abspath(path)
print(result)
dirname() 获取完整路径当中的目录部分 & basename()获取完整路径当中的主体部分
path = '/home/sy/boys'
result = os.path.dirname(path)
print(result)
result = os.path.basename(path)
print(result)
split() 将一个完整的路径切割成目录部分和主体部分
path = '/home/sy/boys'
result = os.path.split(path)
print(result)
join() 将2个路径合并成一个
var1 = '/home/sy'
var2 = '000.py'
result = os.path.join(var1,var2)
print(result)
splitext() 将一个路径切割成文件后缀和其余两个部分,主要用于获取文件的后缀
path = '/home/sy/000.py'
result = os.path.splitext(path)
print(result)
getsize() 获取文件的大小
path = '/home/sy/000.py'
result = os.path.getsize(path)
print(result)
isfile() 检测是不是文件
path = '/home/sy/000.py'
result = os.path.isfile(path)
print(result)
isdir() 检测是不是文件夹
result = os.path.isdir(path)
print(result)
islink() 检测是不是连接
path = '/initrd.img.old'
result = os.path.islink(path)
print(result)
getctime() 获取文件的建立时间 get create time
getmtime() 获取文件的修改时间 get modify time
getatime() 获取文件的访问时间 get active time
import time
filepath = '/home/sy/下载/chls'
result = os.path.getctime(filepath)
print(time.ctime(result))
result = os.path.getmtime(filepath)
print(time.ctime(result))
result = os.path.getatime(filepath)
print(time.ctime(result))
os 经常使用方法:
time模块中时间表现的格式主要有三种:
a、timestamp时间戳,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量
b、struct_time时间元组,共有九个元素组。
c、format time 格式化时间,已格式化的结构使时间更具可读性。包括自定义格式和固定格式。
一、时间格式转换图:
二、主要time生成方法和time格式转换方法实例:
--sleep:休眠指定的秒数(能够是小数)
import time print("开始") time.sleep(5) print("结束") #若是在pycharm中输入这段代码,从开始到结束,中间会停留5秒,sleep后面的括号里面填的数字就是秒数
--time:获取时间戳
import time t = time.time() print(t) #这段代码是获取时间戳(从1970-01-01 00:00:00到你输入代码运行时的秒数)
--localtime:将时间戳转换为对象
import time local_time = time.localtime() print(local_time) #会打印出此时此刻的年月日时分秒 print(local_time.tm_year) #指定输出对应的年份 print(local_time[0]) #也能够指定下标输出年份
mktime:根据年月日等信息转换为时间戳
import time new_time = time.mktime((2099, 9, 9, 10, 10, 10, 1, 212, 0)) #上面括号里面是填写自定义的时间,要写够9个数字 print(new_time) #输出的时1970-01-01 00:00:00到自定义时间的秒数
gmtime:功能同localtime
import time gt = time.gmtime() print(gt) #输出当前时间的年月日时分秒
timezone:0时区到你所在的时区的相差秒数(/3600 = 小时)
import time print(time.timezone/3600) #我所在的是东8区,因此输出的是-8.0
strftime:将time.struct_time对象格式化显示
import time local_time = time.localtime() # 格式化显示 print(time.strftime('%Y-%m-%d %H:%M:%S', local_time)) #规定输出的格式 print(time.strftime('%D', local_time)) #\D是一种特定的显示格式 月/日/年 #%Y:年(4位), %y:年(2位), %m:月, %d:日, %D:月/日/年, %H:时 #%M:分, %S:秒, %w:星期(1~7), %W:本周是今年的第几周 # 特定的显示格式 print(time.asctime()) #格式输出当前的时间
format time结构化表示
格式 | 含义 |
---|---|
%a | 本地(locale)简化星期名称 |
%A | 本地完整星期名称 |
%b | 本地简化月份名称 |
%B | 本地完整月份名称 |
%c | 本地相应的日期和时间表示 |
%d | 一个月中的第几天(01 - 31) |
%H | 一天中的第几个小时(24小时制,00 - 23) |
%I | 第几个小时(12小时制,01 - 12) |
%j | 一年中的第几天(001 - 366) |
%m | 月份(01 - 12) |
%M | 分钟数(00 - 59) |
%p | 本地am或者pm的相应符 |
%S | 秒(01 - 61) |
%U | 一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天以前的全部天数都放在第0周。 |
%w | 一个星期中的第几天(0 - 6,0是星期天) |
%W | 和%U基本相同,不一样的是%W以星期一为一个星期的开始。 |
%x | 本地相应日期 |
%X | 本地相应时间 |
%y | 去掉世纪的年份(00 - 99) |
%Y | 完整的年份 |
%Z | 时区的名字(若是不存在为空字符) |
%% | ‘%’字符 |
datatime模块从新封装了time模块,提供更多接口,提供的类有:date,time,datetime,timedelta,tzinfo。
一、date类
datetime.date(year, month, day)
静态方法和字段
方法和属性
二、time类
datetime.time(hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] )
静态方法和字段
方法和属性
三、datetime类
datetime至关于date和time结合起来。
datetime.datetime (year, month, day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] )
静态方法和字段
方法和属性
python中的hashlib模块用来进行hash或者md5加密,并且这种加密是不可逆的,因此这种算法又被称为摘要算法。其支持Openssl库提供的全部算法,包括md五、sha一、sha22四、sha25六、sha512等。
经常使用的属性和方法:
logging模块是Python内置的标准模块,主要用于输出运行日志,能够设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具有以下优势:
配置logging基本的设置,而后在控制台输出日志,
import logging logging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s') logger = logging.getLogger(__name__) logger.info("Start print log") logger.debug("Do something") logger.warning("Something maybe fail.") logger.info("Finish")
运行时,控制台输出,
2016-10-09 19:11:19,434 - __main__ - INFO - Start print log 2016-10-09 19:11:19,434 - __main__ - WARNING - Something maybe fail. 2016-10-09 19:11:19,434 - __main__ - INFO - Finish
logging中能够选择不少消息级别,如debug、info、warning、error以及critical。经过赋予logger或者handler不一样的级别,开发者就能够只输出错误信息到特定的记录文件,或者在调试时只记录调试信息。
例如,咱们将logger的级别改成DEBUG,再观察一下输出结果,
logging.basicConfig(level = logging.DEBUG,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
控制台输出,能够发现,输出了debug的信息。
2016-10-09 19:12:08,289 - __main__ - INFO - Start print log 2016-10-09 19:12:08,289 - __main__ - DEBUG - Do something 2016-10-09 19:12:08,289 - __main__ - WARNING - Something maybe fail. 2016-10-09 19:12:08,289 - __main__ - INFO - Finish
logging.basicConfig函数各参数:
filename:指定日志文件名;
filemode:和file函数意义相同,指定日志文件的打开模式,'w'或者'a';
format:指定输出的格式和内容,format能够输出不少有用的信息,
参数:做用 %(levelno)s:打印日志级别的数值 %(levelname)s:打印日志级别的名称 %(pathname)s:打印当前执行程序的路径,其实就是sys.argv[0] %(filename)s:打印当前执行程序名 %(funcName)s:打印日志的当前函数 %(lineno)d:打印日志的当前行号 %(asctime)s:打印日志的时间 %(thread)d:打印线程ID %(threadName)s:打印线程名称 %(process)d:打印进程ID %(message)s:打印日志信息
datefmt:指定时间格式,同time.strftime();
level:设置日志级别,默认为logging.WARNNING;
stream:指定将日志的输出流,能够指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略;
2.2.1 将日志写入到文件
设置logging,建立一个FileHandler,并对输出消息的格式进行设置,将其添加到logger,而后将日志写入到指定的文件中,
import logging logger = logging.getLogger(__name__) logger.setLevel(level = logging.INFO) handler = logging.FileHandler("log.txt") handler.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) logger.info("Start print log") logger.debug("Do something") logger.warning("Something maybe fail.") logger.info("Finish")
log.txt中日志数据为,
2016-10-09 19:01:13,263 - __main__ - INFO - Start print log 2016-10-09 19:01:13,263 - __main__ - WARNING - Something maybe fail. 2016-10-09 19:01:13,263 - __main__ - INFO - Finish
2.2.2 将日志同时输出到屏幕和日志文件
logger中添加StreamHandler,能够将日志输出到屏幕上,
import logging logger = logging.getLogger(__name__) logger.setLevel(level = logging.INFO) handler = logging.FileHandler("log.txt") handler.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) console = logging.StreamHandler() console.setLevel(logging.INFO) logger.addHandler(handler) logger.addHandler(console) logger.info("Start print log") logger.debug("Do something") logger.warning("Something maybe fail.") logger.info("Finish")
能够在log.txt文件和控制台中看到,
2016-10-09 19:20:46,553 - __main__ - INFO - Start print log 2016-10-09 19:20:46,553 - __main__ - WARNING - Something maybe fail. 2016-10-09 19:20:46,553 - __main__ - INFO - Finish
能够发现,logging有一个日志处理的主对象,其余处理方式都是经过addHandler添加进去,logging中包含的handler主要有以下几种,
handler名称:位置;做用 StreamHandler:logging.StreamHandler;日志输出到流,能够是sys.stderr,sys.stdout或者文件 FileHandler:logging.FileHandler;日志输出到文件 BaseRotatingHandler:logging.handlers.BaseRotatingHandler;基本的日志回滚方式 RotatingHandler:logging.handlers.RotatingHandler;日志回滚方式,支持日志文件最大数量和日志文件回滚 TimeRotatingHandler:logging.handlers.TimeRotatingHandler;日志回滚方式,在必定时间区域内回滚日志文件 SocketHandler:logging.handlers.SocketHandler;远程输出日志到TCP/IP sockets DatagramHandler:logging.handlers.DatagramHandler;远程输出日志到UDP sockets SMTPHandler:logging.handlers.SMTPHandler;远程输出日志到邮件地址 SysLogHandler:logging.handlers.SysLogHandler;日志输出到syslog NTEventLogHandler:logging.handlers.NTEventLogHandler;远程输出日志到Windows NT/2000/XP的事件日志 MemoryHandler:logging.handlers.MemoryHandler;日志输出到内存中的指定buffer HTTPHandler:logging.handlers.HTTPHandler;经过"GET"或者"POST"远程输出到HTTP服务器
2.2.3 日志回滚
能够在工程目录中看到,备份的日志文件,
2016/10/09 19:36 732 log.txt 2016/10/09 19:36 967 log.txt.1 2016/10/09 19:36 985 log.txt.2 2016/10/09 19:36 976 log.txt.3
能够设置不一样的日志等级,用于控制日志的输出,
日志等级:使用范围 FATAL:致命错误 CRITICAL:特别糟糕的事情,如内存耗尽、磁盘空间为空,通常不多使用 ERROR:发生错误时,如IO操做失败或者链接问题 WARNING:发生很重要的事件,可是并非错误时,如用户登陆密码错误 INFO:处理请求或者状态变化等平常事务 DEBUG:调试过程当中使用DEBUG等级,如算法中每一个循环的中间状态
Python中的traceback模块被用于跟踪异常返回信息,能够在logging中记录下traceback,
import logging logger = logging.getLogger(__name__) logger.setLevel(level = logging.INFO) handler = logging.FileHandler("log.txt") handler.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) console = logging.StreamHandler() console.setLevel(logging.INFO) logger.addHandler(handler) logger.addHandler(console) logger.info("Start print log") logger.debug("Do something") logger.warning("Something maybe fail.") try: open("sklearn.txt","rb") except (SystemExit,KeyboardInterrupt): raise except Exception: logger.error("Faild to open sklearn.txt from logger.error",exc_info = True) logger.info("Finish")
控制台和日志文件log.txt中输出,
Start print log Something maybe fail. Faild to open sklearn.txt from logger.error Traceback (most recent call last): File "G:\zhb7627\Code\Eclipse WorkSpace\PythonTest\test.py", line 23, in <module> open("sklearn.txt","rb") IOError: [Errno 2] No such file or directory: 'sklearn.txt' Finish
也可使用logger.exception(msg,_args),它等价于logger.error(msg,exc_info = True,_args),
将
logger.error("Faild to open sklearn.txt from logger.error",exc_info = True)
替换为,
logger.exception("Failed to open sklearn.txt from logger.exception")
控制台和日志文件log.txt中输出,
Start print log Something maybe fail. Failed to open sklearn.txt from logger.exception Traceback (most recent call last): File "G:\zhb7627\Code\Eclipse WorkSpace\PythonTest\test.py", line 23, in <module> open("sklearn.txt","rb") IOError: [Errno 2] No such file or directory: 'sklearn.txt' Finish
主模块mainModule.py,
import logging import subModule logger = logging.getLogger("mainModule") logger.setLevel(level = logging.INFO) handler = logging.FileHandler("log.txt") handler.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) console = logging.StreamHandler() console.setLevel(logging.INFO) console.setFormatter(formatter) logger.addHandler(handler) logger.addHandler(console) logger.info("creating an instance of subModule.subModuleClass") a = subModule.SubModuleClass() logger.info("calling subModule.subModuleClass.doSomething") a.doSomething() logger.info("done with subModule.subModuleClass.doSomething") logger.info("calling subModule.some_function") subModule.som_function() logger.info("done with subModule.some_function")
子模块subModule.py,
import logging module_logger = logging.getLogger("mainModule.sub") class SubModuleClass(object): def __init__(self): self.logger = logging.getLogger("mainModule.sub.module") self.logger.info("creating an instance in SubModuleClass") def doSomething(self): self.logger.info("do something in SubModule") a = [] a.append(1) self.logger.debug("list a = " + str(a)) self.logger.info("finish something in SubModuleClass") def som_function(): module_logger.info("call function some_function")
执行以后,在控制和日志文件log.txt中输出,
2016-10-09 20:25:42,276 - mainModule - INFO - creating an instance of subModule.subModuleClass 2016-10-09 20:25:42,279 - mainModule.sub.module - INFO - creating an instance in SubModuleClass 2016-10-09 20:25:42,279 - mainModule - INFO - calling subModule.subModuleClass.doSomething 2016-10-09 20:25:42,279 - mainModule.sub.module - INFO - do something in SubModule 2016-10-09 20:25:42,279 - mainModule.sub.module - INFO - finish something in SubModuleClass 2016-10-09 20:25:42,279 - mainModule - INFO - done with subModule.subModuleClass.doSomething 2016-10-09 20:25:42,279 - mainModule - INFO - calling subModule.some_function 2016-10-09 20:25:42,279 - mainModule.sub - INFO - call function some_function 2016-10-09 20:25:42,279 - mainModule - INFO - done with subModule.some_function
首先在主模块定义了logger'mainModule',并对它进行了配置,就能够在解释器进程里面的其余地方经过getLogger('mainModule')获得的对象都是同样的,不须要从新配置,能够直接使用。定义的该logger的子logger,均可以共享父logger的定义和配置,所谓的父子logger是经过命名来识别,任意以'mainModule'开头的logger都是它的子logger,例如'mainModule.sub'。
实际开发一个application,首先能够经过logging配置文件编写好这个application所对应的配置,能够生成一个根logger,如'PythonAPP',而后在主函数中经过fileConfig加载logging配置,接着在application的其余地方、不一样的模块中,可使用根logger的子logger,如'PythonAPP.Core','PythonAPP.Web'来进行log,而不须要反复的定义和配置各个模块的logger。
尽管能够在Python代码中配置logging,可是这样并不够灵活,最好的方法是使用一个配置文件来配置。在Python 2.7及之后的版本中,能够从字典中加载logging配置,也就意味着能够经过JSON或者YAML文件加载日志的配置。
JSON配置文件,
{ "version":1, "disable_existing_loggers":false, "formatters":{ "simple":{ "format":"%(asctime)s - %(name)s - %(levelname)s - %(message)s" } }, "handlers":{ "console":{ "class":"logging.StreamHandler", "level":"DEBUG", "formatter":"simple", "stream":"ext://sys.stdout" }, "info_file_handler":{ "class":"logging.handlers.RotatingFileHandler", "level":"INFO", "formatter":"simple", "filename":"info.log", "maxBytes":"10485760", "backupCount":20, "encoding":"utf8" }, "error_file_handler":{ "class":"logging.handlers.RotatingFileHandler", "level":"ERROR", "formatter":"simple", "filename":"errors.log", "maxBytes":10485760, "backupCount":20, "encoding":"utf8" } }, "loggers":{ "my_module":{ "level":"ERROR", "handlers":["info_file_handler"], "propagate":"no" } }, "root":{ "level":"INFO", "handlers":["console","info_file_handler","error_file_handler"] } }
经过JSON加载配置文件,而后经过logging.dictConfig配置logging,
import json import logging.config import os def setup_logging(default_path = "logging.json",default_level = logging.INFO,env_key = "LOG_CFG"): path = default_path value = os.getenv(env_key,None) if value: path = value if os.path.exists(path): with open(path,"r") as f: config = json.load(f) logging.config.dictConfig(config) else: logging.basicConfig(level = default_level) def func(): logging.info("start func") logging.info("exec func") logging.info("end func") if __name__ == "__main__": setup_logging(default_path = "logging.json") func()
经过YAML文件进行配置,比JSON看起来更加简介明了,
version: 1 disable_existing_loggers: False formatters: simple: format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s" handlers: console: class: logging.StreamHandler level: DEBUG formatter: simple stream: ext://sys.stdout info_file_handler: class: logging.handlers.RotatingFileHandler level: INFO formatter: simple filename: info.log maxBytes: 10485760 backupCount: 20 encoding: utf8 error_file_handler: class: logging.handlers.RotatingFileHandler level: ERROR formatter: simple filename: errors.log maxBytes: 10485760 backupCount: 20 encoding: utf8 loggers: my_module: level: ERROR handlers: [info_file_handler] propagate: no root: level: INFO handlers: [console,info_file_handler,error_file_handler]
经过YAML加载配置文件,而后经过logging.dictConfig配置logging,
import yaml import logging.config import os def setup_logging(default_path = "logging.yaml",default_level = logging.INFO,env_key = "LOG_CFG"): path = default_path value = os.getenv(env_key,None) if value: path = value if os.path.exists(path): with open(path,"r") as f: config = yaml.load(f) logging.config.dictConfig(config) else: logging.basicConfig(level = default_level) def func(): logging.info("start func") logging.info("exec func") logging.info("end func") if __name__ == "__main__": setup_logging(default_path = "logging.yaml") func()
subprocess是Python 2.4中新增的一个模块,它容许你生成新的进程,链接到它们的 input/output/error 管道,并获取它们的返回(状态)码。这个模块的目的在于替换几个旧的模块和方法,如:
函数 | 描述 |
---|---|
subprocess.run() | Python 3.5中新增的函数。执行指定的命令,等待命令执行完成后返回一个包含执行结果的CompletedProcess类的实例。 |
subprocess.call() | 执行指定的命令,返回命令执行状态,其功能相似于os.system(cmd)。 |
subprocess.check_call() | Python 2.5中新增的函数。 执行指定的命令,若是执行成功则返回状态码,不然抛出异常。其功能等价于subprocess.run(..., check=True)。 |
subprocess.check_output() | Python 2.7中新增的的函数。执行指定的命令,若是执行状态码为0则返回命令执行结果,不然抛出异常。 |
subprocess.getoutput(cmd) | 接收字符串格式的命令,执行命令并返回执行结果,其功能相似于os.popen(cmd).read()和commands.getoutput(cmd)。 |
subprocess.getstatusoutput(cmd) | 执行cmd命令,返回一个元组(命令执行状态, 命令执行结果输出),其功能相似于commands.getstatusoutput()。 |
说明:
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False, universal_newlines=False) subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None) subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None) subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False, timeout=None) subprocess.getstatusoutput(cmd) subprocess.getoutput(cmd)
须要说明的是,subprocess.run()函数是Python3.5中新增的一个高级函数,其返回值是一个subprocess.CompletedPorcess类的实例,所以,subprocess.completedPorcess类也是Python 3.5中才存在的。它表示的是一个已结束进程的状态信息,它所包含的属性以下:
>>> subprocess.run(["ls", "-l"]) # doesn't capture output CompletedProcess(args=['ls', '-l'], returncode=0) >>> subprocess.run("exit 1", shell=True, check=True) Traceback (most recent call last): ... subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1 >>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE) CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0, stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')
>>> subprocess.call(['ls', '-l']) 总用量 160 drwxr-xr-x 2 wader wader 4096 12月 7 2015 公共的 drwxr-xr-x 2 wader wader 4096 12月 7 2015 模板 drwxr-xr-x 2 wader wader 4096 12月 7 2015 视频 drwxr-xr-x 2 wader wader 4096 12月 7 2015 图片 drwxr-xr-x 2 wader wader 4096 12月 7 2015 文档 drwxr-xr-x 2 wader wader 4096 4月 13 2016 下载 drwxr-xr-x 2 wader wader 4096 12月 7 2015 音乐 drwxr-xr-x 7 wader wader 4096 5月 26 2016 桌面 0 >>> subprocess.call('ls -l', shell=True) 总用量 160 drwxr-xr-x 2 wader wader 4096 12月 7 2015 公共的 drwxr-xr-x 2 wader wader 4096 12月 7 2015 模板 drwxr-xr-x 2 wader wader 4096 12月 7 2015 视频 drwxr-xr-x 2 wader wader 4096 12月 7 2015 图片 drwxr-xr-x 2 wader wader 4096 12月 7 2015 文档 drwxr-xr-x 2 wader wader 4096 4月 13 2016 下载 drwxr-xr-x 2 wader wader 4096 12月 7 2015 音乐 drwxr-xr-x 7 wader wader 4096 5月 26 2016 桌面 0 >>> subprocess.call(['ls', '-l'], stdout=subprocess.DEVNULL) 0 >>> subprocess.call(['ls', '-l', '/test']) ls: 没法访问/test: 没有那个文件或目录 2
>>> subprocess.check_call(['ls', '-l']) 总用量 160 drwxr-xr-x 2 wader wader 4096 12月 7 2015 公共的 drwxr-xr-x 2 wader wader 4096 12月 7 2015 模板 drwxr-xr-x 2 wader wader 4096 12月 7 2015 视频 drwxr-xr-x 2 wader wader 4096 12月 7 2015 图片 drwxr-xr-x 2 wader wader 4096 12月 7 2015 文档 drwxr-xr-x 2 wader wader 4096 4月 13 2016 下载 drwxr-xr-x 2 wader wader 4096 12月 7 2015 音乐 drwxr-xr-x 7 wader wader 4096 5月 26 2016 桌面 0 >>> subprocess.check_call('ls -l', shell=True) 总用量 160 drwxr-xr-x 2 wader wader 4096 12月 7 2015 公共的 drwxr-xr-x 2 wader wader 4096 12月 7 2015 模板 drwxr-xr-x 2 wader wader 4096 12月 7 2015 视频 drwxr-xr-x 2 wader wader 4096 12月 7 2015 图片 drwxr-xr-x 2 wader wader 4096 12月 7 2015 文档 drwxr-xr-x 2 wader wader 4096 4月 13 2016 下载 drwxr-xr-x 2 wader wader 4096 12月 7 2015 音乐 drwxr-xr-x 7 wader wader 4096 5月 26 2016 桌面 0 >>> subprocess.check_call('ls -l /test', shell=True) ls: 没法访问/test: 没有那个文件或目录 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.4/subprocess.py", line 557, in check_call raise CalledProcessError(retcode, cmd) subprocess.CalledProcessError: Command 'ls -l /test' returned non-zero exit status 2
>>> ret = subprocess.check_output(['ls', '-l']) >>> print(ret) b' \xe5\x85\xac\xe5\x85\xb1\xe7\x9a\x84\ndrwxr-xr-x 2 wader wader 4096 12\xe6\x9c\x88 7 2015 \xe6\xa8\xa1\xe6\x9d\xbf\ndrwxr-xr-x 2 wader wader 4096 12\xe6\x9c\x88 7 2015 \xe8\xa7\x86\xe9\xa2\x91\ndrwxr-xr-x 2 wader wader 4096 12\xe6\x9c\x88 7 2015 \xe5\x9b\xbe\xe7\x89\x87\ndrwxr-xr-x 2 wader wader 4096 12\xe6\x9c\x88 7 2015 \xe6\x96\x87\xe6\xa1\xa3\ndrwxr-xr-x 2 wader wader 4096 4\xe6\x9c\x88 13 2016 \xe4\xb8\x8b\xe8\xbd\xbd\ndrwxr-xr-x 2 wader wader 4096 12\xe6\x9c\x88 7 2015 \xe9\x9f\xb3\xe4\xb9\x90\ndrwxr-xr-x 7 wader wader 4096 5\xe6\x9c\x88 26 2016 \xe6\xa1\x8c\xe9\x9d\xa2\n' >>> ret = subprocess.check_output(['ls', '-l'], universal_newlines=True) >>> print(ret) 总用量 160 drwxr-xr-x 2 wader wader 4096 12月 7 2015 公共的 drwxr-xr-x 2 wader wader 4096 12月 7 2015 模板 drwxr-xr-x 2 wader wader 4096 12月 7 2015 视频 drwxr-xr-x 2 wader wader 4096 12月 7 2015 图片 drwxr-xr-x 2 wader wader 4096 12月 7 2015 文档 drwxr-xr-x 2 wader wader 4096 4月 13 2016 下载 drwxr-xr-x 2 wader wader 4096 12月 7 2015 音乐 drwxr-xr-x 7 wader wader 4096 5月 26 2016 桌面
>>> ret = subprocess.getoutput('ls -l') >>> print(ret) 总用量 160 drwxr-xr-x 2 wader wader 4096 12月 7 2015 公共的 drwxr-xr-x 2 wader wader 4096 12月 7 2015 模板 drwxr-xr-x 2 wader wader 4096 12月 7 2015 视频 drwxr-xr-x 2 wader wader 4096 12月 7 2015 图片 drwxr-xr-x 2 wader wader 4096 12月 7 2015 文档 drwxr-xr-x 2 wader wader 4096 4月 13 2016 下载 drwxr-xr-x 2 wader wader 4096 12月 7 2015 音乐 drwxr-xr-x 7 wader wader 4096 5月 26 2016 桌面 >>> retcode, output = subprocess.getstatusoutput('ls -l') >>> print(retcode) 0 >>> print(output) 总用量 160 drwxr-xr-x 2 wader wader 4096 12月 7 2015 公共的 drwxr-xr-x 2 wader wader 4096 12月 7 2015 模板 drwxr-xr-x 2 wader wader 4096 12月 7 2015 视频 drwxr-xr-x 2 wader wader 4096 12月 7 2015 图片 drwxr-xr-x 2 wader wader 4096 12月 7 2015 文档 drwxr-xr-x 2 wader wader 4096 4月 13 2016 下载 drwxr-xr-x 2 wader wader 4096 12月 7 2015 音乐 drwxr-xr-x 7 wader wader 4096 5月 26 2016 桌面 >>> retcode, output = subprocess.getstatusoutput('ls -l /test') >>> print(retcode) 2 >>> print(output) ls: 没法访问/test: 没有那个文件或目录
该类用于在一个新的进程中执行一个子程序。前面咱们提到过,上面介绍的这些函数都是基于subprocess.Popen类实现的,经过使用这些被封装后的高级函数能够很方面的完成一些常见的需求。因为subprocess模块底层的进程建立和管理是由Popen类来处理的,所以,当咱们没法经过上面哪些高级函数来实现一些不太常见的功能时就能够经过subprocess.Popen类提供的灵活的api来完成。
class subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=False, startup_info=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=())
参数说明:
方法 | 描述 |
---|---|
Popen.poll() | 用于检查子进程(命令)是否已经执行结束,没结束返回None,结束后返回状态码。 |
Popen.wait(timeout=None) | 等待子进程结束,并返回状态码;若是在timeout指定的秒数以后进程尚未结束,将会抛出一个TimeoutExpired异常。 |
Popen.communicate(input=None, timeout=None) | 该方法可用来与进程进行交互,好比发送数据到stdin,从stdout和stderr读取数据,直到到达文件末尾。 |
Popen.send_signal(signal) | 发送指定的信号给这个子进程。 |
Popen.terminate() | 中止该子进程。 |
Popen.kill() | 杀死该子进程。 |
>>> import subprocess >>> >>> p = subprocess.Popen('df -Th', stdout=subprocess.PIPE, shell=True) >>> print(p.stdout.read()) Filesystem Type Size Used Avail Use% Mounted on /dev/vda1 ext4 40G 12G 26G 31% / devtmpfs devtmpfs 3.9G 0 3.9G 0% /dev tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm tmpfs tmpfs 3.9G 386M 3.5G 10% /run tmpfs tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup tmpfs tmpfs 783M 0 783M 0% /run/user/0 tmpfs tmpfs 783M 0 783M 0% /run/user/1000
>>> obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) >>> obj.stdin.write('print(1) \n') >>> obj.stdin.write('print(2) \n') >>> obj.stdin.write('print(3) \n') >>> out,err = obj.communicate() >>> print(out) 1 2 3 >>> print(err)
>>> obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) >>> out,err = obj.communicate(input='print(1) \n') >>> print(out) 1 >>> print(err)
实现相似df -Th | grep data
命令的功能,实际上就是实现shell中管道的共功能。
>>> >>> p1 = subprocess.Popen(['df', '-Th'], stdout=subprocess.PIPE) >>> p2 = subprocess.Popen(['grep', 'data'], stdin=p1.stdout, stdout=subprocess.PIPE) >>> out,err = p2.communicate() >>> print(out) /dev/vdb1 ext4 493G 4.8G 463G 2% /data /dev/vdd1 ext4 1008G 420G 537G 44% /data1 /dev/vde1 ext4 985G 503G 432G 54% /data2 >>> print(err) None
那么咱们到底该用哪一个模块、哪一个函数来执行命令与系统及系统进行交互呢?下面咱们来作个总结:
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。JSON的数据格式其实就是python里面的字典格式,里面能够包含方括号括起来的数组,也就是python里面的列表。
在python中,有专门处理json格式的模块—— json 和 picle模块
Json 模块提供了四个方法: dumps、dump、loads、load
pickle 模块也提供了四个功能:dumps、dump、loads、load
一. dumps 和 dump:
dumps和dump 序列化方法
dumps只完成了序列化为str, dump必须传文件描述符,将序列化的str保存到文件中
查看源码:
def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw): # Serialize ``obj`` to a JSON formatted ``str``. # 序列号 “obj” 数据类型 转换为 JSON格式的字符串
def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw): """Serialize ``obj`` as a JSON formatted stream to ``fp`` (a ``.write()``-supporting file-like object). 我理解为两个动做,一个动做是将”obj“转换为JSON格式的字符串,还有一个动做是将字符串写入到文件中,也就是说文件描述符fp是必需要的参数 """
>>> import json >>> json.dumps([]) # dumps能够格式化全部的基本数据类型为字符串 '[]' >>> json.dumps(1) # 数字 '1' >>> json.dumps('1') # 字符串 '"1"' >>> dict = {"name":"Tom", "age":23} >>> json.dumps(dict) # 字典 '{"name": "Tom", "age": 23}'
a = {"name":"Tom", "age":23} with open("test.json", "w", encoding='utf-8') as f: # indent 超级好用,格式化保存字典,默认为None,小于0为零个空格 f.write(json.dumps(a, indent=4)) # json.dump(a,f,indent=4) # 和上面的效果同样
保存的文件效果:
二. loads 和 load
loads和load 反序列化方法
loads 只完成了反序列化, load 只接收文件描述符,完成了读取文件和反序列化
查看源码:
def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw): """Deserialize ``s`` (a ``str`` instance containing a JSON document) to a Python object. 将包含str类型的JSON文档反序列化为一个python对象""" def load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw): """Deserialize ``fp`` (a ``.read()``-supporting file-like object containing a JSON document) to a Python object. 将一个包含JSON格式数据的可读文件饭序列化为一个python对象"""
实例:
>>> json.loads('{"name":"Tom", "age":23}') {'age': 23, 'name': 'Tom'}
import json with open("test.json", "r", encoding='utf-8') as f: aa = json.loads(f.read()) f.seek(0) bb = json.load(f) # 与 json.loads(f.read()) print(aa) print(bb) # 输出: {'name': 'Tom', 'age': 23} {'name': 'Tom', 'age': 23}
三. json 和 pickle 模块
json模块和pickle模块都有 dumps、dump、loads、load四种方法,并且用法同样。
不用的是json模块序列化出来的是通用格式,其它编程语言都认识,就是普通的字符串,
而picle模块序列化出来的只有python能够认识,其余编程语言不认识的,表现为乱码
不过picle能够序列化函数,可是其余文件想用该函数,在该文件中须要有该文件的定义(定义和参数必须相同,内容能够不一样)
四. python对象(obj) 与json对象的对应关系
+-------------------+---------------+ | Python | JSON | +===================+===============+ | dict | object | +-------------------+---------------+ | list, tuple | array | +-------------------+---------------+ | str | string | +-------------------+---------------+ | int, float | number | +-------------------+---------------+ | True | true | +-------------------+---------------+ | False | false | +-------------------+---------------+ | None | null | +-------------------+---------------+
五. 总结
\1. json序列化方法:
dumps:无文件操做 dump:序列化+写入文件
\2. json反序列化方法:
loads:无文件操做 load: 读文件+反序列化
\3. json模块序列化的数据 更通用
picle模块序列化的数据 仅python可用,但功能强大,能够序列号函数
\4. json模块能够序列化和反序列化的 数据类型 见 python对象(obj) 与json对象的对应关系表
\5. 格式化写入文件利用 indent = 4
ElementTree是python的XML处理模块,它提供了一个轻量级的对象模型。它在Python2.5之后成为Python标准库的一部分,可是Python2.4以前须要单独安装。在使用ElementTree模块时,须要import xml.etree.ElementTree的操做。
ElementTree表示整个XML节点树,而Element表示节点数中的一个单独的节点。
ElementTree(tag),其中tag表示根节点,初始化一个ElementTree对象。
Element(tag, attrib={}, **extra)函数用来构造XML的一个根节点,其中tag表示根节点的名称,attrib是一个可选项,表示节点的属性。
SubElement(parent, tag, attrib={}, **extra)用来构造一个已经存在的节点的子节点
Element.text和SubElement.text表示element对象的额外的内容属性,Element.tag和Element.attrib分别表示element对象的标签和属性。
ElementTree.write(file, encoding='us-ascii', xml_declaration=None, default_namespace=None, method='xml'),函数新建一个XML文件,而且将节点数数据写入XML文件中。
#encoding=utf-8 import xml.etree.ElementTree as ET #新建xml文件 def buildNewsXmlFile(): #设置一个新节点,并设置其标签为root root = ET.Element("root") #在root下新建两个子节点,设置其名称分别为sina和chinabyte sina = ET.SubElement(root, "sina") chinabyte = ET.SubElement(root, "chinabyte") #在sina下新建两个子节点,设置其节点名称分别为number和first sina_number = ET.SubElement(sina, "number") sina_number.text = "1" sina_first = ET.SubElement(sina, "first") sina_first.text = "http://roll.tech.sina.com.cn/internet_all/index_1.shtml" #在chinabyte下新建两个子节点,设置其节点名称为number和first chinabyte_number = ET.SubElement(chinabyte, "number") chinabyte_number.text = "1" chinabyte_first = ET.SubElement(chinabyte, "first") chinabyte_first.text = "http://www.chinabyte.com/more/124566.shtml" #将节点数信息保存在ElementTree中,而且保存为XML格式文件 tree = ET.ElementTree(root) tree.write("urlfile.xml")
ElementTree.parse(source, parser=None),将xml文件加载并返回ElementTree对象。parser是一个可选的参数,若是为空,则默认使用标准的XMLParser解析器。
ElementTree.getroot(),获得根节点。返回根节点的element对象。
Element.remove(tag),删除root下名称为tag的子节点
如下函数,ElementTree和Element的对象都包含。
find(match),获得第一个匹配match的子节点,match能够是一个标签名称或者是路径。返回个element
findtext(match,default=None),获得第一个配置的match的element的内容
findall(match),获得匹配match下的全部的子节点,match能够是一个标签或者是路径,它会返回一个list,包含匹配的elements的信息
iter(tag),建立一个以当前节点为根节点的iterator。
这里有一个xml文件
<?xml version="1.0"?> <data> <country name="Liechtenstein"> <rank>1</rank> <year>2008</year> <gdppc>141100</gdppc> <neighbor name="Austria" direction="E"/> <neighbor name="Switzerland" direction="W"/> </country> <country name="Singapore"> <rank>4</rank> <year>2011</year> <gdppc>59900</gdppc> <neighbor name="Malaysia" direction="N"/> </country> <country name="Panama"> <rank>68</rank> <year>2011</year> <gdppc>13600</gdppc> <neighbor name="Costa Rica" direction="W"/> <neighbor name="Colombia" direction="E"/> </country> </data>
如今是解析xml文件的代码
#解析Xml文件 def parseXmlFile(xml_name): #将XMl文件加载并返回一个ELementTree对象 tree = ET.parse(xml_name) #获得第一个匹配sina标签的Element对象 sina = tree.find("contry") #获得sina的SubElement for sub_tag in sina: print sub_tag.text #获得全部匹配sina标签的Element对象的list集合 list_contry = tree.findall("contry") for contry in list_contry: for sub_tag in contry: print sub_tag.text #修改xml文件 for rank in tree.iter('rank') new_rank = int(rank.text)+1 rank.text = str(new_rank) rank.set('updated', 'yes') tree.write(xml_name)
第一次的输出是:1,2008,14100
第二次的输出是:1,2008,14100,4,2011,59900,68,2011,13600
修改后的xml文件为
<?xml version="1.0"?> <data> <country name="Liechtenstein"> <rank updated="yes">2</rank> <year>2008</year> <gdppc>141100</gdppc> <neighbor name="Austria" direction="E"/> <neighbor name="Switzerland" direction="W"/> </country> <country name="Singapore"> <rank updated="yes">5</rank> <year>2011</year> <gdppc>59900</gdppc> <neighbor name="Malaysia" direction="N"/> </country> <country name="Panama"> <rank updated="yes">69</rank> <year>2011</year> <gdppc>13600</gdppc> <neighbor name="Costa Rica" direction="W"/> <neighbor name="Colombia" direction="E"/> </country> </data>
configparser 是 Pyhton 标准库中用来解析配置文件的模块,而且内置方法和字典很是接近。Python2.x 中名为 ConfigParser,3.x 已改名小写,并加入了一些新功能。
配置文件的格式以下:
[DEFAULT] ServerAliveInterval = 45 Compression = yes CompressionLevel = 9 ForwardX11 = yes [bitbucket.org] User = Tom [topsecret.com] Port: 50022 ForwardX11: no
“[ ]”包含的为 section,section 下面为相似于 key - value 的配置内容;
configparser 默认支持 ‘=’ ‘:’ 两种分隔。
使用 configparser 首先须要初始化实例,并读取配置文件:
>>> import configparser >>> config = configparser.ConfigParser() # 注意大小写 >>> config.read("config.ini") # 配置文件的路径 ["config.ini"]
或者能够直接读字典
>>> parser = configparser.ConfigParser() >>> parser.read_dict({'section1': {'key1': 'value1', ... 'key2': 'value2', ... 'key3': 'value3'}, ... 'section2': {'keyA': 'valueA', ... 'keyB': 'valueB', ... 'keyC': 'valueC'}, ... 'section3': {'foo': 'x', ... 'bar': 'y', ... 'baz': 'z'} ... })
>>> config.sections() ['bitbucket.org', 'topsecret.com'] # 注意会过滤掉[DEFAULT]
>>> config.items('topsecret.com') >>>> [('port', '50022'), ('forwardx11', 'no')] # 注意items()返回的字符串会全变成小写
>>> config.options('topsecret.com') ['Port', 'ForwardX11'] >>> for option in config['topsecret.com']: ... print(option) Port ForwardX11
>>> config['bitbucket.org']['User'] 'Tom' >>> config.get('bitbucket.org', 'User') 'Tom' >>> config.getint('topsecret.com', 'Port') 50022
>>> 'DEFAULT' in config True >>> 'test' in config['section_test'] False >>> 'Tom' in config['bitbucket.org']['User'] True >>> config.has_section('bitbucket.org') True >>> config.has_option('section_test', 'test') False
>>> config.add_section('Section_1') >>> config.set('Section_1', 'key_1', 'value_1') # 注意键值是用set()方法 >>> config.write(open('config.ini', 'w')) # 必定要写入才生效
>>> config.remove_option('Section_1', 'key_1') True >>> config.remove_section('Section_1') True >>> config.clear() # 清空除[DEFAULT]以外全部内容 >>> config.write(open('config.ini', 'w'))
通常包含 ini 格式配置文件的默认项,因此 configparser 部分方法会自动跳过这个 section 。
前面已经提到 sections() 是获取不到的,还有删除方法对 [DEFAULT] 也无效:
>>> config.remove_section('DEFAULT') False >>> config.clear() >>> 'DEFAULT' in config True >>> 'ForwardX11' in config['DEFAULT'] True >>> config.sections() []
但指定删除和修改 [DEFAULT] 里的 keys & values 是能够的:
>>> config.remove_option('DEFAULT', 'ForwardX11') True >>> config.set('DEFAULT', 'ForwardX11','no') >>> config['DEFAULT']['ForwardX11'] 'no'
还有个特殊的是,has_section() 也无效,能够和 in 区别使用
>>> config.has_section('DEFAULT') False >>> 'DEFAULT' in config True
random —— 生成伪随机数,该模块为各类分布实现伪随机数生成器。咱们来看看random模块经常使用的几个函数的介绍:
1、针对整数的方法:
random.randrange(stop)
random.randrange(start, stop[, step])
等同于choice(range(start, stop, step)),但不实际建立range对象。
>>> import random >>> print(random.randrange(4)) #返回0~3的随机整数 1 >>> print(random.randrange(1, 9)) #返回1~8的随机整数 8 >>> print(random.randrange(1, 11, 2)) #返回1~10的随机奇数 3
random.randint(a, b)
返回一个随机整数N,a <= N <= b, 等同于randrange(a, b+1)。
>>> print(random.randint(1, 10)) #返回[1, 10]的随机整数 8 >>> print(random.randint(-10, -1)) #返回[-10, -1]的随机整数,不能写成random.randint(-1, -10) -5
2、针对序列的方法:
random.choice(seq)
从非空序列中返回一个随机元素,若是序列为空,则引起IndexError。
>>> print(random.choice('BHasdgiHUI1234')) #返回一个字符 I >>> print(random.choice(['apple', 'peach', 'pear'])) #返回列表中一个随机一个元素 pear >>> print(random.choice(('Bob', 'Jhon', 'Micheal'))) #返回元组中一个随机元素 Jhon
random.choices(population, weight=None, *, cum_weight=None, k=1)
从可替代的population序列中随机取出k个元素组成列表,返回该列表。weight是相对权重序列,cum_weight是累计权重,同时制定权重weight和累计权重cum_weight,会产生类型错误。
>>> print(random.choices(['red', 'yellow','green', 'blue', 'black', 'pink', 'purple', 'white'], k=4)) ['red', 'red', 'purple', 'black'] >>> print(random.choices(['apple', 'peach', 'pear'], [1, 2, 3], k=4)) ['pear', 'pear', 'pear', 'peach'] >>> print(random.choices(['apple', 'peach', 'pear'], [6, 12, 2], k=4)) ['peach', 'peach', 'pear', 'pear']
random.shuffle(x [,random])
从新排列序列(洗牌)
>>> seq = ['red1','yellow2','blue3', 'green4' ] >>> random.shuffle(seq) #列表从新排序 >>> print(seq) ['red1', 'blue3', 'green4', 'yellow2']
random.sample(population, k)
返回一个从序列population中随机抽取K个不重复的元素组成的新队列。用于不可替换的随机抽样。返回一个新的列表,不破坏原有列表。若是新队列的长度k大于原队列population的长度,则会引起ValueError错误。
>>> print(random.sample(['a', 'b', 'c', 'd', 'e', '1', '2', '3'], 2)) #列表中随机抽取2个元素组成新的列表 ['d', 'b'] >>> print(''.join(random.sample("ahoiNUAI483*4", 4))) UohI
3、真值分布:
random.random()
返回一个随机的浮点数,范围[0, 1)
>>> print(random.random()) 0.5867129667371662
random.uniform(a, b)
返回一个a和b之间的随机浮点数,若是a>b,则返回b和a之间的浮点数。a和b均可能出如今结果中。
>>> print(random.uniform(1, 10)) 5.961863773592117 >>> print(random.uniform(2,6)) 3.2723769810535543
引入: import shutil
功能:复制文件
格式:shutil.copy('来源文件','目标地址')
返回值:复制以后的路径
功能:复制文件,保留元数据
格式:shutil.copy2('来源文件','目标地址')
返回值:复制以后的路径
将一个文件的内容拷贝的另一个文件当中
格式:shutil.copyfileobj(open(来源文件,'r'),open('目标文件','w'))
返回值:无
功能:将一个文件的内容拷贝的另一个文件当中
格式:shutil.copyfile(来源文件,目标文件)
返回值:目标文件的路径
功能:复制整个文件目录
格式:shutil.copytree(来源目录,目标目录)
返回值:目标目录的路径
注意:不管文件夹是否为空,都可以复制,并且会复制文件夹中的全部内容
功能:拷贝权限
功能:拷贝元数据(状态)
功能:移除整个目录,不管是否空
格式:shutil.rmtree(目录路径)
返回值:无
功能:移动文件或者文件夹
格式:shutil.move(来源地址,目标地址)
返回值:目标地址
功能:检测命令对应的文件路径
格式:shutil.which(‘命令字符串’)
返回值:命令文件所在位置
注意:window和linux不太同样。 window的命令都是.exe结尾,linux则不是
功能:检测磁盘使用信息
格式:disk_usage(‘盘符’)
返回值:元组
归档:将多个文件合并到一个文件当中,这种操做方式就是归档。
解包:将归档的文件进行释放。
压缩:压缩时将多个文件进行有损或者无损的合并到一个文件当中。
解压缩:就是压缩的反向操做,将压缩文件中的多个文件,释放出来。
功能:归档函数,归档操做 格式:shutil.make_archive('目标文件路径','归档文件后缀','须要归档的目录') 返回值:归档文件的最终路径
功能:解包操做 格式:shutil.unpack_archive('归档文件路径','解包目标文件夹') 返回值:None 注意:文件夹不存在会新建文件夹
功能:获取当前系统已注册的归档文件格式(后缀) 格式:shutil.get_archive_formats() 返回值:列表 [(后缀,解释),(后缀,解释),(后缀,解释)...]
功能:获取当前系统已经注册的解包文件格式(后缀) 格式:shutil.get_unpack_formats() 返回值:列表 [(后缀,解释),(后缀,解释),(后缀,解释)...]
paramiko是一个用于作远程控制的模块,使用该模块能够对远程服务器进行命令或文件操做,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现实。
一、下载安装
pycrypto,因为 paramiko 模块内部依赖pycrypto,因此先下载安装pycrypto``pip3 install pycrypto``pip3 install paramiko
二、模块使用
#!/usr/bin/env python #coding:utf-8 import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('192.168.1.108', 22, 'alex', '123') stdin, stdout, stderr = ssh.exec_command('df') print stdout.read() ssh.close();
import paramiko private_key_path = '/home/auto/.ssh/id_rsa' key = paramiko.RSAKey.from_private_key_file(private_key_path) ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('主机名 ', 端口, '用户名', key) stdin, stdout, stderr = ssh.exec_command('df') print stdout.read() ssh.close()
import os,sys import paramiko t = paramiko.Transport(('182.92.219.86',22)) t.connect(username='wupeiqi',password='123') sftp = paramiko.SFTPClient.from_transport(t) sftp.put('/tmp/test.py','/tmp/test.py') t.close() import os,sys import paramiko t = paramiko.Transport(('182.92.219.86',22)) t.connect(username='wupeiqi',password='123') sftp = paramiko.SFTPClient.from_transport(t) sftp.get('/tmp/test.py','/tmp/test2.py') t.close()
import paramiko pravie_key_path = '/home/auto/.ssh/id_rsa' key = paramiko.RSAKey.from_private_key_file(pravie_key_path) t = paramiko.Transport(('182.92.219.86',22)) t.connect(username='wupeiqi',pkey=key) sftp = paramiko.SFTPClient.from_transport(t) sftp.put('/tmp/test3.py','/tmp/test3.py') t.close() import paramiko pravie_key_path = '/home/auto/.ssh/id_rsa' key = paramiko.RSAKey.from_private_key_file(pravie_key_path) t = paramiko.Transport(('182.92.219.86',22)) t.connect(username='wupeiqi',pkey=key) sftp = paramiko.SFTPClient.from_transport(t) sftp.get('/tmp/test3.py','/tmp/test4.py') t.close()
Python标准库中提供了:urllib等模块以供Http请求,可是,它的 API 太渣了。它是为另外一个时代、另外一个互联网所建立的。它须要巨量的工做,甚至包括各类方法覆盖,来完成最简单的任务。javascript:void(0);)
import urllib.request f = urllib.request.urlopen('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508') result = f.read().decode('utf-8')
import urllib.request req = urllib.request.Request('http://www.example.com/') req.add_header('Referer', 'http://www.python.org/') r = urllib.request.urlopen(req) result = f.read().decode('utf-8')
Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests能够垂手可得的完成浏览器可有的任何操做。
一、安装模块
pip3 install requests
二、使用模块
# 一、无参数实例 import requests ret = requests.get('https://github.com/timeline.json') print(ret.url) print(ret.text) # 二、有参数实例 import requests payload = {'key1': 'value1', 'key2': 'value2'} ret = requests.get("http://httpbin.org/get", params=payload) print(ret.url) print(ret.text)
# 一、基本POST实例 import requests payload = {'key1': 'value1', 'key2': 'value2'} ret = requests.post("http://httpbin.org/post", data=payload) print(ret.text) # 二、发送请求头和数据实例 import requests import json url = 'https://api.github.com/some/endpoint' payload = {'some': 'data'} headers = {'content-type': 'application/json'} ret = requests.post(url, data=json.dumps(payload), headers=headers) print(ret.text) print(ret.cookies)
requests.get(url, params=None, **kwargs) requests.post(url, data=None, json=None, **kwargs) requests.put(url, data=None, **kwargs) requests.head(url, **kwargs) requests.delete(url, **kwargs) requests.patch(url, data=None, **kwargs) requests.options(url, **kwargs) # 以上方法均是在此方法的基础上构建 requests.request(method, url, **kwargs)
三、Http请求和XML实例
实例:检测QQ帐号是否在线
import urllib import requests from xml.etree import ElementTree as ET # 使用内置模块urllib发送HTTP请求,或者XML格式内容 """ f = urllib.request.urlopen('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508') result = f.read().decode('utf-8') """ # 使用第三方模块requests发送HTTP请求,或者XML格式内容 r = requests.get('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508') result = r.text # 解析XML格式内容 node = ET.XML(result) # 获取内容 if node.text == "Y": print("在线") else: print("离线")
实例:查看火车停靠信息
import urllib import requests from xml.etree import ElementTree as ET # 使用内置模块urllib发送HTTP请求,或者XML格式内容 """ f = urllib.request.urlopen('http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=') result = f.read().decode('utf-8') """ # 使用第三方模块requests发送HTTP请求,或者XML格式内容 r = requests.get('http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=') result = r.text # 解析XML格式内容 root = ET.XML(result) for node in root.iter('TrainDetailInfo'): print(node.find('TrainStation').text,node.find('StartTime').text,node.tag,node.attrib)
paramiko模块
import paramiko # 建立SSH对象 ssh = paramiko.SSHClient() # 容许链接不在known_hosts文件上的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 链接服务器 ssh.connect(hostname="192.168.0.99", port=22, username="root", password="rootroot") # 执行命令 stdin, stdout, stderr = ssh.exec_command('df') # 获取结果 result = stdout.read().decode() # 获取错误提示(stdout、stderr只会输出其中一个) err = stderr.read() # 关闭链接 ssh.close() print(stdin, result, err)
注:若是注释“ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())”这句,会报错。
相似问题能够为linux系统中~/.ssh/known_hosts文件中的内容。
2、实现SFTP功能
import paramiko # 链接虚拟机centos上的ip及端口 transport = paramiko.Transport(("192.168.0.99", 22)) transport.connect(username="root", password="rootroot") # 将实例化的Transport做为参数传入SFTPClient中 sftp = paramiko.SFTPClient.from_transport(transport) # 将“calculator.py”上传到filelist文件夹中 sftp.put('D:\python库\Python_shell\day05\calculator.py', '/filelist/calculator.py') # 将centos中的aaa.txt文件下载到桌面 sftp.get('/filedir/aaa.txt', r'C:\Users\duany_000\Desktop\test_aaa.txt') transport.close()
3、使用秘钥实现SSH功能
import paramiko private_key = paramiko.RSAKey.from_private_key_file('id_rsa31') # 建立SSH对象 ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 链接服务器 ssh.connect(hostname='192.168.79.9', port=22, username='root', pkey=private_key) stdin, stdout, stderr = ssh.exec_command('ifconfig') res_out = stdout.read() print(res_out.decode()) ssh.close()
4、使用秘钥实现SFTP功能
import paramiko private_key = paramiko.RSAKey.from_private_key_file('id_rsa31') # 链接虚拟机centos上的ip及端口 transport = paramiko.Transport(("192.168.79.9", 22)) transport.connect(username="root", pkey=private_key) # 将实例化的Transport做为参数传入SFTPClient中 sftp = paramiko.SFTPClient.from_transport(transport) # 将“calculator.py”上传到filelist文件夹中 sftp.put('D:\python库\Python_shell\day05\calculator.py', '/filedir/calculator.py') # 将centos中的aaa.txt文件下载到桌面 sftp.get('/filedir/oldtext.txt', r'C:\Users\duany_000\Desktop\oldtext.txt') transport.close()