一、sys
In [1]: import sys
In [2]: sys.version
Out[2]: '3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)]'
In [3]: sys.version_info
Out[3]: sys.version_info(major=3, minor=7, micro=6, releaselevel='final', serial=0)
In [4]: print("python 主版本号:{}".format(py_version.major))
python 主版本号:3
In [5]: sys.platform # 目前系统平台
Out[5]: 'win32'
关于系统平台
- Windows --> 'win32'
- Mac --> 'darwin'
- Linux --> ''linux''
在命令行里,给脚本传参
在 CMD 中使用如下命 编辑一个 pos.py
文件
C:\Users\shark\python-code>notepad pos.py
并写入如下内容
# coding:gbk
import sys
print(sys.argv)
print("脚本的第一个参数:{}".format(sys.argv[1]))
print("脚本的第二个参数:{}".format(sys.argv[2]))
image.png
最后保存退出
输入如下命令,查看结果
C:\Users\shark\python-code>python pos.py lenovo qf
['pos.py', 'lenovo', 'qf']
脚本的第一个参数:lenovo
脚本的第二个参数:qf
C:\Users\shark\python-code>
二、os
import os
# 获取当前工作目录,即当前python脚本工作的目录路径
In [3]: os.getcwd()
Out[3]: 'C:\\Users\\shark\\python-code'
# 切换当前脚本工作目录;相当于shell下cd
In [7]: os.chdir("D:\\")
In [8]: os.getcwd()
Out[8]: 'D:\\'
# 创建单级目录,相当于 shell 中的 mkdir dirname
In [11]: os.mkdir("route-tab")
# 获取指定目录下的文件
# 点 代表当前目录
In [12]: os.listdir(".")
Out[12]:
['$RECYCLE.BIN',
'Program Files',
'Programs',
'Python',
'python-code',
'route-tab',
'System Volume Information']
In [13]:
处理路径
image.png
#coding:utf-8
import os
print(f"本文件的文件名{__file__}")
print(f"本文件的绝对路径{os.path.abspath(__file__)}")
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
print(f"本文件的上级目录{BASE_DIR}")
三、glob
glob 模块可以在指定的路径下,以模糊匹配的方式查找文件
*
代表零到多个的任意字符,就是所有的字符
In [14]: import glob
In [15]: glob.glob("*.py")
Out[15]: []
In [16]: glob.glob("./*.py")
Out[16]: []
In [17]: !echo #这个命令可以创建普通文件 > a.py
In [18]: !echo #这个命令可以创建普通文件 > b.py
In [19]: glob.glob("./*.py")
Out[19]: ['.\\a.py', '.\\b.py']
In [20]:
四、time 和 datetime
1. time 模块
时间戳类型
单位秒, 数据类型是 浮点型
是从 1970年 1 月 1 日 00:00:00 到当前的秒数
In [34]: time.time()
Out[34]: 1577577413.092128
结构化时间类型
In [35]: time.localtime()
Out[35]: time.struct_time(tm_year=2019, tm_mon=12, tm_mday=29, tm_hour=7, tm_min=58, tm_sec=36, tm_wday=6, tm_yday=363, tm_isdst=0)
In [36]: struct = time.localtime()
In [37]: struct.tm_year
Out[37]: 2019
字符串时间类型
可以实现输出指定格式的时间,数据类型是 字符串
In [38]: import time
In [39]: time.strftime("%F")
Out[39]: '2019-12-29'
In [40]: time.strftime("%T")
Out[40]: '07:53:27'
In [41]: time.strftime("%F_%T")
Out[41]: '2019-12-29_07:53:41'
In [42]: time.strftime("%Y_%m_%d_%H_%M_%S")
Out[42]: '2019_12_29_07_54_28'
格式化时间的变量:
格式 | 含义 |
---|---|
%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 | 时区的名字(如果不存在为空字符) |
%% | ‘%’字符 |
奇异博士 程序暂停运行
In [43]: time.sleep(2) # 程序休眠 2 秒钟
时间转换
image.png
将指定的时间戳转换为字符串类型的时间
In [8]: time.strftime("%F %T", time.localtime(18997989))
Out[8]: '1970-08-09 05:13:09'
In [9]: time.strftime("%F %T", time.localtime(198997989))
Out[9]: '1976-04-22 13:13:09'
In [10]: time.strftime("%F %T", time.localtime(1989979893))
Out[10]: '2033-01-22 12:11:33'
将字符串时间转换为时间戳
In [11]: st = "20200103T101000"
In [12]: time.mktime(time.strptime(st, "%Y%m%dT%H%M%S"))
Out[12]: 1578017400.0
In [13]:
2. datatime 时间计算
时间加减
In [16]: import datetime
# 三天后
In [17]: datetime.datetime.now() + datetime.timedelta(3)
Out[17]: datetime.datetime(2020, 1, 1, 8, 46, 48, 510787)
# 30 分钟后
In [18]: datetime.datetime.now() + datetime.timedelta(minutes=30)
Out[18]: datetime.datetime(2019, 12, 29, 9, 17, 17, 449121)
# 3 天前
In [19]: datetime.datetime.now() - datetime.timedelta(3)
Out[19]: datetime.datetime(2019, 12, 26, 8, 47, 26, 684824)
时间格式转换
>>> datetime.datetime.strftime(datetime.datetime.now(),'%Y-%m %T')
'2019-12 16:56:42'
五、subprocess 模块
allow_agent=False,look_for_keys=False
ssh.connect('192.168.1.100',username='admin', password='admin123', allow_agent=False,look_for_keys=False)
In [20]: import subprocess
In [21]: subprocess.getoutput("dir")
Out[21]: ' 驱动器 D 中的卷没有标签。\n 卷的序列号是 14B9-038E\n\n D:\\python-code 的目录\n\n2019/12/29 08:11 <DIR> .\n2019/12/29 08:11 <DIR> ..\n2019/12/27 22:34 <DIR> .vscode\n2019/12/28 16:50 15,664 a.jpg\n2019/12/29 08:11 56 a.py\n2019/12/28 17:04 <DIR> day02\n2019/12/29 08:32 237 test_path.py\n 3 个文件 15,957 字节\n 4 个目录 20,657,102,848 可用字节'
In [22]: ret = subprocess.getoutput("dir")
In [23]: type(ret)
Out[23]: str
六、paramiko 模块
连接路由器,并执行命令获取结果
import paramiko
# 创建SSH对象
ssh = paramiko.SSHClient()
# 信任对方的公钥
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接到路由器
ssh.connect(hostname='192.168.1.100', username='admin',
password='admin123', allow_agent=False,look_for_keys=False)
# 执行命令
_,sout,_ = ssh.exec_command("show ip interface")
# 获取结果,并转换成列表
sout.readlines()
---------------------------- 以下操作适用于 连接 Linux 系统 ----------------------------
1. 用户名密码方式执行远程主机命令和获取命令执行结果
image.png
3 免密方式执行远程主机命令
一定要先建立公钥信任
ssh-copy-id 服务器用户名@服务器 IP
import paramiko
# 创建SSH对象
ssh = paramiko.SSHClient()
# 信任对方的公钥
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 创建一个自己当前用户的私钥对象
private_key = paramiko.RSAKey.from_private_key_file('/Users/yanshunjun/.ssh/id_rsa')
# 连接服务器
ssh.connect(hostname='10.18.46.104', port=22,
username='root', # 服务器端的用户
pkey=private_key # 本地用户的私钥对象
)
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df -P')
# 获取命令结果
result = str(stdout.read(), encoding='utf-8')
# 关闭连接
ssh.close()
4 上传下载文件
基于公钥秘钥上传下载
import paramiko
# 下面的命令可以快速创建密钥对,并用 -t 指定了算法类型为 ecdsa
## ssh-keygen -t ecdsa -N ""
## ssh-copy-id -i ~/.ssh/id_ecdsa.pub -f root@172.16.153.10
# 创建一个本地当前用户的私钥对象
private_key = paramiko.ECDSAKey.from_private_key_file('/Users/yanshunjun/.ssh/id_ecdsa')
# 创建一个传输对象
transport = paramiko.Transport(('10.18.46.104',22))
# 使用刚才的传输对象创建一个传输文件的的连接对象
transport.connect(username='root', pkey=private_key)
sftp = paramiko.SFTPClient.from_transport(transport)
# 将location.py 上传至服务器 /tmp/test.py
sftp.put('回顾', '/tmp/回顾.txt')
# 将远程主机的文件 /tmp/test.py 下载到本地并命名为 some.py
sftp.get('/tmp/回顾.txt', 'some.txt')
transport.close()