python自动化办公培训_python-自动化办公
Excel處理
需要安裝xlrd、xlwt、xlutils三個包
Excel讀
import xlrd
#文件載入
wb = xlrd.open_workbook('../test/datafiles/test.xls')
# 獲取sheet信息
# 獲取sheet數(shù)量
print("sheet 數(shù)量:", wb.nsheets)
# 獲取sheet名
sheets = wb.sheets()
print("sheet名稱:", wb.sheet_names())
# 根據(jù)索引-通過sheet對象獲得
sh = wb.sheet_by_index(0)
print(sh.name)
# 根據(jù)名稱-通過sheet對象獲得
sh = wb.sheet_by_name('fruits')
print(sh.name)
#
# 取整行、整列
print("sheet %s 有 %s 行 %s 列" % (sh.name, sh.nrows, sh.ncols))
print("第一行的值為:", sh.row_values(0))
print("第二列的值為:", sh.col_values(1))
# 單元格操作
cell = sh.cell(0, 1)
print("第一行的第二列的值:", cell.value)
#獲取單元格類型 0 空值; 1 字符串; 2 數(shù)值; 3 日期
print("第二行第二列的類型是:", sh.cell(11, 1).ctype)
# 數(shù)值
cell = sh.cell(2, 3)
if cell.ctype == 2:
print("第3行的第4列的值:", int(cell.value))
print("最后一行最后一列的值:", sh.cell_value(-1, -1))
# 日期時間
sh = wb.sheet_by_name('fruits')
cell = sh.cell(1, 0)
if cell.ctype == 3:
value = xlrd.xldate_as_datetime(cell.value, 0)# 獲得一datetime對象
print(value.strftime('%Y-%m-%d'))
for i in range(sh.nrows):#讀行
for j in range(sh.ncols):#讀列
cell = sh.cell(i, j)
value = cell.value
if cell.ctype == 2:
if j == 4:
value = int(value)
elif j == 5:
value = round(value, 1)
elif j == 6 or j == 7:
value = round(value, 2)
elif cell.ctype == 3:
d = xlrd.xldate_as_datetime(value, 0)
value = d.strftime('%Y-%m-%d')
print(str(value).center(10), end='\t')#字符串不足10位補滿10位后居中
print()
Excel寫
import xlwt
wb = xlwt.Workbook()#創(chuàng)建一個Excel對象
sh = wb.add_sheet('第一季度', cell_overwrite_ok=True)#某個單元格可以復(fù)寫,多次寫入不報錯
sh.write(0, 0, '姓名')
sh.write(0, 1, '1月')
sh.write(0, 2, '2月')
sh.write(0, 3, '3月')
sh = wb.add_sheet('平方值', cell_overwrite_ok=True)
for i in range(20):
sh.row(i).write(0, i+1)#在第i行第1列寫內(nèi)容
sh.row(i).write(1, (i+1) * (i+1))#在第i行第2列寫內(nèi)容
wb.save('../test/datafiles/test_write.xls')
Excel寫入讀出的內(nèi)容&編輯寫入后的
讀寫改Excel
rfile_ph='../test/datafiles/test.xls'
wfile_ph='../test/datafiles/test_write1.xls'
#寫入讀出
import xlwt
import xlrd
re = xlrd.open_workbook(rfile_ph).sheet_by_index(0)#獲取第一個頁簽對象
we = xlwt.Workbook()#創(chuàng)建一個Excel對象
sh = we.add_sheet('復(fù)制后sheet1', cell_overwrite_ok=True)#某個單元格可以復(fù)寫,多次寫入不報錯
for i in range(re.nrows):#讀行
for j in range(re.ncols):#讀列
sh.write(i, j, re.cell(i, j).value) # 在第i行第1列寫內(nèi)容
we.save(wfile_ph)
#修改
from xlutils import copy
rb = xlrd.open_workbook(wfile_ph) #打開文件
wb = copy.copy(rb) #利用xlutils.copy下的copy函數(shù)復(fù)制
ws = wb.get_sheet(0) #獲取表單0
ws.write(0, 0, 'changed!') #改變(0,0)的值
ws.write(8,0,label = '好的') #增加(8,0)的值
wb.save(wfile_ph)
Word處理
Word寫
需要安裝python-docx包
from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.shared import Mm, Inches, Pt, RGBColor
doc = Document()
title = doc.add_heading("每日運營數(shù)據(jù)分析報告", 0)#增加標題 級別1
title.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER#一級標題并且居中
doc.add_paragraph('此報告為Python腳本每日自動生成,共分為三部分')#新增段落
doc.add_paragraph('數(shù)據(jù)匯總', style="List Number")#新增段落,風(fēng)格為列表 1.數(shù)據(jù)匯總
doc.add_paragraph('線上數(shù)據(jù)', style="List Number")#新增段落,風(fēng)格為列表 2.線上數(shù)據(jù)
doc.add_paragraph('線下數(shù)據(jù)', style="List Number")
doc.add_heading('數(shù)據(jù)匯總', 1)#增加標題 級別2
online_sale = 292932
shop_sale = 192837
pg = doc.add_paragraph('昨日線上銷售總額為{:,}元,線下銷售總額為{:,}元,'
'總計銷售額為{:,}元'.format(online_sale, shop_sale, online_sale + shop_sale))
pg.paragraph_format.left_indent = Mm(5)#增加5毫米縮進
doc.add_heading('線上數(shù)據(jù)分析', 1)
pg = doc.add_paragraph('各渠道類型銷售金額分布如下:')
pg.add_run('免費渠道為292189元,付費渠道為283272元')#增加文本
doc.add_picture('../test/datafiles/online_sale.png', width=Inches(5.5))#增加圖片并限制大小
doc.add_paragraph('建議改進方案:')
doc.add_paragraph('增加付費廣告投放', style="List Bullet")#新增段落,風(fēng)格為列表-小圓點 ·增加付費廣告投放
doc.add_paragraph('提高著陸頁的加載速度', style="List Bullet")#新增段落,風(fēng)格為列表-小圓點 ·提高著陸頁的加載速度
doc.add_paragraph('減少頁面跳轉(zhuǎn)', style="List Bullet")
doc.add_heading('線下數(shù)據(jù)分析', 1)
table = doc.add_table(rows=1, cols=3)#新增表格
cells = table.rows[0].cells
cells[0].text = '城市'
cells[1].text = '銷量'
records = [
['北京', '100'],
['上海', '120'],
['天津', '300'],
['河北', '200'],
['廣東', '400'],
['遼寧', '500'],
['江蘇', '700'],
['湖南', '600']
]
for city, amount in records:
cells = table.add_row().cells
cells[0].text = city
cells[1].text = amount
doc.add_picture('../test/datafiles/city_sale.png', width=Inches(5.5))
graph = doc.add_paragraph()
graph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT #右對齊
graph.add_run('報告撰寫人:').bold = True
graph.add_run('劉德華')
graph = doc.add_paragraph()
graph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
graph.add_run('聯(lián)系郵箱:').bold = True
run = graph.add_run('xxxx@email.com')
run.font.name = 'Times New Roman'#字體
run.font.size = Pt(12)#大小
run.italic = True#斜體
run.underline = True#下劃線
doc.add_page_break()#強制增加分頁
graph = doc.add_paragraph()
graph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
run = graph.add_run('謝謝觀看')
run.font.color.rgb = RGBColor(255, 0, 0)#顏色 RGB
doc.add_paragraph('此報告為機密文件,請勿泄露', style="Intense Quote")
doc.save('../test/datafiles/daily_report.docx')
Word轉(zhuǎn)PDF
需要安裝doxc2pdf包
from docx2pdf import convert
convert('../test/datafiles/daily_report.docx', '../test/datafiles/運營報告.pdf')
PDF處理
PDF讀取
需要安裝pdfminer包
from docx2pdf import convert
convert('../test/datafiles/daily_report.docx', '../test/datafiles/運營報告.pdf')
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfparser import PDFParser
from io import StringIO
output_string = StringIO()
with open('../test/datafiles/運營報告.pdf', 'rb') as f:
# 從文件句柄創(chuàng)建一個pdf解析對象
parser = PDFParser(f)
# 創(chuàng)建pdf文檔對象,存儲文檔結(jié)構(gòu)
doc = PDFDocument(parser)
# 創(chuàng)建一個pdf資源管理對象,存儲共享資源
rm = PDFResourceManager()
# 創(chuàng)建一個device對象,指定參數(shù),行距、邊距等,這里使用默認參數(shù)
device = TextConverter(rm, output_string, laparams=LAParams())
# 創(chuàng)建一個解釋對象
interpreter = PDFPageInterpreter(rm, device)
# 按頁解析pdf文件
for page in PDFPage.create_pages(doc):
# 將內(nèi)容讀取到緩存
interpreter.process_page(page)
# 打印出緩沖區(qū)的內(nèi)容
print(output_string.getvalue())
PDF讀取
需要安裝pypdf2包
#添加水印
from PyPDF2 import PdfFileReader, PdfFileWriter
watermark_pdf = PdfFileReader('../test/datafiles/水印.pdf')
watermark = watermark_pdf.getPage(0)#讀取第一頁
input_pdf = PdfFileReader('../test/datafiles/運營報告.pdf')
writer = PdfFileWriter()
for pn in range(input_pdf.getNumPages()):
page = input_pdf.getPage(pn)
page.mergePage(watermark)#合并頁
writer.addPage(page)
with open('../test/datafiles/包含水印.pdf', 'wb') as f:
writer.write(f)
郵件發(fā)送
不需要安裝其他包,需要用你本地自己的郵箱發(fā)送,所以需要去郵箱設(shè)置開啟POP3/SMTP服務(wù)。
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# 1. 設(shè)置服務(wù)器所需信息
# SMTP服務(wù)器域名
mail_host = 'smtp.qq.com'
# 郵箱用戶名
mail_user = '651435666@qq.com'
# 密碼或授權(quán)碼
mail_pass = '這里填寫授權(quán)碼'
# 郵件發(fā)送方郵箱地址,有可能和用戶名不一樣
sender = '651435666@qq.com'
# 郵件接收方郵箱地址,可以有多個收件人,所以用列表
receivers = ['651435666@qq.com']
# 2 設(shè)置郵件內(nèi)容
# 可以帶附件的郵件消息對象
message = MIMEMultipart()
# 郵件主題
message['Subject'] = '每日運營報告'
# 發(fā)送方信息
message['From'] = sender
# 接受方信息
message['To'] = receivers[0]
# 2.1 郵件正文
content = MIMEText('詳情請見附件','plain','utf-8')
# 將正文添加到消息對象中
message.attach(content)
# 2.2 構(gòu)造附件
with open('../test/datafiles/運營報告.pdf', 'rb') as f:
# 設(shè)置附件的文件路徑
att = MIMEText(f.read(), 'base64', 'utf-8')
# 設(shè)置附件頭信息:文件類型、文件名
att["Content-Type"] = 'application/octet-stream'
att["Content-Disposition"] = 'attachment; filename="daily_report.pdf"'
# 將附件添加到郵件內(nèi)容中
message.attach(att)
# 3. 發(fā)送郵件
try:
smtpObj = smtplib.SMTP_SSL(mail_host, 465)
# 設(shè)置日志級別,這樣萬一出錯就會有詳細的輸出
smtpObj.set_debuglevel(1)
# 登錄到服務(wù)器
smtpObj.login(mail_user, mail_pass)
#發(fā)送
smtpObj.sendmail(sender, receivers, message.as_string())
smtpObj.quit()
print('郵件發(fā)送成功')
except smtplib.SMTPException as e:
print('error', e)
爬蟲
網(wǎng)頁抓取
#網(wǎng)頁的抓取
import requests
r=requests.get('https://news.sina.com.cn/')
#設(shè)置編碼格式
r.encoding='utf-8'
#查看返回的狀態(tài)碼 200是正常 400找不到 500他們服務(wù)器有問題
print(r.status_code)
#若返回的狀態(tài)碼不是200,拋異常,后續(xù)代碼不再執(zhí)行
r.raise_for_status()
#查看網(wǎng)頁的內(nèi)容
# print(r.text)
#帶參數(shù)的URL-動態(tài)?成參數(shù)
params = {'product_id': '123', 'key': 'iphone'}
r=requests.get('https://item.jd.com/100008567426.html', params=params)
print(r.status_code)
# 設(shè)置頭信息
headers = {
'Cookie': 'll="108288"; bid=v8-QyOSurlo',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'
}
# 使?GET?法請求服務(wù)器
response = requests.request("GET", 'https://httpbin.org/post', headers=headers)
# 當(dāng)返回的狀態(tài)碼不是2xx時,將會拋出異常
response.raise_for_status()
# 打印具體的狀態(tài)碼數(shù)值
print(response.status_code)
if response.status_code == 200:
print("ok")
else:
print("error")
網(wǎng)頁處理
需要引用beautifulsoap4包
#網(wǎng)頁的處理
from bs4 import BeautifulSoup
with open('../test/datafiles/python.html', encoding='utf-8') as f:
text = f.read()
# 以字符串對象創(chuàng)建BeautifulSoup對象
bs = BeautifulSoup(text, 'lxml')
# ?整的打印出所有HTML代碼
print(bs.prettify())
# title節(jié)點的名稱
print(bs.title.name)
# title節(jié)點的?本
print(bs.title.text)
# title節(jié)點的?節(jié)點名稱
print(bs.title.parent.name)
# 第?個p節(jié)點的?節(jié)點的所有?節(jié)點
print(bs.p.parent.children)
# p節(jié)點的class屬性
print(bs.p['class'])
# 第?個a標簽節(jié)點
print(bs.a)
# 所有的a標簽節(jié)點
print(bs.find_all('a'))
# 屬性id為title1的第?個節(jié)點
print(bs.find(id='title1'))
# 找出所有class屬性為paragraph的p標簽,注意class是Python中的關(guān)鍵字,所以在傳參數(shù)時加了?個下劃線。
bs.find_all('p', class_='paragraph')
# 第?個a節(jié)點
print(bs.find('a'))
# 找出所有的a節(jié)點,并打印他們的?本
for a in bs.find_all('a'):
print(a.text)
# 獲取?檔內(nèi)所有?字內(nèi)容
print(bs.get_text())
爬取實戰(zhàn)
#網(wǎng)站爬取
import requests
from bs4 import BeautifulSoup
# 起始??
start_url = 'http://quotes.toscrape.com'
# 剛開始的時候下??就是起始?
next_page_url = start_url
# 不停的獲取下??
while next_page_url:
r = requests.get(next_page_url)
r.raise_for_status()
bs = BeautifulSoup(r.text, 'html.parser')
# 解析出當(dāng)前??的內(nèi)容
div_list = bs.find_all('div', class_='quote')
for div in div_list:
print(div.small.text, ':', div.span.text)
# 獲取下??按鈕
next_page = bs.find('li', class_='next')
if not next_page:
# 如果沒有下??,結(jié)束爬?
break
# 取下??的鏈接
next_page_url = next_page.a['href']
# 拼裝成完整的URL
next_page_url = start_url + next_page_url
總結(jié)
以上是生活随笔為你收集整理的python自动化办公培训_python-自动化办公的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python123第三章作业答案_swi
- 下一篇: echarts柱状图间距调整_Excel