实用python自动化办公(内附解析注释)

757 阅读12分钟

Python操作execl

读取execl工作表内容

需要安装xlrd库

import xlrd  # 引入xlrd库

# 引入工作簿路径
xlsx = xlrd.open_workbook('e:/暑假培训考勤表.xlsx')

# 确定读取的工作表,也可以用工作表名字来索引
# table = xlsx.sheet_by_name("表名")
table = xlsx.sheet_by_index(0)

# 确定单元格的坐标值,并打印,注意不要超过单元格所有的内容否则会报错,以下三种形式是一致的
print(table.cell_value(1, 2))
print(table.cell(1, 2).value)
print(table.row(1)[2].value)

写入execl工作表

需要安装xlwt库

# 引入xlwt库
import xlwt

# 新建一个工作簿
new_workbook = xlwt.Workbook()
# 新建一个工作表
worksheet = new_workbook.add_sheet('sheet1')
# 在工作表指定坐标写入值
worksheet.write(0, 0, 'test')
# 保存工作簿
new_workbook.save('test.xls')

带格式写入execl表

安装xlutils库,将一个excel模板的格式复制的一个新建execl中(此库已于py3.5后不再支持,这里就不讲了)

Python操作数据库

安装模板pymysql

连接数据库

import pymysql
# 连接数据库,格式为: pymysql.connect("地址", "用户名", "密码", "数据库名", "编码格式")
data = pymysql.connect("127.0.0.1", "user", "123456", "acg", charset='utf8')

# 初始化指针,用于数据库查询
cursor = data.cursor()

增删改查的实质是执行了sql语句,主要连接对象是数据库,而操作对象是数据表

# 增语句
sql = "INSERT INTO users(name, password) VALUES ('Auto', '123456');"
# 执行sql语句
cursor.execute(sql)
# 对储存数据修改后,需要commit
data.commit()
# 关闭连接
data.close()

sql = "UPDATE users SET name='Autovy', password='123456' where id='81'"
cursor.execute(sql)
# 对储存数据修改后,需要commit
data.commit()
# 关闭连接
data.close()

1.以一个字段为对象返回
#查
sql = "SELECT nr FROM comment where passage_id='129'"
cursor.execute(sql)
#获取指针指向的数据
result = cursor.fetchall()
#输出获取的元组数据
print(result)
2.以所有内容为对象返回

返回的是一个元组,所有不能以字段索引

sql = "SELECT * FROM comment where passage_id='129'"
cursor.execute(sql)
result = cursor.fetchall()
print(result[1][1])
3.使用合计函数,需要分组返回
sql = "SELECT sum(id) FROM comment GROUP BY belong_id;"
cursor.execute(sql)
result = cursor.fetchall()
print(result)

# 删
sql = "DELETE FROM users WHERE name='Auto' "
cursor.execute(sql)
# 对储存数据修改后,需要commit
data.commit()
# 关闭连接
data.close()

用 xlwriter,openpyxl 更灵活操作 Excel

其他操作excel的方法

xlwriter

安装xlwriter模板

特别要注意新建工作表的Workbook的w要大写

# 把xlsxwriter用缩写xw写入
import xlsxwriter as xw

# 新建工作簿
workbook = xw.Workbook('test.xlsx')
# 新建工作表
sheet0 = workbook.add_worksheet('sheet0')
# 写入数字
for i in range(0, 300):
    sheet0.write(0, i, i)
# 关闭并保存
workbook.close()

openpyxl

安装openpyxl模板

import openpyxl
# 打开工作簿
workbook = openpyxl.load_workbook('暑假培训考勤表.xlsx')
# 打开工作表
sheet0 = workbook['Sheet1']
# 向单元格写入值,通过字母于数字的组合
sheet0['B3'] = '5'
sheet0['B4'] = '7'
# 保存文件
workbook.save('暑假培训.xlsx')

实用案例:文件名整理成excel

os模板是python内置的模板,不需要额外安装

# python os模板处理文件和目录
import os
import xlwt

# 文件路径
file_dir = 'C:/Users/linghao/Desktop/编程笔记'

# 返回指定文件名字的列表
os.listdir(file_dir)
# 创建工作簿存储信息
new_workbook = xlwt.Workbook()
worksheet = new_workbook.add_sheet('编程笔记')

# 读取文件名并写入表格,用i逐个读取列表file_dir的内容
n = 0
for i in os.listdir(file_dir):
    worksheet.write(n, 0, i)
    n += 1

# 保存工作簿
new_workbook.save('编程文件名.xls')

实用案例:加载网页判断元素

import xlrd
from bs4 import BeautifulSoup
import urllib.request
import xlwt


xlsx = xlrd.open_workbook('684--1366.xlsx')
table = xlsx.sheet_by_index(0)
new_workbook = xlwt.Workbook()
worksheet = new_workbook.add_sheet('sheet1')


for i in range(530, 683, 1):

    url = table.cell(i, 7).value
    mysite = urllib.request.urlopen("{}".format(url)).read()
    soup = BeautifulSoup(mysite, "html5lib")
    choose = soup.select('ol')

    if(choose):
        worksheet.write(i, 0, 'A')



new_workbook.save('test.xls')

Python操作word

写入word

# 负责新建文档
from docx import Document
# 对齐
from docx.enum.text import WD_ALIGN_PARAGRAPH
# 磅数
from docx.shared import Pt
# 中文格式
from docx.oxml.ns import qn
# 引入时间模板
import time

# 输入今日价格
price = input('价格:')
# 对象
company_list = ['A先生', 'B先生', 'C先生', 'D先生']
# 获取今日时间time.localtime(),整理形式time.strftime()
today1 = time.strftime("%Y-%m-%d", time.localtime())
# 整理成年月日的形式(time库对中文支持差,所以需要format来插入字符串变量)
today = time.strftime("%Y{y}%m{m}%d{d}", time.localtime()).format(y='年', m='月', d='日')


# 遍历对象列表
for i in company_list:
    # 新建一个文档
    document = Document()
    # 设置文档基础字体,注意该处的styles有个s
    document.styles['Normal'].font.name = u'宋体'
    # 设置文档基础中文字体
    document.styles['Normal'].element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')

    #初始建立第一个自然段
    p1 = document.add_paragraph()
    # 设置第一自然段对齐方式,默认为左对齐
    p1.alignment = WD_ALIGN_PARAGRAPH.CENTER
    # 在第一自然段添加文字内容
    run1 = p1.add_run("关于下达%s产品价格的通知" % (today))

    # 设置字体格式
    # 设置字体样式和字体大小
    run1.font.name = '微软雅黑'  # 西文字体
    run1.element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')  # 中文字体
    run1.font.size = Pt(21)
    # 设置加粗
    run1.font.bold = True
    # 段后距离5磅
    p1.space_after = Pt(5)
    # 段前距离5磅
    p1.space_after = Pt(5)


    # 建立第二自然段
    p2 = document.add_paragraph()
    # 在第二自然段添加文字内容,对用户的称呼
    run2 = p2.add_run(i + ':')

    # 设置字体格式
    # 设置字体样式和字体大小
    run2.font.name = '仿宋'  # 西文字体
    run2.element.rPr.rFonts.set(qn('w:eastAsia'), u'仿宋')  # 中文字体
    run2.font.size = Pt(16)
    # 设置加粗
    run2.font.bold = True

    # 建立第三自然段
    p3 = document.add_paragraph()
    # 在第三自然段添加文字内容,对用户的称呼
    run3 = p3.add_run('根据公司安排,我单位拟定今日发工资%s元,特此通知' % price)

    # 设置字体格式
    # 设置字体样式和字体大小
    run3.font.name = '仿宋'  # 西文字体
    run3.element.rPr.rFonts.set(qn('w:eastAsia'), u'仿宋')  # 中文字体
    run3.font.size = Pt(16)
    # 设置加粗
    run3.font.bold = True
    
    
    # 以客户名-价格通知作为文件名保存
    document.save('%s-价格通知.docx' % i)

插入表格图片

# 负责新建文档
from docx import Document
# 对齐
from docx.enum.text import WD_ALIGN_PARAGRAPH
# 磅数
from docx.shared import Pt
# 中文格式
from docx.oxml.ns import qn
# 图片尺寸
from docx.shared import Inches
import time

# 获得当前日期
today = time.strftime("%Y{y}%m{m}%d{d}", time.localtime()).format(y='年', m='月', d='日')

# 输入今日价格
price = input('价格:')
# 对象
company_list = ['A先生', 'B先生', 'C先生', 'D先生']

# 遍历对象列表
for i in company_list:
    # 新建一个文档
    document = Document()
    # 设置文档基础字体,注意该处的styles有个s
    document.styles['Normal'].font.name = u'微软雅黑'
    document.styles['Normal'].font.size = Pt(14)
    # 设置文档基础中文字体
    document.styles['Normal'].element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')

    # 在文档内插入图片,宽度为6英寸
    document.add_picture('test.jpg', width=Inches(6))

    # 文档内插入表格
    # 创建一个行为3,列为3的表格
    table = document.add_table(rows=3, cols=3, style='Table Grid')
    # 合并表格,起点为左上角,终点为右下角
    table.cell(0, 0).merge(table.cell(0, 2))

    # 填写表格(比一般的自然段多一个表格定位)
    # 填写第一格
    table_run1 = table.cell(0, 0).paragraphs[0].add_run("xx产品报价表")
    # 修改中西文字体
    table_run1.font.name = u'隶属'
    table_run1.element.rPr.rFonts.set(qn('w:eastAsia'), u'隶书')
    # 居中显示,注意paragraphs只能为0,不然会有超出限制的报错
    table.cell(0, 0).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER

    # 填写其他格,直接采用文档默认字体
    table.cell(1, 0).text = '日期'
    table.cell(1, 1).text = '价格'
    table.cell(1, 2).text = '备注'
    table.cell(2, 0).text = today
    table.cell(2, 1).text = str(price)
    table.cell(2, 2).text = ''

    # 分页,在新一页插入其他内容
    document.add_page_break()

    document.save('%s-价格通知.docx' % i)

读取word文档

1.读取纯文本
from docx import Document

# 打开一个文档
document = Document("信息安全协会介绍资料2.0.docx")
# 获取所有段落
all_paragraphs = document.paragraphs

# 逐个读取段落,一般不读取run中的,因为会出现文字割裂的问题
for paragraph in all_paragraphs:
    print(paragraph.text)
2.读取表格中的文字
from docx import Document

# 打开一个文档
document = Document("A先生-价格通知.docx")
# 获取所有表
all_tables = document.tables

for table in all_tables:
    # 获取所有行
    for row in table.rows:
        # 每一行获取所有单元格
        for cell in row.cells:
            # 打印单元格内的文字
            print(cell.text)
3.更加复杂的文本提取(表格,文本混合)
import zipfile

# 以压缩包的形式打开word文档
# 设置文件路径,解压文件
word = zipfile.ZipFile('信息安全协会介绍资料2.0.docx')
# word文档内容储存在文件的word/document.xml文件内,设置编码方式
xml = word.read('word/document.xml').decode('utf-8')

# 以<w:t>为间隔,分割字符串,形成一个列表
xml_list = xml.split('<w:t>')
# 设置一个空列表,储存过滤后的字符
text_list = []
# 对字符切片后以列表的形式存储
for i in xml_list:
    if i.find('</w:t>')+ 1:
        text_list.append(i[:i.find('</w:t>')])
    else:
        pass
# 将列表提取为纯文本    
text = "".join(text_list)
print(text)

word格式套用

1.创造模板(写word)

对之前写入word的方法进行了优化,以函数做好封装

# 老四样
# 负责新建文档
from docx import Document
# 对齐
from docx.enum.text import WD_ALIGN_PARAGRAPH
# 磅数
from docx.shared import Pt
# 中文格式
from docx.oxml.ns import qn

# 用户列表
user_list = ['A', 'B', 'C']

for change in user_list:

    # 基础设置
    document = Document()
    document.styles['Normal'].font.name = u'黑体'
    document.styles['Normal'].element.rPr.rFonts.set(qn('w:eastAsia'), u'黑体')

    # 创建文字模板
    def add_context(context):
        p = document.add_paragraph()
        p.alignment = WD_ALIGN_PARAGRAPH.LEFT
        r = p.add_run(str(context))
        r.font.size = Pt(16)
        p.space_after = Pt(5)
        p.space_before = Pt(5)

    add_context("尊敬的%s客户:" % change)
    add_context("你好")

    document.save('给%s客户的信.docx' % change)
2.套用模板(修改word)
from docx import Document

# 读取word文件
document = Document("信息安全协会介绍资料2.0.docx")

def change_text(old_text, new_text):
    # 修改纯文本
    # 复制粘贴word文档内容包括格式
    all_paragraphs = document.paragraphs
    for paragraphs in all_paragraphs:
        for run in paragraphs.runs:
            # 修改文字
            run_text = run.text.replace(old_text, new_text)
            run.text = run_text

    # 修改表格
    all_tables = document.tables
    for table in all_tables:
        for row in table.rows:
           for cell in row.cells:
                cell_text = cell.text.replace(old_text, new_text)
                cell.text = cell_text

# 替换字符串
change_text('社团', '协会')
# 可以覆盖保存,但注意要将打开程序关闭
document.save("信息安全协会介绍资料2.0.docx")

注:这里的表格修改会使用默认格式,所以要保持原样要另外设置文档格式

word转pdf

要注意里面用到的路径一定要是绝对路径,因为实际上调用了office而不是python

需要安装库pywin32

# 使用win32模板的功能
from win32com.client import Dispatch, constants, gencache

# 确定读取docx的路径,保存pdf路径
docx_path = 'C:/Users/linghao/Desktop/test/信息安全协会介绍资料2.0.docx'
pdf_path = 'C:/Users/linghao/Desktop/test/信息安全协会介绍资料.pdf'

# 指向offic的功能并调用
gencache.EnsureModule('{00020905-0000-0000-C000-000000000046}', 0, 8, 4)

# 调用word服务,开始转换
wd = Dispatch("Word.Application")
doc = wd.Documents.Open(docx_path, ReadOnly=1)
doc.ExportAsFixedFormat(pdf_path, constants.wdExportFormatPDF, Item=constants.wdExportDocumentWithMarkup,CreateBookmarks=constants.wdExportCreateHeadingBookmarks)

# 退出并保存
wd.Quit(constants.wdDoNotSaveChanges)

读取pdf

需要安装库pdfminer3k(保证兼容3.0以后的python)

# 导入各种库
# 字符无结构传递库
from io import StringIO
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams

# 打开pdf
pdf_file = open('信息安全协会介绍资料.pdf', 'rb')
# 关键数据赋值
rsrcmgr = PDFResourceManager()
retstr = StringIO()
laparams = LAParams()

# 进行文字转换
device = TextConverter(rsrcmgr=rsrcmgr, outfp=retstr, laparams=laparams)
# 参数传入
process_pdf(rsrcmgr=rsrcmgr, device=device, fp=pdf_file)
# 关闭
device.close()
# 用IO流的方式读取内存中的值
content = retstr.getvalue()
# 关闭
retstr.close()
pdf_file.close()
print(content)

pandas导入excel数据

需要安装pandas模板

import pandas as pd

# 用pandas打开excel
e_file = pd.ExcelFile('684--1366原.xlsx')
# 指定表名
data = e_file.parse('Sheet1')
print(data)

python调用API

# 请求url的库
import urllib.request
# 处理json数据的库
import json



# 构造url
key = 'test123'
question1 = input("请输入你的问题:")
# 翻译一下中文问题,否则会报错
question = urllib.request.quote(question1)
host = 'http://api.gochati.cn/jsapi.php?q=%s&token=%s' % (question, key)

# 发送url请求
request = urllib.request.Request(host)
# request添加一个头,确定发送的数据格式
request.add_header('Content-Type', 'application/json; charset=utf-8')

# 接收返回的数据
response = urllib.request.urlopen(request)
# 读取返回的内容, 并用json翻译读取的数据
content = response.read().decode("utf-8")
json_all = json.loads(content)
print(content)

python微信自动发送消息

# 引入处理微信的库,要保证可以登录微信网页版
import itchat
# 登录微信,允许在命令行中生成二维码,cmd才可以正常显示二维码
itchat.auto_login(enableCmdQR=True, hotReload=True)
# 搜索到好友名称,可获得昵称,个人介绍,注释名等信息
to_name = itchat.search_friends(name='哥头')
print(to_name)
# 文本消息发送
itchat.send('你好鸭!', toUserName=to_name[0]["UserName"])
# 图片发送
file_img = 'test.jpg'
itchat.send_image(file_img, toUserName=to_name[0]["UserName"])
# 文件发送
file = '684--1366原.xlsx'
itchat.send_file(file, toUserName=to_name[0]["UserName"])

python自动收信息

import itchat
# 识别接收的信息内容
from itchat.content import *

# 函数修饰,判断接收信息类型
# 为文本则执行
@itchat.msg_register(TEXT)
def text_rely(msg):
    print(msg.text)
    reply_text = msg.text.replace('吗?', '!')
    # 发出用以回复的消息
    return reply_text
# 为文件则执行
@itchat.msg_register([PICTURE, RECORDING, ATTACHMENT,VIDEO])
def download_files(msg):
    # 保存文件
    msg.download(msg.fileName)
    return '收到'

# 自动且持续登录
itchat.auto_login(enableCmdQR=True, hotReload=True)
# 自动运行
itchat.run()

python实时修改文件发送信息

文件已修改,信息就发送

import os
import time
import xlrd
import itchat

# 登录微信
itchat.auto_login(enableCmdQR=True, hotReload=True)
# 检查excel文件的日期变化,保存初始数据
change_time_save = time.ctime(os.stat('暑假培训学习情况汇总.xlsx').st_mtime)
while True:
    time.sleep(2)
    # 获得当前文件修改时间
    change_time = time.ctime(os.stat('暑假培训学习情况汇总.xlsx').st_mtime)
    # 如果文件没有改变,则跳过
    if change_time_save == change_time:
        pass
    # 如果文件改变,发送
    else:
        change_time_save = change_time
        # 以下读取工作簿信息
        xlsx = xlrd.open_workbook('暑假培训学习情况汇总.xlsx')
        table = xlsx.sheet_by_index(0)
        content = str(table.cell_value(0,0))
        to_name = itchat.search_friends(name='哥头')
        itchat.send(content, toUserName=to_name[0]["UserName"])
        print("sent")

python爬取静态网页

from bs4 import BeautifulSoup
import requests

word = input("请输入需要查找的单词:")
# 构造url
url = 'https://youdao.com/w/eng/' +  word

# 访问一个网页
web_data = requests.get(url).text
# 用lxml解析网页
soup = BeautifulSoup(web_data, 'lxml')
# 操作soup以获得页面元素, get_text()获得文字
meaning = soup.select('#phrsListTab > div.trans-container > ul > li')
# 相同元素可for循环遍历
for i in meaning:
    print(i.get_text())

python爬取动态页面

需要安装selenium库和PhantomJS工具

from selenium import webdriver
import time

# 调用phantomjs,使用模拟浏览器打开页面
driver = webdriver.PhantomJS(executable_path="D:/phantomjs-2.1.1-windows/phantomjs-2.1.1-windows/bin/phantomjs.exe")
# 打开想爬取的网页
driver.get("https://www.bilibili.com/video/BV14A411v7Sx?p=59")
# 停顿5秒保证页面加载完毕
time.sleep(5)
# 选择器筛选需要的部分
data = driver.find_element_by_css_selector("#viewbox_report > div:nth-child(3)").text
print(data)
# 关闭页面
driver.quit() 

python网页自动输入

from selenium import webdriver
# 键盘鼠标点击模拟板块
from selenium.webdriver.common.keys import Keys
import time

# 调用phantomjs,使用模拟浏览器打开页面
driver = webdriver.PhantomJS(executable_path="D:/phantomjs-2.1.1-windows/phantomjs-2.1.1-windows/bin/phantomjs.exe")
# 打开想爬取的网页
driver.get("https://www.baidu.com/")
# 停顿5秒保证页面加载完毕
time.sleep(5)

# 定位表单位置,输入文字
driver.find_element_by_css_selector("#kw").send_keys("bilibili")

# 模拟点击(按键)提交
# 模拟回车
driver.find_element_by_css_selector("#kw").send_keys(Keys.RETURN)
# 停顿5秒保证页面加载完毕
time.sleep(5)
# 模拟鼠标点击提交
driver.find_element_by_id("su").click()
time.sleep(5)
# 保存页面截图
driver.save_screenshot("baidu2.png")

# 对浏览器的一些操作
# driver.back() 回退
# driver.forward() 前进
# driver.refresh() 刷新

补充模拟组合键的方法

driver.find_element_by_css_selector("#kw").send_keys(Keys.CONTROL, "a")    
driver.find_element_by_css_selector("#kw").send_keys(Keys.CONTROL, "x")    

python管理文件

import os
# 初始化一个空列表存储文件
list_all = []
# 搜索一个目录下的所有文件夹和所有文件
for root, dirs, files in os.walk('C:/Users/linghao/Desktop/编程笔记'):
    # 获得文件
    for name in files:
        # 获得文件路径
        file_path = os.path.join(root, name)
        # 获得文件名
        file_name = os.path.split(file_path)[-1]
        list_all.append(file_name)
    print(list_all)

用正则重命名文件

# 导入正则库
import re
import os

# 正则匹配所有xlsx文件
pattern = re.compile(r'.+\.docx')
# 获取文件信息
for root, dirs, files in os.walk('C:/Users/linghao/Desktop/签到文档/'):
    # 获取文件名
    for name in files:
        # 获取文件路径
        file_path = os.path.join(root, name)
        # 正则匹配
        matching = pattern.search(file_path)
        if matching:
            # 更名(路径对路径),注意最后的文件名要加斜杠
            os.rename(file_path, os.path.split(file_path)[-2] + '/233.docx')

复制和删除文件

# 导入正则库
import re
import os

# 正则匹配所有xlsx文件
pattern = re.compile(r'.+\.docx')
# 获取文件信息
for root, dirs, files in os.walk('C:/Users/linghao/Desktop/签到文档/'):
    # 获取文件名
    for name in files:
        # 获取文件路径
        file_path = os.path.join(root, name)
        # 正则匹配
        matching = pattern.search(file_path)
        if matching:
            # 调用系统命令行复制文件
            command_line = 'copy %s C:\\Users\\linghao\\Desktop\\备份' % file_path.replace('/', '\\')
            os.system(command_line)
            os.remove(file_path)