自动化办公
Prerequisite
参考资料:
- python 高级用法 -- IO编程
- python 读写 CSV
- python 中级用法
- python 高级用法 -- 错误、调试和测试
- 关于 JSON 引号问题
- Python常用库之psutil使用指南
- 扇贝编程【待补充处理 Excel、Word】
- 一键获取Windows或Linux平台的信息【整合 os、psutil 等接口成一套代码,有需要可以参考】
获取计算机信息
- Python
from pprint import pprint
import psutil
import os
import sys
import platform
print(os.name) # 操作系统类型(posix -> linux,nt -> windows,java -> java 虚拟机)
print(os.environ) # 操作系统中定义的环境变量
print(os.environ.get('PATH')) # 获取某个环境变量的值
print(os.path.abspath('.')) # 当前目录的绝对路径
print(os.path.join(os.path.abspath('.'), 'temp')) # 测试当前操作系统的拼接方式
print(sys.platform) # 系统的平台标识(win32 -> windows,linux -> linux,cygwin -> windows,darwin -> Mac OS)
print(sys.executable) # Python 解释器的路径
print(platform.system()) # 操作系统的名字(Linux,Windows,Java)
print(platform.platform()) # 操作系统的名称及版本号
print(platform.version()) # 操作系统的版本号
print(platform.architecture()) # 操作系统的位数
print(platform.machine()) # 计算机的处理器架构
print(platform.node()) # 计算机的名称
print(platform.processor()) # 计算机的处理器信息
print(platform.uname()) # 包含上面所有的信息汇总
print(psutil.cpu_count()) # CPU 的逻辑数量
print(psutil.cpu_count(logical=False)) # CPU 的物理核心数量
print(psutil.cpu_percent(interval=0.5, percpu=True)) # 所有的 CPU 使用率(个数为逻辑数量,每隔 0.5s 刷新一次)
print(psutil.virtual_memory()) # 内存使用情况(总内存、可用内存、内存使用率、已使用的内存)
pprint(psutil.disk_partitions()) # 磁盘分区
print(psutil.disk_usage("C:\\")) # 某个磁盘使用情况
pprint(psutil.net_io_counters(pernic=True)) # 列出所有网卡的网络 IO 统计信息(WLAN、以太网等)
pprint(psutil.net_if_addrs()) # 列出所有网卡的配置信息(IP 地址、Mac地址等)
pprint(psutil.users()) # 当前登录的用户信息
print(datetime.datetime.fromtimestamp(psutil.boot_time())) # 系统的启动时间
"""
关于 pid 进程的详细,可以看下面的案例
"""
- 命令行
nvidia-smi # 查看 CUDA 版本信息
nvdebugdump --list # 查看显卡列表
nvcc --version # 显卡版本
文件操作基础
ps:对于路径问题,建议使用 / 符号来表示
- 常见函数
# 将工作目录移至指定路径
os.chdir()
# 获取当前的工作路径
os.getcwd()
# 列举出指定目录下的所有文件
os.listdir()
# 创建目录
os.mkdir()
# 用于检验文件是否存在
os.path.exists()
# 改变文件或文件夹的名称或位置
os.rename(old_path, new_path)
# 分离扩展名
os.path.splitext()
# 文件路径拼接
os.path.join()
# 分离扩展名
os.path.splitext()
- 常见用法
# 引用上层文件
sys.path.append("..") # 或者 sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
# 跳转到上级目录
os.chdir('..')
# 文件改名(old_path,new_path)
os.rename('./b.txt', './a.txt')
# 复制文件
shutil.copy("../a.txt", "./b.txt")
# 列出当前目录下的所有目录
[x for x in os.listdir('.') if os.path.isdir(x)]
# 列出所有的 .py 文件
[x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']
# 分离扩展名的方法
path = '/Users/wenwen/Desktop/娱乐/2020/开心.jpg'
file_name = '开心.jpg'
file_name2 = '2.开心.jpg'
# 演示一:分离路径(获取后缀)
print(os.path.splitext(path))
# 输出:('/Users/wenwen/Desktop/娱乐/2020/开心', '.jpg')
# 演示二:分离路径(获取文件名)
print(os.path.split(path))
# 输出:('/Users/wenwen/Desktop/娱乐/2020', '开心.jpg')
# 演示三:分离文件名
print(os.path.splitext(file_name))
# 输出:('开心', '.jpg')
# 演示四:分离带 . 的文件名
print(os.path.splitext(file_name2))
# 输出:('2.开心', '.jpg')
案例
- 案例一:获取目录下全部文件扩展名
import os
path = '/Users/wenwen/Desktop/娱乐/2020'
os.chdir(path)
# 用列表生成式对目录中的每个文件进行分割,并取元组中第二个元素
split = [os.path.splitext(item)[1] for item in os.listdir()]
# 过滤掉空字符串
extensions = [i for i in split if i != '']
# 用 set() 函数给最后的结果去重
extensions = list(set(extensions))
print(extensions)
# 输出:['.jpg', '.docx', '.mp3']
- 案例二:文件读写【参考文章:文件读写】
"""
r 只读 w+ 读写 a+ 追加 b 二进制
encoding='gbk' 编码
errors='ignore' 忽略文件中非法编码的字符
"""
# 读取全部信息
f = open("test.txt", "r")
data = f.read()
f.close()
# 写入全部信息
f = open("test.txt", "w+")
data = "123"
f.write(data)
# 读取每行信息
f = open("test.txt", 'r')
lines = f.readlines()
for line in lines:
# replace 执行顺序先左再右
data = line.replace('\r', '').replace('\n', '')
print(data)
# 记得结束函数调用
f.close()
"""
# 这种方式与上面的大同小异,甚至更加麻烦,不推荐
with open("test.txt", 'r') as f:
lines = f.readlines()
for line in lines:
data = line.replace('\r', '').replace('\n', '')
print(data)
"""
- 案例三:一键重命名
import os
# 修改路径
path = 'D:/Work/'
f = os.listdir(path)
n = 0
name_num = 0
for i in f:
# 仅选择目标格式的文件
if("png" not in f[n]):
n += 1
continue
# 设置旧文件名(就是路径 + 文件名)
oldname = path + f[n]
# print(oldname)
# 设置新文件名
newname = path + 'tv-' + str(name_num) + '.png'
# 用 os 模块中的 rename 方法对文件改名
os.rename(oldname, newname)
print(oldname, '======>', newname)
n += 1
name_num += 1
- 案例四:命令行关键字参数(手动)
import os
import sys
import argparse
# 1. 直接接收参数
print('参数个数为:', len(sys.argv), '个参数')
print('参数列表:', str(sys.argv))
print(sys.argv[1], sys.argv[2])
"""
python test.py "happy" "./input/"
---------------------------------------
参数个数为: 3 个参数
参数列表: ['.\\comic.py', 'happy', './input/']
happy ./input/
"""
# 2. 设定接收参数
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--theme', default='校园爱情', type=str, help='主题')
parser.add_argument('--file', default='./input/', type=str, help='文件地址')
args = parser.parse_args()
if not os.path.exists(args.file):
print('Cannot find input path: {0}'.format(args.file))
exit()
print(args.theme, args.file)
'''
python test.py --theme "happy" --file "./input/"
---------------------------------------
happy ./input/
'''
- 案例五:命令行关键字参数(自动)
import subprocess
def runcmd(command):
# 不显示输入内容 stdout=subprocess.PIPE, stderr=subprocess.PIPE
# 编码方式 encoding="utf-8"
ret = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if ret.returncode == 0:
return("success:", ret)
else:
return("error:", ret)
runcmd(["python", "--version"]) # result = runcmd(["python", "--version"])
- 案例六:进程
from pprint import pprint
import psutil
# 列出全部的正在运行的 pid 进程(以数组的形式)
pprint(psutil.pids())
# 假设已知微信的进程是 16948
p = psutil.Process(pid=16948)
# 进程名称
print(p.name()) # WeChat.exe
# 进程的exe路径
print(p.exe()) # D:\WeChat\WeChat.exe
# 进程的工作目录
print(p.cwd()) # D:\WeChat
# 进程启动的命令行
print(p.cmdline()) # ['D:\\WeChat\\WeChat.exe']
# 当前进程 id
# 父进程 id
# 父进程
# 子进程列表
# 进程状态
# 进程用户名
# 进程创建时间,返回时间戳
# 进程使用的 cpu 时间
# 进程所使用的的内存
# 进程打开的文件
# 进程相关的网络连接
# 进程内的线程数量,这个进程开启了多少个线程
# 这个进程内的所有线程信息
# 进程的环境变量
# 结束进程, 返回 None, 执行之后微信就会被强制关闭
# 上面的内容不做记录,详情看开头的参考资料【Python常用库之psutil使用指南】
- 案例七:处理异常
# 处理全部异常
try:
a = '2' + 2
except Exception as e:
print(e)
"""
can only concatenate str (not "int") to str
"""
# 不追踪错误写法(断言异常)
def function():
try:
a = 100
assert a == 10
except AssertionError as e:
print("断言语句异常")
# finally 语句写不写都行,但写了一定会执行
finally:
print("End")
function()
"""
断言语句异常
End
"""
# 追踪错误写法(断言异常)
def function():
try:
a = 100
assert a == 10
except:
raise AssertionError("断言语句异常") from None
finally:
print("End")
function()
"""
Traceback (most recent call last):
File "C:\Users\WPS\Desktop\Temporary\test.py", line 19, in <module>
function()
File "C:\Users\WPS\Desktop\Temporary\test.py", line 15, in function
raise AssertionError("断言语句异常")
AssertionError: 断言语句异常
"""
CSV
- 写入 CSV
import csv
# 1. 写入多行(writerows)
with open('test.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerows(["6","6","6"])
"""
test.csv 内容如下:
6
6
6
"""
# 2. 写入一行(writerow)
with open('test.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(["6","6","6"])
"""
test.csv 内容如下:
6,6,6
"""
- 读取 CSV
import csv
with open('test.csv', newline='', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
print(row)
"""
test.csv 内容如下:
['6', '6', '6']
"""
JSON
import json
# 读取 JSON
with open('./input.json', 'r', encoding='utf-8') as f:
# data 为数组或者字典形式
data = json.load(f)
# 显示 JSON,缩进为 2 个空格
print(json.dumps(data, indent=2))
# 写入 JSON
with open('./output.json', 'w+', encoding='utf-8') as f:
# 写入 JSON 的缩进为 2 个空格
talks_json = str(json.dumps(data, indent=2)).replace("'","\"")
f.write(talks_json)
发邮件
使用到 yagmail 模块,它主要用来自动化发送邮件
pip install yagmail
# 导入 yagmail 模块
import yagmail
import os
path = os.path.join(os.path.abspath('.'), 'a.xlsx')
print(path)
# 连接邮箱服务器
yag = yagmail.SMTP(user='2796308562@qq.com', password='cqbmekjsudcfdhdh', host='smtp.qq.com')
# 邮件内容
yag.send(to=['2796308562@qq.com'], subject='Python 发送邮件', contents=['带有附件的', path])
喜欢划水摸鱼的废人