python编程快速上手--重点整理(下)

第十二章--处理excel电子表格(P218)

  • 主要是学习openpyxl模块,因为书本上是2.1版本的,但是现在已经更新到了2.5版本了,期间还是有很多不一样的地方,可以学习openpyxl的文档。
  • 2.4版本文档:点击打开链接
  • 2.5版本文档:点击打开链接
  • 书本上2.1的版本,2.4/2.5有几个不同的地方:
  • (1)没有get_highest_row()和get_highest_column()方法,用啥代替没找到
  • (2)column_index_string()和get_column_letter()函数在openpyxl.utils.cell模块下
  • (3)没有Style对象,worksheet对象有font属性,直接将Font对象赋值即可
  • (4)图表也有些不同


第十三章--处理pdf和word文档

  • ★PyPDF2没有办法从PDF中提取图像,图标或其他媒体。但它可以提取文本,并将文本返回给python字符串。
  • ★处理PDF文档(P244)
  • 注意:pdf名字好像不能是中文名,而且会出现以下的错误,不知什么原因:

  • ★word文档(P253)
  • 利用python-docx模块,python可以创建和修改word文档,但是好像它只能处理.docx文件。注意,在导入python-docx模块的时候是import docx而不是import python-docx。
  • ★python-docx用三种不同的类型来表示docx文件,Document对象表示整个文档,Document对象包含一个Paragraph对象的列表,表示文档中的段落,每个Paragrapgh对象对象都包含一个Run对象的列表。一个Run对象就是相同样式文本的延续,当文本的样式发生改变时,就需要一个新的Run对象(简单来说,就是不同样式的字符的分割,例如字体变粗变斜体都会产生新的run对象)。
  • python编程快速上手--重点整理(下)_第1张图片
  • ★利用paragraph对象和run对象的style属性可以设置他们的样式,通过run对象的text属性可以进一步设置样式,例如粗体,斜体,下划线等等。(P255-P258)
  • ★创建新的docx文件。调用add_paragraph()方法,添加新的段落。调用paragraph对象的add_run()方法可以在段落后面添加新的内容。add_paragraph()和add_run()方法都接受第二个参数,表示paragraph或者run对象的样式。
  • import docx
    
    doc=docx.Document()
    doc.add_paragraph('hello world','Title')
    parag2=doc.add_paragraph('this is a test.docx')
    parag2.add_run('这是parag2新添加的内容')
    doc.save('test.docx')
    
    python编程快速上手--重点整理(下)_第2张图片
  • ★添加标题add_heading('header',0),其中参数0-4表示不同的标题样式,其实就是字体的大小不一样。
  • 添加图像add_picture()方法,可选的width和height关键字参数,将设置图像在文档中的宽度和高度。如果省略,则采用默认值。
  • import docx
    from docx import text,shared
    doc=docx.Document('test.docx')
    doc.add_heading('header',0)
    doc.add_picture('pic.png')
    #doc.add_picture('pic.png',width=shared.Inches(1),height=shared.Cm(4))
    doc.save('test.docx')
    

第十四章--处理CSV文件和JSON数据

  • ★xlsx和csv文件的不同之处
  • python编程快速上手--重点整理(下)_第3张图片
  • ★csv文件的特性:
  • (1)值没有类型,所有的东西都是字符串
  • (2)没有字体大小和颜色的设置
  • (3)没有多个工作表
  • (4)不能指定单元格的宽度和高度
  • (5)不能合并的单元格
  • (6)不能嵌入图像或图表
  • (7)可以使用文本编辑器打开,以逗号作为单元格的分隔符
  • ★Reader对象(P266)
  • 用csv模块从csv文件中读取数据,需要创建一个Reader对象,Reader对象可以让你迭代遍历csv文件中的每一行。在Reader对象上应用list()函数,将返回一个列表的列表,每一行是一个列表,而所有的行又组成一个列表,可以通过下标的方式访问值。
  • python编程快速上手--重点整理(下)_第4张图片
  • ★循环读取Reader对象的数据
  • 调用Reader对象的line_num变量可以显示当前行的编号,注意,Reader对象只能循环遍历一次,要再次读取csv文件,需要调用csv.reader创建新的对象
  • import csv
    
    file=open('example.csv')
    reader=csv.reader(file)
    
    for row in reader:
        print('#'+str(reader.line_num)+' '+str(row))
    
    python编程快速上手--重点整理(下)_第5张图片

  • ★Writer对象(P268)
  • Writer对象让你将数据写入csv文件。使用csv.writer()函数创建Writer对象。
  • 注意,在windows上,需要为open()函数的newline关键字传入一个空字符串,否则csv中的行距将有两倍。writerow()方法接受一个列表参数,返回字符个数(包括换行字符)
  • import csv
    
    file=open('output.csv','w',newline='')
    writer=csv.writer(file)
    
    writer.writerow(['a','sdgfasd','dcat','sf'])
    writer.writerow([1,2,34,2.55,23])
    file.close()
    ★csv.writer()函数中的参数delimiter和lineterminator
  • delimiter是文本中的分隔符,分隔符是一行中单元格之间出现的字符。csv默认的分隔符是逗号。
  • lineterminator是行终止字符,行终止字符是出现在行末的字符。csv默认的行终止字符是换行符。
  • import csv
    
    file=open('output.csv','w',newline='')
    writer=csv.writer(file,delimiter='\t',lineterminator='\n\n')
    
    writer.writerow(['a','sdgfasd','dcat','sf'])
    writer.writerow([1,2,34,2.55,23])
    file.close()
    python编程快速上手--重点整理(下)_第6张图片

  • ★JSON不能存储每一种python值,它只能包含以下数据类型的值:字符串,整型,浮点型,布尔型,列表和字典和NoneType。JSON不能表示python特有的对象,例如File对象,CSV Reader对象等等。
  • 利用loads()函数将JSON数据的字符串转化为Python的值。注意,JSON字符总是用双引号。

  • ★利用dumps()函数将python值转化为JSON格式的字符串。python的值只能是以下类型:字典,列表,整型,浮点型,字符串,布尔型或None。


第十五章--保持时间,计划任务和启动程序

  • ★time.time()返回从1970年1月1日0点以来的秒数。
  • ★time.sleep()传入暂停程序的秒数。注意,在IDLE中按ctrl-C不会中断time.sleep()调用。IDLE会等待到暂停结束,在抛出KeyboardInterrupt异常。要绕过这个问题,不要一次time.sleep(30)暂停30s,而是for循环time.sleep(1)30次。
  • ★python内置的round()函数可以对浮点数四舍五入,可以传入保留的小数点位数。

  • time模块用于取得Unix纪元时间戳,但是如果需要显示日期之类的需要使用datetime模块。
  • ★调用datetime.datetime.now()返回一个datetime对象,表示当前的时间和日期。
  • ★向datetime.datetime()传入年,月,日,时,分,秒的整数创建特定时刻的datetime对象。
  • ★通过datetime.datetime.fromtimestamp()传入时间戳可以转换为datetime对象。
  • ★datetime对象可以使用比较操作符比较。

  • datetime模块还提供了timedelta数据类型表示一段时间。调用datetime.timedelta()函数创建timedelta对象,传入weeks,days,hours,seconds,milliseconds,microseconds关键字参数。
  • ★timedelta对象的total_seconds()方法返回以秒表示的时间,其中timedelta对象包含days,hours等属性。
  • ★将timedelta对象传入str()函数将返回格式良好的,人类可读的字符串表示。
  • python编程快速上手--重点整理(下)_第7张图片
  • ★利用+和-运算符,timedelta对象可以和datetime对象或其他timedelta对象相加或者相减。利用*或者/运算符,timedelta对象可以乘以整数或浮点数。
  • python编程快速上手--重点整理(下)_第8张图片
  • ★利用time.sleep()方法暂停你的程序,直至特定日期。(P286)
  • ★将datetime对象转换为人类可读的字符串
  • 调用datetime对象的strftime()方法可以将datetime对象显示为字符串。
  • python编程快速上手--重点整理(下)_第9张图片

  • ★将字符串转化为datetime对象
  • 调用datetime.datetime.strptime()方法可以将字符串转化为datetime对象,注意需要传入格式字符串。

  • ★如果要向线程中的函数传递参数,要使用threading.Thread()函数的args和kwargs关键字参数。
  • import threading,time
    
    def mycat(a,b,c,sep=' '):
        time.sleep(5)
        print(a,b,c,sep=sep)
    
    print('start')
    thread=threading.Thread(target=mycat,args=['a','b','c'],kwargs={'sep':'*'})
    
    thread.start()
    
    print('done')
    python编程快速上手--重点整理(下)_第10张图片

  • ★如果想在Python程序中启动一个外部程序,就将改程序名传递给subprocess.Popen(),返回值是一个Popen对象,它有两个方法,poll和wait。
  • (1)poll()可以认为是问你的朋友,它是否执行完你给他的代码。
  • (2)wait()就像等你的朋友执行完他的代码,然后你在执行你的代码。wait()方法将阻塞,直至该进程终止。如果你希望你的程序暂停等到其他进程完成,该方法有用。
  • import time,subprocess
    proc = subprocess.Popen('C:\\windows\\System32\\calc.exe')
    将启动计算器
  • python编程快速上手--重点整理(下)_第11张图片

  • ★向Popen()传递命令行参数
  • 向Popen()传递一个列表,作为唯一的参数。该列表的第一个字符串是要启动的程序的可执行文件名,所有的后续字符串是该程序启动时传递给该程序的命令行参数。
  • proc = subprocess.Popen(['C:\\windows\\notepad.exe','logger.txt'])
  • ★用默认的应用程序打开文件
  • windows是start程序,windows需要传入shell=True关键字参数
  • OS X是open程序
  • Linux是see程序
  • #! python3
    '''
    这是一个倒计时程序
    倒计时结束将播放mp3
    '''
    import time,subprocess
    
    seconds=5
    while seconds>0:
        print(seconds)
        time.sleep(1)
        seconds-=1
    
    subprocess.Popen(['start','music.mp3'],shell=True)


  • ★如果想安排程序在特定时间启动,http://nostarch.com/automatestuff/上的指南可以告诉你如何使用操作系统已经提供的调度程序。
  • 或者了解windows上的Task Scheduler
  • OS X 上的launchd
  • Linux上的cron

第十六章--发送电子邮件和短信

  • ★利用SMTP发送电子邮件(P304)
  • 注意qq,163等邮箱可能不支持TLS端口587。所以在连接SMTP服务器的时候需要使用smtplib.SMTP_SSL()和465端口,来创建SMTP对象
  • 如果是直接用smtplib.SMTP()连接SMTP服务器,则需要调用SMTP对象的starttls()进行加密。
  • 更多的信息参考廖雪峰的网站点击打开链接
  • 下面是一段发送成功的程序
  • import smtplib,email
    from email.mime.text import MIMEText
    from email.utils import parseaddr,formataddr
    from email.header import Header
    
    #格式化一个邮件地址,注意编码方式
    def _format_addr(s):
        name,addr=parseaddr(s)
        return formataddr((Header(name,'utf-8').encode(),addr))
    
    #构造纯文本邮件
    msg=MIMEText('hello,\n,this is my first email sended by python.','plain','utf-8')
    msg['From']=_format_addr('send_name')  #需要替换成自己的邮箱
    msg['To']=_format_addr('recipient_name')    #需要替换成接受者的邮箱
    msg['Subject']=Header('Hello','utf-8').encode()
    
    
    #qq可能不支持TLS端口的587,所以需要利用SSL的465端口
    smtp=smtplib.SMTP_SSL('smtp.qq.com',465)
    #set_debuglevel(1)打印和SMTP服务器交互的所有信息
    smtp.set_debuglevel(1)
    #发送SMTP的"hello"消息
    smtp.ehlo()
    #登录到SMTP服务器,需要开启qq的pop3/SMTP服务,并且获取授权码
    smtp.login('[email protected]','password')  #这里的password是授权码
    #发送电子邮件
    smtp.sendmail('[email protected]',['[email protected]'],msg.as_string())
    print('send succeed')
    #断开服务器
    smtp.quit()
    

  • IMAP和POP有什么区别?
    POP允许电子邮件客户端下载服务器上的邮件,但是您在电子邮件客户端的操作(如:移动邮件、标记已读等),这是不会反馈到服务器上的,比如:您通过电子邮件客户端收取了QQ邮箱中的3封邮件并移动到了其他文件夹,这些移动动作是不会反馈到服务器上的,也就是说,QQ邮箱服务器上的这些邮件是没有同时被移动的 。但是IMAP就不同了,电子邮件客户端的操作都会反馈到服务器上,您对邮件进行的操作(如:移动邮件、标记已读等),服务器上的邮件也会做相应的动作。也就是说,IMAP是“双向”的。 同时,IMAP可以只下载邮件的主题,只有当您真正需要的时候,才会下载邮件的所有内容。
  • ★利用IMAP获取和删除电子邮件(P307)
  • 因为安装pyzmail失败,可能是pyzmail源代码不支持python3.6版本,需要降级到3.2吧。太麻烦了,所以这部分内容只是了解而已。
  • 安装pyzmail出现以下问题:
  • python编程快速上手--重点整理(下)_第12张图片

  • ★POP3收取邮件
  • 参考廖雪峰网站:点击打开链接
  • import poplib
    from email.parser import Parser
    from email.header import decode_header
    from email.utils import parseaddr
    
    def decode_str(s):
        value,charset=decode_header(s)[0]
        if charset:
            value=value.decode(charset)
        return value
    
    def print_info(msg,indent=0):
        '''
        :param msg:
        :param indent: 用于缩进表示
        :return:
        '''
        if indent==0:
            for header in ['From','To','Subject']:
                value=msg.get(header,'')
                if value:
                    if header=='Subject':
                        value=decode_str(value)
                    else:
                        hdr,addr=parseaddr(value)
                        name=decode_str(hdr)
                        value=u'%s <%s>'%(name,addr)
                print('%s%s:%s'%(' '*indent,header,value))
        if msg.is_multipart():
            parts=msg.get_payload()
            for n,part in enumerate(parts):
                print('%spart %s'%(' '*indent,n))
                print("%s-------------"%(' '*indent))
                print_info(part,indent+1)
        else:
            content_type=msg.get_content_type()
            if content_type=='text/plain' or content_type=='text/html':
                content=msg.get_payload(decode=True)
                charset=guess_charset(msg)
                if charset:
                    content=content.decode(charset)
                print('%sText:%s'%(' '*indent,content+'...'))
            else:
                print('%sAttachment:%s'%(' '*indent,content_type))
    
    def guess_charset(msg):
        charset=msg.get_charset()
        if charset is None:
            content_type=msg.get('Content-Type','').lower()
            pos=content_type.find('charset=')
            if pos>0:
                charset=content_type[pos+8:].strip()
            return  charset
    
    email='[email protected]'
    password='password'  #qq邮箱授权码
    popserver='pop.qq.com'
    
    #连接pop3服务器:
    server=poplib.POP3_SSL(popserver,port=995)    #qq邮箱
    #打开调试信息
    server.set_debuglevel(1)
    #打印pop3服务器的欢迎信息
    print(server.getwelcome().decode('utf-8'))
    
    #身份验证
    server.user(email)
    server.pass_(password)
    
    #stat()返回邮箱数量和占用空间
    print(server.stat())
    #list()返回所有邮件的编号
    resp,mails,octets=server.list()
    print(mails)
    
    #获取最新一封邮件,注意索引号从1开始
    index=len(mails)
    res,lines,octet=server.retr(index)
    
    #lines存储了邮件的原始文本的每一行
    msg_content=b'\r\n'.join(lines).decode('utf-8')
    #解析邮件
    msg=Parser().parsestr(msg_content)
    print_info(msg)
    
    server.quit()

  • ★python发送短信
  • 书本上使用Twilio来发送短信,但是这个网站注册不了,需要VPN吧。百度了一下有个飞信的PyWAPFetion,但是没有维护了,试了一下,使用不了,因为HTTP的url找不到了。
  • 有空再研究Python怎么发送短信吧。


第十七章--操作图像


  • ★调用Pillow(PIL)的ImageColor.getcolor()可以返回颜色的RGBA值,传入第一个参数颜色的字符串,第二个参数‘RBGA’。

  • ★RGBA中的A代表alpha(透明度),如果颜色的alpha值为0,不论RGB值是什么,该颜色都是不可见的。
  • ★Image对象有一些属性,例如size(返回宽度和高度的像素值),filename,format(图像格式),format_description(详细的图像格式)
  • python编程快速上手--重点整理(下)_第13张图片
  • ★Image.new()函数可以创建一个空白的图像,它返回一个Image对象。该函数的参数有:
  • 字符串‘RGBA’
  • 大小,两整数的元组,作为新图像的宽度和高度
  • 背景颜色,是一个表示‘RGBA’值的四整数元组,或者是颜色名称
  • python编程快速上手--重点整理(下)_第14张图片
  • ★裁剪图像crop()
  • Image对象的crop()方法接受一个矩形元组,返回一个Image对象,表示裁剪后的图像。请记住,矩形元组包括左列和顶行的像素,直至不包括右列和底行的元素。
  • newimage=image.crop((100,200,400,500))
  • ★复制Icopy()和粘贴paste()图像
  • Image对象的copy()方法返回一个新的Image对象,Image对象的paste()方法将另一个图像粘贴在它上面。
  • image=Image.open('crop.jpg')
    src=image.copy()
    src.paste(image,(0,0))
    src.paste(image,(100,50))
    src.save('new.jpg')
  • ★resize()方法调整图像的大小,传入的元组只允许整数
  • from PIL import Image
    
    image=Image.open('crop.jpg')
    width,height=image.size
    new=image.resize((int(width/2),int(height/2)))
    new.save('new.jpg')

  • ★旋转图像rotate(),传入旋转的角度(整数或浮点数),该方法返回一个新的Image对象。rotate()有一个可选参数expand,如果expand=True,则会放大图像的尺寸,以使用旋转后的图像。
  • from PIL import Image
    
    img=Image.open('test.jpg')
    img.rotate(10).save('rimg.jpg')
    img.rotate(10,expand=True).save('rimgexpand.jpg')

  • python编程快速上手--重点整理(下)_第15张图片
  • ★transpose()方法可以得到图像的“镜像翻转”。Image.FILP_LEFT_RIGHT水平翻转,Image.FLIP_TOP_BOTTOM垂直翻转。
  • python编程快速上手--重点整理(下)_第16张图片
  • ★更改单个像素
  • Image对象的getpixel((x,y))返回(x,y)坐标的颜色
  • Image对象的putpixel((x,y),(210,210,210))将(x,y)坐标颜色设置为(210,210,210),可以接受是整数RGBA元组或者三整数RGB元组。
  • img.putpixel((100,200),ImageColor.getcolor('red','RGBA'))
  • ★给图片添加徽标,注意paste的第三个参数(P339)
  • from PIL import Image
    import os
    
    SIZE=300
    LOGO_NAME='happy.png'
    logo=Image.open(LOGO_NAME)
    logowidth,logoheight=logo.size
    
    #遍历文件
    for filename in os.listdir('.'):
        if filename.endswith('.png') or filename.endswith('.jpg'):
            if filename==LOGO_NAME:
                continue
            im=Image.open(filename)
            width,height=im.size
            #调整图像的大小,等比例缩放
            if width>SIZE and height>SIZE:
                if width>height:
                    height=int((SIZE/width)*height)
                    width=SIZE
                else:
                    width=int((SIZE/height)*width)
                    height=SIZE
            print('resize %s...'%filename)
            im=im.resize((width,height))
            #注意,如果不添加第三个参数logo,paste不会粘贴透明的像素
            im.paste(logo,(width-logowidth,height-logoheight),logo)
            im.save(os.path.join('logo'+filename))
    
    print('done...')
    
  • python编程快速上手--重点整理(下)_第17张图片
  • ★ImageDraw在图像上绘制形状(P344)
  • 点:point(xy,fill)
  • 线:line(xy,fill,width)
  • 矩形:rectangle(xy,fill,outline)
  • 椭圆:ellipse(xy,fill,outline)
  • 多边形:polygon(xy,fill,outline)
  • from PIL import ImageDraw,Image
    
    im=Image.new('RGBA',(200,200),'white')
    draw=ImageDraw.Draw(im)
    draw.line([(0,0),(199,0),(199,199),(0,199),(0,0)],fill='red')   #线
    draw.rectangle((20,30,60,60),fill='blue')      #矩形
    draw.ellipse((120,30,160,60),fill='black')     #椭圆
    draw.polygon(((57,87),(79,62),(94,85),(120,90)),fill='brown')    #多边形
    
    for i in range(100,200,10):
        draw.line([(i,0),(200,i-100)],fill='green')
    
    im.save('draw.jpg')
  • python编程快速上手--重点整理(下)_第18张图片
  • ★ImageDraw.text()绘制文本(P346)
  • ImageDraw.text()方法用于在图像上绘制文本,有四个参数,xy(列表),text,fill,font
  • ImageFont.truetype()函数有两个参数,第一个参数是字符串,表示字体的TrueType文件,这个文件是硬盘上存在的文件,后缀名为.ttf,通常在以下文件夹中找到:
  • (1)windows:c://windows//Fonts
  • (2)OS X:/Library/Fonts and/System/Library/Fonts
  • (3)Linux:/usr/share/fonts/truetype
  • im=Image.new('RGBA',(200,200),'white')
    draw=ImageDraw.Draw(im)
    draw.text((20,150),'hello',fill='purple')
    font='C://windows//Fonts'
    import os
    arialFont=ImageFont.truetype(os.path.join(font,'arial.ttf'),32)
    draw.text((100,150),'World',fill='gray',font=arialFont)
    im.save('text.png')
    python编程快速上手--重点整理(下)_第19张图片

  • ★Pillow创建的PNG图像默认每英寸72像素,一点是1/72英寸。


第十八章--用GUI自动化控制键盘和鼠标(P352)

  • ★写着写着又没了,这个编辑器真的好恶心。算了,不写了,直接看原文吧
  • 贴一些代码算了
  • import pyautogui,time
    
    time.sleep(5)   #利用延迟打开画图软件,把鼠标置于画笔按钮
    pyautogui.click()
    pyautogui.moveTo(300,300,duration=2)
    distance=200
    while distance>0:
        pyautogui.dragRel(distance,0,duration=0.5)
        distance-=10
        pyautogui.dragRel(0,distance,duration=0.5)
        pyautogui.dragRel(-distance,0,duration=0.5)
        distance-=10
        pyautogui.dragRel(0,-distance,duration=0.5)

  • ★pyautogui.scroll()正数向上滚,负数向下滚。(为啥我看不出效果???)
  • ★函数集合
  • python编程快速上手--重点整理(下)_第20张图片

  • ★自动填表程序
  • 表单来源:点击打开链接
  • 注意以下几点:
  • (1)按Tab键可以将见到移到下一个输入栏,Tab键为'\t'
  • (2)按钮使用press('enter')而不是click
  • (3)注意页面跳转需要等到页面加载完成,或者while看某一个点的像素是否改变(P370)
  • (4)注意输入栏鼠标位置的获取,可以使用sleep,然后在打开网页把鼠标放在输入栏位置调用position获取
  • import pyautogui,time
    
    field=(584,453)
    field2=(623,446)
    data={
        'email':'[email protected]',
        'password':'password123',
        'confirm':'password123',
        'twitter':'yesic',
        'facebook':'charels',
        'google':'google',
        'first':'Lin',
        'last':'charles',
        'phone':'1234567891241',
        'address':'Att Fpntye 21. cm'
    }
    pyautogui.PAUSE=0.5
    TIME=0.25    #每个字符之间的暂停时间
    print('start...')
    time.sleep(5)
    pyautogui.click(field[0],field[1])
    pyautogui.typewrite(data['email']+'\t',TIME)
    pyautogui.typewrite(data['password']+'\t',TIME)
    pyautogui.typewrite(data['confirm']+'\t',TIME)
    pyautogui.press('enter')
    #第二页
    time.sleep(3)  #缓冲,加载页面
    pyautogui.click(field[0],field[1])
    pyautogui.typewrite(data['twitter']+'\t',TIME)
    pyautogui.typewrite(data['facebook']+'\t',TIME)
    pyautogui.typewrite(data['google']+'\t'+'\t',TIME)
    pyautogui.press('enter')
    #第三页
    time.sleep(3)
    pyautogui.click(field2[0],field2[1])
    pyautogui.typewrite(data['first']+'\t',TIME)
    pyautogui.typewrite(data['last']+'\t',TIME)
    pyautogui.typewrite(data['phone']+'\t',TIME)
    pyautogui.typewrite(data['address']+'\t'+'\t',TIME)
    pyautogui.press('enter')
    
    print('done...')
    

    python编程快速上手--重点整理(下)_第21张图片

你可能感兴趣的:(python)