Python 自动化办公(一)

文章目录

    • 1. 基本操作
    • 2. 文件读写操作
    • 3. 文件压缩处理
    • 4. 如何实现文件的自动分类
    • 5. 如何快速查找文件
    • 6. 自动清理重复文件
    • 7. 批量转换图片格式
    • 8. 图片按时间分类
    • 9. 版本差异控制
    • 10. 模块安装控制
    • 11. 自动开启 mysql 服务
    • 12. 自动定时程序
    • 13. 程序打包功能
    • 14. 发送手机短信
    • 15. PDF 文件
      • 15.1 PDF 文件内容获取
      • 15.2 PDF 加密检查
      • 15.3 PDF 转存


1. 基本操作

获取当前 py 文件名

import os
file = 'test.py'
fname = os.path.basename(file)
print(fname)
#通过 basename() 这个方法,我们可以除去路径只获取文件名称
#如果识别不出来路径报错(转义的问题),在路径前面加上 r。(file = r'C:\Users\15205\PycharmProjects\pachong\xpath\test.py')
file1 = r'C:\Users\15205\PycharmProjects\pachong\xpath\test1.py'
fname1 = os.path.basename(file1)
print(fname1)	#显示的也只有文件名称,不显示路径
# os.path.abspath(filename) 获取完整的带文件名的绝对路径

获取当前 py 文件的工作目录

import os	#导入 python 内置的功能模块
path = os.getcwd()	#使用获取目录的方法,不需要传入参数,将该方法的返回值赋值给 path 变量
print(path)	#打印出变量的值获取工作目录
# os.path.dirname() 方法通过带文件名的完整路径只获取父目录路径,与 os.path.basename() 相反

获取文件大小

import os
fname = 'test.py'	#定义文件名称变量
size = os.path.getsize(fname)	#调用 os 模块的子模块 path 中的 getsize() 方法
print(size)		#返回的文件大小为字节数

文件路径的拼接(带文件名称的完整路径)

import os
fname = 'test.py'
fdir = os.getcwd()
fpath = os.path.join(fdir,fname)
print(fpath)
#这只是对文件名称和路径的拼接,并不一定要文件对象存在

判断文件是否存在

#判断文件是否存在,True/False
import os
file = r'C:\Users\15205\PycharmProjects\pachong\xpath\test.py'
fname = os.path.exists(file)
print(fname)

判断是文件还是目录

#判断是否为文件
import os
file = r'C:\Users\15205\PycharmProjects\pachong\xpath\test.py'
flag = os.path.isfile(file)
print(flag)

#判断是否为目录
import os
filedir = r'C:\Users\15205\PycharmProjects\pachong\xpath'
flag = os.path.isdir(filedir)
print(flag)

如何创建和删除目录

import os
import time
path1 = 'work'
if os.path.exists(path1):
	print("该目录已经存在")
else:
	os.mkdir(path1)
time.sleep(6)
os.rmdir(path1)
print('删除目录成功')

如何删除指定的文件对象

import os
fname = 'car.py'
if os.path.exists(fname):
	os.remove(fname)
else:
	print('当前文件不存在')

获取指定目录的清单信息

import os
fdir = os.getcwd()
infos = os.listdir(dir)
print(infos)

计算指定目录下所有文件的总大小

import osfdir = os.getcwd()flist = os.listdir(fdir)fsize = 0for item in flist:    if os.path.isfile(item):        size = os.path.getize(item)        fsize += sizeprint(fsize)# 单位字节

2. 文件读写操作

如何打开文件

file = open('le1.py', 'r', encoding='utf-8')	# python3 内置方法,打开文件对象
print(file)
# 第一个参数:文件名
# 第二个参数:操作模式
# 第三个参数:编码格式

读取文件所有数据

file = open('le1.py', 'r', encoding='utf-8')
data = file.read()
print(data)
# 读取文件内容过后要释放文件对象,也就是释放其占用的操作系统资源
file.close()

上下文管理器对象

with open('test.py', 'r', encoding='utf-8') as file:
    data = file.read()
    print(data)
# 该方式会自动释放占用的文件资源,无需 file.close()

文件行数据读取

file = open('test.py', 'r', encoding='utf-8')
# 行数据初始值
line = 1
while line != '':	# 行数据不为空
    line = file.readline()
    print(line.strip())	# strip() 去除自动换行

一次读取全部行数据

file = open('test.py', 'r', encoding='utf-8')
lines = file.readlines()	# 区别于 readline
# print(type(lines))	# [第一行数据,第二行数据,第三行数据......]
# print(lines)
for line in lines:
    print(line.strip())

如何写入数据

content = 'i love you'	# 默认字符串类型,类型错误会报错fname = 'stroy.txt'with open(fname, 'w', encoding='utf-8') as file:    file.write(content)# file.write(str(content))	# 强制转换成字符串类型

如何批量写入数据

content = ['i love you\n', 'what?\n', 'hehe\n']fname = 'story.txt'with open(fname, 'w', encoding='utf-8') as file:    file.writelines(content)

如何追加数据

# 上面我们写入数据用的 'w' 操作类型会覆盖数据,下面举例如何追加数据('a')content = 'hello world'fname = 'stroy.txt'with open(fname, 'a', encoding='utf-8') as file:    file.write(str(content))

3. 文件压缩处理

解压缩

import zipfile			# 引入压缩模块,内置模块,无需安装zf = zipfile.ZipFile('stroy.zip', 'r')	# 通过管理器读取压缩文件zf.extractall('outf')	# 指定压缩文件解压后存放的目录,这里为在当前目录创建一个 outf 目录zf.close()				# 释放资源对象

如何读取压缩文件的信息

// 方法一import zipfilezf = zipfile.ZipFile('stroy.zip', 'r')zlist = zf.namelist()	# 读取所有压缩文件的名称print(zlist)			# 打印文件列表// 方法二import zipfilezf = zipfile.ZipFile('stroy.zip', 'r')zlist = zf.infolist()	# 不仅包括文件名,还包含文件大小for info in zlist:    print(info.filename, info.file_size)

目录资源的压缩

import zipfileimport globimport oszf = zipfile.ZipFile('inner.zip', 'w')path1 = glob.glob('outf/*')		# 可使用绝对路径for name in path1:    print(name)    zf.write(name, os.path.basename(name))

4. 如何实现文件的自动分类

前提

同一目录下存在很多不同类型的资源文件。

步骤

  • 分类
  • 创建分类目录
  • 移动文件资源

代码实现

import osimport shutil	# 在 os 模块的基础上再次封装,功能更强大# 源文件的存在路径src_dir = r'C:\Users\15205\PycharmProjects\pachong\xpath\resource'# 分类资源的存放路径dest_dir = r'C:\Users\15205\PycharmProjects\pachong\xpath\classify'# 判断分类目录是否存在,不存在则创建if not os.path.exists(dest_dir):    os.mkdir(dest_dir)# 分析源目录,判断资源类型files = os.listdir(src_dir)for item in files:    # print(item),输出所有文件名    # 处理路径    src_path = os.path.join(src_dir, item)    # 判断状态    if os.path.isfile(src_path):        # 如果是文件,进入到代码块        # 判断文件资源的类型        ndir = item.split('.')[-1]        desc_path = os.path.join(dest_dir, ndir)        # 创建分类        if not os.path.exists(desc_path):            # 如果分类目录不存在则创建            os.mkdir(desc_path)        shutil.move(src_path, desc_path)

5. 如何快速查找文件

直接查找

from os import path

while True:
    # 指定查找目录
    dir = input("要在哪个目录下查找:").strip()
    # 判断
    if path.exists(dir) and path.isdir(dir):
        break
    else:
		print("输入信息有误!")
        
# 确定查找目标(文件,目录)
dist = input("请输入要查找的目标名:")
# 拼接处理
rpath = path.join(dir, dist)
# 判断是否存在
if path.exists(rpath):
    print("查找成功")
else:
    print("查找失败")

# 本程序只能查找指定目录下的文件,那么如何查找指定目录中的目录中的文件呢?

6. 自动清理重复文件

步骤

  • 设定指定目录,文件判断的目录结构

  • 对该目录下所有的文件资源进行分析和对比

  • 将重复多余的文件资源删除清理

代码实现

from pathlib import Path
from filecmp import cmp

dir = r'C:\Users\15205\PycharmProjects\pachong\xpath\test'
path1 = Path(dir)
if not path1.exists():
    print('指定的目录不存在,请重新配置目录')
# test 存在,分析目录下所有的文件资源
plist = list(path1.glob('*'))
print(plist)
if len(plist) == 0:
    print('指定目录为空,没有任何资源')
else:
    # 需要对文件进行分析对比
    flist = [file for file in plist if file.is_file()]
    for m in flist:
        for n in flist:
            if m.exists() and n.exists() and m!=n:
                # 对文件分析对比
                if cmp(m, n):
                    # 表示存在多余的资源,删除多余的资源
                    m.unlink()
    print('重复文件已经清理,感谢使用,再见!')

7. 批量转换图片格式

步骤

  • 包装 path 对象

  • 循环遍历所有图片

  • 获取每一张图片并转换格式

代码实现

from pathlib import Path# 安装第三方库 pip install pillowfrom PIL import Image# 定义两个路径dir1 = r'C:\Users\15205\PycharmProjects\pachong\xpath\test'dir2 = r'C:\Users\15205\PycharmProjects\pachong\xpath\work'# 构造 Path 实例对象path1 = Path(dir1)path2 = Path(dir2)# 判断 work 目录是否存在if not path2.exists():    path2.mkdir()# 遍历 test 目录获取所有文件对象plist = list(path1.glob('*.jpg'))print(plist)# 获取 list 中的每一个文件对象for file in plist:	# 转换图片格式    rpath = (path2/file.name).with_suffix('.png')    # 保存文件对象    # 首先打开原始图片,然后保存新的图片    Image.open(file).save(rpath)print('所有图片已经转换为新的格式 *.png')

8. 图片按时间分类

from pathlib import Path
import os
import shutil
import time

dir1 = r'C:\Users\zhou chang\PycharmProjects\pachong\Xpath\test'
dir2 = r'C:\Users\zhou chang\PycharmProjects\pachong\Xpath\work'
# 包装,创建实例对象
path1 = Path(dir1)
path2 = Path(dir2)
# 判断 work 目录,不存在则创建
if not path2.exists():
    path2.mkdir()
plist = list(path1.glob('*'))
print(plist)
for p in plist:
    with open(p, 'rb') as file:
        info = os.stat(p)
        # print(info)
        t = str(time.localtime(info.st_ctime).tm_year) + str(time.localtime(info.st_ctime).tm_mon)
        # print(t)
        rpath = path2/t
        if not rpath.exists():
            rpath.mkdir()
        # 按时间移动到新的目录下
        # 处理新目录下文件的路径
        rfile = rpath/p.name
    # 移动文件
    p.replace(rfile)       

9. 版本差异控制

步骤

  • 了解版本信息

  • 查看版本信息

  • 版本控制

获取 python 版本信息

import sysinfos = sys.version_infoprint(infos)info = infos[0]print(info)if info < 3:    print('python 版本较低,当前版本为 %s.%s.%s' %(infos[0], infos[1], infos[2]))    print('退出程序的执行')    exit()else:    print('继续执行 python3 版本程序')

10. 模块安装控制

思路

  • 模块未安装错误

  • 分析原因机制

  • 倒推解决方案

  • 程序自动检测控制

场景

import pyecharts	# 运行报错,显示没有这个模块

原因:第三方功能库没有安装
解决方案:
方法一:pip install ***
方法二:pycharm 快捷安装

程序自动检测缺失的功能库,并执行安装

import os
cmd = 'pip install requests'
# pip38 install requests
os.system(cmd)

带上判断然后匹配下载

import os
try:
    import pyecharts
except Exception as e:
    print('检测到功能库没有安装,开始下载安装')
    cmd = 'pip install pyecharts'
    os.system(cmd)

11. 自动开启 mysql 服务

思路

  • mysql 连接错误

  • 异常捕获

  • 自动开启服务

  • 连接数据库

代码实现(通过打开一个子进程自动开启 mysql 服务)

#! /usr/bin/env python
# -*- coding:utf-8 -*-
# 适用于 windows10 安装 8.0 版本 mysql
# pip install pymysql
import pymysql
import subprocess	# 内置模块

# 数据库信息配置
host = '127.0.0.1'
dbname = 'office'
user= 'root'
paw = 'lhn115023808'

# 连接数据库
try:
	pymysql.connect(host=host, port=3306, db=dbname, user=user, passwd=paw)
except Exception as e:
	# 对异常类型进行判断
    if e.__class__.__name__=='OperationalError':
        # mysql 服务未开启
        cmd = 'net start mysql80'	# mysql8.0 版本服务名为 mysql80
    	# 开启子进程,开启 mysql80 服务
        subprocess.call(cmd)
        # 连接 mysql 数据库
        pymysql.connect(host=host, port=3306, db=dbname, user=user, passwd=paw
        print('继续往后正常执行')	# 模拟过程
        # 可能会看到输出乱码,将 pycharm 编码格式改成 GBK            

12. 自动定时程序

思路

  • 场景引入

  • 休眠功能

  • 定时器

  • 调度器

场景一:定时间隔重复完成任务

方法一:线程会阻塞

from datetime import datetime
import time

# 设计功能函数(打印输出时间信息)
def print_time(count):
    # 做的任务
    print(datetime.now().strftime("%Y:%m:%d %H:%M:%S"))		# 年月日时分秒
    time.sleep(count)
    print('间隔%s打印输出' % count)
    
# 重复执行三次
for i in range(3):
    print_time(6)

方法二:多线程

from datetime import datetime
from threading import Timer

def print_time():
    # 做的任务
    print(datetime.now().strftime("%Y:%m:%d %H:%M:%S"))		# 年月日时分秒
    
for i in range(3):
    # 参数:时间间隔 6 秒
    inc = 6
    # 创建定时器对象
    t = Timer(inc, print_time)	# 定时器对象
    t.start()
    print('我不是同步在执行')

场景二:定时定点重复完成任务

定时定点任务的设计

# pip install apscheduler
from datetime import datetime
from apscheduler.schedulers.blocking import BlockingScheduler

# 定制执行任务
def job():
    print(datetime.now().strftime("%Y:%m:%d %H:%M:%S"))
# 创建调度器对象
scheduler = BlockingScheduler()
# 分配任务
scheduler.add_job(func=job, trigger='cron', day_of_week='0-6', hour='17', minute='40', second='00')
# 启动调度器
scheduler.start()

13. 程序打包功能

思路

  • 程序打包意义:将程序和环境一起打包,没有 python 环境也可执行。

  • 功能库安装:安装第三方功能库 pip install pyinstaller

  • 打包程序设计

  • 打包参数配置

编写简单程序并演示打包方法

设计简单程序

#! /usr/bin/env python
# -*- coding:utf-8 -*-

# pip install pyinstaller
# python3.8 及以上的版本安装 pyinstaller 可能不会自动添加环境变量,还是无法使用
# 我的解决方法是将 pyinstaller.exe 复制到当前目录一份

import time

def job():
    print('打包功能演示')

# 写程序入口函数
if __name__=='__main__':
    job()
    • 打包方法一:交互界面打包

cmd 里切换到 py 文件所在的路径

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E9bIQnKj-1643119894604)(C:\Users\15205\AppData\Roaming\Typora\typora-user-images\image-20220124225532077.png)]

执行 pyinstaller -F run.py

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nwMPA6cq-1643119894605)(C:\Users\15205\AppData\Roaming\Typora\typora-user-images\image-20220124230527323.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ju1gfiYX-1643119894606)(C:\Users\15205\AppData\Roaming\Typora\typora-user-images\image-20220124230910450.png)]

点击这个 run.exe 会一闪而过,其实已经执行了。

修改一下代码,重新打包,验证一下。

import time

def job():
    print('打包功能演示')
    time.sleep(20)	# 休眠 20 秒

# 写程序入口函数
if __name__=='__main__':
    job()

pyinstaller -F run.py

新的包会覆盖老的包。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QAjPe7Iu-1643119894606)(C:\Users\15205\AppData\Roaming\Typora\typora-user-images\image-20220124231326983.png)]

可以看到,正在执行。

    • 打包方法二:手动打包写入到程序中

程序自动打包

import os

def main():
    cmd = 'pyinstaller -F run.py'
    os.system(cmd)

if __name__ == '__main__':
    main()

执行脚本,查看输出和结果。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5n2lEH9G-1643119894607)(C:\Users\15205\AppData\Roaming\Typora\typora-user-images\image-20220124232112593.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i7kUQWYW-1643119894607)(C:\Users\15205\AppData\Roaming\Typora\typora-user-images\image-20220124232128294.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QgVowIJ5-1643119894607)(C:\Users\15205\AppData\Roaming\Typora\typora-user-images\image-20220124232211529.png)]

14. 发送手机短信

思路

  • 第三方平台

  • 注册账号

  • 保存 id, token

  • 设计脚本程序

具体实现

打开网页:https://www.yuntongxun.com,注册账号。

accid:8aaf07087e7b9872017e8cb6970002a4
acctoken:ec070071d417407591d44b66e79f97b3
appid:8aaf07087e7b9872017e8cb6980702ab

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9i9qO9Mz-1643119894608)(C:\Users\15205\AppData\Roaming\Typora\typora-user-images\image-20220124233521217.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2RU5RoCp-1643119894608)(C:\Users\15205\AppData\Roaming\Typora\typora-user-images\image-20220124235403256.png)]

程序设计

# pip install ronglian-sms-sdk

# 导包过程
from ronglian_sms_sdk import SmsSDK

# 参数配置
accId = '8aaf07087e7b9872017e8cb6970002a4'
accToken = 'ec070071d417407591d44b66e79f97b3'
appId = '8aaf07087e7b9872017e8cb6980702ab'

# 设计函数(发送手机短信)
# 两个参数:手机号码;验证码及失效时间。
def send_sms(phone, datas):
    # 创建实例化对象
    sdk = SmsSDK(accId, accToken, appId)
    tid = '1'
    # 发送短信
    resp = sdk.sendMessage(tid, phone, datas)
    return resp

if __name__=='__main__':
    # 配置参数
    phone = '***********'
    datas = ('123456', '3')
    send_sms(phone, datas)

执行正常的话,你的手机应该收到验证码短信,验证码为 123456。

15. PDF 文件

15.1 PDF 文件内容获取

思路

  • PyPDF2 功能库(pip install PyPDF2 # 对中文支持不太好)

  • 文件对象

  • 获取文件页数

  • 获取文件数据

文本文件:文本字符串的处理

file = open('test.py', 'r', encoding='utf-8')
print(type(file))
result = file.read()
print(result)

PDF文件:二进制格式数据的处理

import PyPDF2

# 获取文件对象
file = open('show.pdf', 'rb')
pdfrd = PyPDF2.PdfFileReader(file)

# 对象.属性名 获取页数
pages = pdfrd.numPages
# print(pages)
index = int(input('请输入对应的页数(从0开始):'))
if index < pages:
    page = pdfrd.getPage(index)
    result = page.extractText()
    print(result)
else:
    print('页数不存在,请确认!')

15.2 PDF 加密检查

思路

  • 加密状态

  • PDF 解密

判断 pdf 文件是否加密

import PyPDF2

def is_pwd(fname):
    pdfobj = open(fname, 'rb')
    pdfrd = PyPDF2.PdfFileReader(pdfobj)
    # 开始判断属性(加密?) 对象.属性
    if pdfrd.isEncrypted:
        print(f'{fname} 是加密状态')
    else:
        print(f'{fname} 没有加密')

if __name__ == "__main__":
    fname = 'show.pdf'
    is_pwd(fname)

对加密 pdf 文件数据的提取

import PyPDF2

def de_pwd(fname, pwd):
    pdfobj = open(fname, 'rb')
    pdfrd = PyPDF2.PdfFileReader(pdfobj)
    if pdfrd.isEncrypted:
        print('开始进行解密处理:')
        result = pdfrd.decrypt(pwd)
        if result:
            page = pdfrd.getPage(1)
            content = page.extractText()
            print(content)
        else:
            print('抱歉,解密失败了!')
    else:
        print(f'{fname} 是没有加密的状态')

if __name__=='__main__':
    fname = 'show.pdf'
    pwd = '*******'
    de_pwd(fname, pwd)
    
// 如果无法解密,检查密码是否错误。还有一种可能是 PyPDF2 这个模块的问题,这个模块很老了,快要放弃维护,参考:https://blog.csdn.net/weixin_39278265/article/details/84799843

15.3 PDF 转存

思路

  • 单页转存

  • 多页转存

  • 加密转存

将一个 PDF 第二页的内容转存到一个新的文件中

def single_page(fname, new_file, index):
    import PyPDF2
    # 打开原有的 PDF 文件
    pobj = open(fname, 'rb')
    # 构造 reader 对象
    pdfrd = PyPDF2.PdfFileReader(pobj)
    # 获取对应的 page 对象
    page = pdfrd.getPage(index)
    # 写入数据
    pdfwr = PyPDF2.PdfFileWriter()
    # 添加 page 对象
    pdfwr.addPage(page)
    # 创建新的 PDF 文件
    pdfout = open(new_file, 'wb')
    # 核心的一步,转存 pdf 内容
    pdfwr.write(pdfout)
    # 释放文件资源
    pobj.close()
    pdfout.close()

if __name__=="__main__":
    fname = 'old.pdf'
    new_file = 'new.pdf'
    index = 1
    single_page(fname, new_file, index)
    
// 如果报错可能是 PyPDF2 模块的问题

将所有的页数全部转存并加密

def all_page_encrypt(fname, new_file):
    import PyPDF2
    pobj = open(fname, 'rb')
    pdfrd = PyPDF2.PdfFileReader(pobj)
    pdfwr = PyPDF2.PdfFileWriter()
    pages = pdfrd.numPages
    for index in range(pages):
        pdfwr.addPage(pdfrd.getPage(index))
    pdfwr.encrypt('999999')
    pdfout = open(new_file, 'wb')
    pdfwr.write(pdfout)
    pobj.close()
    pdfout.close()

if __name__=="__main__":
    fname = 'old.pdf'
    new_file = 'new1.pdf'
    all_page_encrypt(fname, new_file)

你可能感兴趣的:(python,语法,云计算,python,自动化,后端)