• 第7章:文档与报告


    1.使用Python处理Excel文档

    1).openpyxl简介与安装

    openpyxl是一个读写Excel 2010文档的Python库
    pip install openpyxl

    2).使用openpyxl读取Excel文档

    import openpyxl
    
    wb = openpyxl.load_workbook('/py/example.xlsx')
    print(wb)
    print(wb.active)
    print(wb.read_only)
    print(wb.encoding)
    print(wb.worksheets)
    print(wb.sheetnames)
    print(wb[u'student'])
    ws = wb[u'student']
    print(ws.title)
    print(ws.dimensions)
    print(ws.max_column)
    print(ws.min_column)
    print(ws.max_row)
    print(ws.min_row)
    print(ws.columns)
    print(ws.rows)
    print(ws.values)
    print(ws.cell(row=2,column=1))
    for row in ws.values:
        print(row)
    for row in ws.rows:
        print([cell.value for cell in row])

    3).使用openpyxl修改Excel文档

    import openpyxl
    
    def process_worksheet(sheet):
        avg_column = sheet.max_column + 1
        sum_column = sheet.max_column + 2
        for row in sheet.iter_rows(min_row=2, min_col=3):
            scores = [cell.value for cell in row]
            sum_score = sum(scores)
            avg_score = sum_score/len(scores)
            sheet.cell(row=row[0].row, column=avg_column).value = avg_score
            sheet.cell(row=row[0].row, column=sum_column).value = sum_score
        sheet.cell(row=1, column=avg_column).value = 'avg'
        sheet.cell(row=1, column=sum_column).value = 'sum'
    
    def main():
        wb = openpyxl.load_workbook('/py/example.xlsx')
        sheet = wb[u'student']
        process_worksheet(sheet)
        wb.save('/py/example_copy.xlsx')
    
    if __name__ == '__main__':
        main()

    4).案例:合并多个Excel文档到一个Excel文档

    import openpyxl
    import os
    import glob
    
    def merge_xlsx_files(xlsx_files):
        wb = openpyxl.load_workbook(xlsx_files[0])
        ws = wb.active
        ws.title = "merged result"
        for filename in xlsx_files[1:]:
            workbook = openpyxl.load_workbook(filename)
            sheet = workbook.active
            for row in sheet.iter_rows(min_row=2):
                values = [cell.value for cell in row]
                ws.append(values)
        return wb
    
    def get_all_xlsx_files(path):
        xlsx_files = glob.glob(os.path.join(path, '*.xlsx'))
        sorted(xlsx_files, key=str.lower)
        return xlsx_files
    
    def main():
        xlsx_files = get_all_xlsx_files(os.path.expanduser('~'))
        wb = merge_xlsx_files(xlsx_files)
        wb.save('/py/merged_form.xlsx')
    
    if __name__ == '__main__':
        main()

    2.使用Python操作PDF文档

    1).PyPDF2安装与介绍

        PyPDF2是一个纯Python的开源库,能够分割或合并PDF文件

        pip install PyPDF2

        PyPDF2提供了4个主要的类,分别是PdfFileWriter,PdfFileReader,PdfFileWriter,PdfFileMerger,PageObject

    2).使用PdfFileReader读取PDF文件

    import PyPDF2
    reader = PyPDF2.PdfFileReader(open('/py/ansible.pdf', 'rb'))
    reader.getNumPages()
    reader.getIsEncrypted()
    page = reader.getPage(4)
    page.extractText()
    
    PdfFileReader类的getDocumentInfo()方法获取PDF文件的元信息
    reader.getDocumentInfo()

    3).使用PdfFileWriter修改PDF文件

    import PyPDF2
    reader = PyPDF2.PdfFileReader(open('/py/ansible.pdf','rb'))
    output = PyPDF2.PdfFileWriter()
    output.addPage(reader.getPage(1))
    output.addPage(reader.getPage(4))
    output.addPage(reader.getPage(5))
    output.getNumPages()
    output.encrypt('123456')
    outputStream = open("pypdf2-output.pdf", "wb")
    output.write(outputStream)
    outputStream.close()
    import PyPDF2
    reader = PyPDF2.PdfFileReader(open('/py/ansible.pdf','rb'))
    writer = PyPDF2.PdfFileWriter()
    page = reader.getPage(0)
    page.rotateClockwise(180)
    writer.addPage(page)
    outputStream = open("pypdf2-output.pdf", "wb")
    writer.write(outputStream)
    outputStream.close()
    
    import PyPDF2
    reader = PyPDF2.PdfFileReader(open('/py/ansible.pdf','rb'))
    watermark = PyPDF2.PdfFileReader(open('/py/pypdf2-output.pdf','rb'))
    writer = PyPDF2.PdfFileWriter()
    for i in range(reader.getNumPages()):
        page = reader.getPage(i)
        page.mergePage(watermark.getPage(0))
        writer.addPage(page)
    outputStream = open('watermakr-test.pdf','wb')
    writer.write(outputStream)
    outputStream.close()

    3.使用Python归档图片

    1).Exif信息介绍

        Exchangeable image file format是可交换图像文件格式,可以记录图片的属性信息和拍摄数据

        在Linux下,可以通过一个名为exiftool的命令行工具查看照片的元信息

    2).在Python使用PIL查看图片元信息

        PIL是Python生态中最有名的图片处理相关库

        pip install Pillow

    4.发送报告

    1).SMTP协议

        Simple Mail Transfer Protocol简单邮件传输协议

    2).使用标准库的smtplib与mime发送邮件

    发送纯文本邮件,在send_mail函数中构建一个MIMEText对象
    import smtplib
    from email.mime.text import MIMEText
    
    SMTP_SERVER = "smtp.163.com"
    SMTP_PORT = 25
    
    def send_mail(user, pwd, to, subject, text):
        msg = MIMEText(text)
        msg['From'] = user
        msg['To'] = to
        msg['Subject'] = subject
    
        smtp_server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
        print('Connecting To Mail Server.')
        try:
            smtp_server.ehlo()
            print('Starting Encrypted Seccion.')
            smtp_server.starttls()
            smtp_server.ehlo()
            print('Logging Ino Mail Server')
            smtp_server.login(user, pwd)
            print('Sending Mail.')
            smtp_server.sendmail(user, to, msg.as_string())
        except Exception as err:
            print('Sending Mail Failed: {0}'.format(err))
        finally:
            smtp_server.quit()
    
    def main():
        send_mail('hugaochao320@163.com', 'hgc3177678', 'hugc@knowbox.cn', 'This is Subject', 'This is content')
    
    if __name__ == '__main__':
        main()

    3).使用开源的yagmail发送邮件

    pip install yagmail
    import yagmail
    yag = yagmail.SMTP(user='hugaochao320@163.com',password='hgc3177678',host='smtp.163.com',port=465)      #注意端口:服务器端口号(常规) 服务器端口号(加密)
    contents = ['This is the body, and here is just text. You can find an image file and a pdf file attached.','/py/ansible.py','/py/data.txt']
    yag.send('hugc@knowbox.cn',subject='This mail come from yagmail',contents=contents)
    yag.close()
    
    import yagmail
    with yagmail.SMTP(user='hugaochao320@163.com',password='hgc3177678',host='smtp.163.com',port=465) as yag:
         yag.send('hugc@knowbox.cn',subject='This mail come from yagmail',contents=contents)

    5.接收邮件

        接收邮件协议IMAP与POP3

        使用开源从imapclient接收邮件

        使用pyzmail解析邮件

        使用imapclient删除邮件

    6.综合案例:使用Python打造一个geek的邮件客户端

        emcli的功能设计

        emcli的功能实现

        使用setuptools打包源码

        使用twine上传到PyPi

  • 相关阅读:
    uni-app 轮播图
    uni-app 头部及底部导航
    Eapp 创建项目及简单应用
    nodeJS学习笔记 express获得GET和POST请求参数
    Promise 之基础详细介绍
    动态代理个人理解
    springboot实现日志记录
    调节 alert confirm prompt 的位置
    打印日志文件
    Java正则速成秘籍(三)之见招拆招篇
  • 原文地址:https://www.cnblogs.com/allenhu320/p/11353504.html
Copyright © 2020-2023  润新知