自动化办公

Prerequisite

参考资料:

获取计算机信息

  • 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])
posted @ 2023-03-04 14:50  筱团  阅读(80)  评论(0编辑  收藏  举报