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

来源:互联网 发布:ajax处理返回的数据 编辑:程序博客网 时间:2024/06/06 03:33

第十二章--处理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对象)。

  • ★利用paragraph对象和run对象的style属性可以设置他们的样式,通过run对象的text属性可以进一步设置样式,例如粗体,斜体,下划线等等。(P255-P258)
  • ★创建新的docx文件。调用add_paragraph()方法,添加新的段落。调用paragraph对象的add_run()方法可以在段落后面添加新的内容。add_paragraph()和add_run()方法都接受第二个参数,表示paragraph或者run对象的样式。
  • import docxdoc=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')

  • ★添加标题add_heading('header',0),其中参数0-4表示不同的标题样式,其实就是字体的大小不一样。
  • 添加图像add_picture()方法,可选的width和height关键字参数,将设置图像在文档中的宽度和高度。如果省略,则采用默认值。
  • import docxfrom docx import text,shareddoc=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文件的不同之处

  • ★csv文件的特性:
  • (1)值没有类型,所有的东西都是字符串
  • (2)没有字体大小和颜色的设置
  • (3)没有多个工作表
  • (4)不能指定单元格的宽度和高度
  • (5)不能合并的单元格
  • (6)不能嵌入图像或图表
  • (7)可以使用文本编辑器打开,以逗号作为单元格的分隔符
  • ★Reader对象(P266)
  • 用csv模块从csv文件中读取数据,需要创建一个Reader对象,Reader对象可以让你迭代遍历csv文件中的每一行。在Reader对象上应用list()函数,将返回一个列表的列表,每一行是一个列表,而所有的行又组成一个列表,可以通过下标的方式访问值。

  • ★循环读取Reader对象的数据
  • 调用Reader对象的line_num变量可以显示当前行的编号,注意,Reader对象只能循环遍历一次,要再次读取csv文件,需要调用csv.reader创建新的对象
  • import csvfile=open('example.csv')reader=csv.reader(file)for row in reader:    print('#'+str(reader.line_num)+' '+str(row))


  • ★Writer对象(P268)
  • Writer对象让你将数据写入csv文件。使用csv.writer()函数创建Writer对象。
  • 注意,在windows上,需要为open()函数的newline关键字传入一个空字符串,否则csv中的行距将有两倍。writerow()方法接受一个列表参数,返回字符个数(包括换行字符)
  • import csvfile=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 csvfile=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()


  • ★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()函数将返回格式良好的,人类可读的字符串表示。

  • ★利用+和-运算符,timedelta对象可以和datetime对象或其他timedelta对象相加或者相减。利用*或者/运算符,timedelta对象可以乘以整数或浮点数。

  • ★利用time.sleep()方法暂停你的程序,直至特定日期。(P286)
  • ★将datetime对象转换为人类可读的字符串
  • 调用datetime对象的strftime()方法可以将datetime对象显示为字符串。


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

  • ★如果要向线程中的函数传递参数,要使用threading.Thread()函数的args和kwargs关键字参数。
  • import threading,timedef 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程序中启动一个外部程序,就将改程序名传递给subprocess.Popen(),返回值是一个Popen对象,它有两个方法,poll和wait。
  • (1)poll()可以认为是问你的朋友,它是否执行完你给他的代码。
  • (2)wait()就像等你的朋友执行完他的代码,然后你在执行你的代码。wait()方法将阻塞,直至该进程终止。如果你希望你的程序暂停等到其他进程完成,该方法有用。
  • import time,subprocessproc = subprocess.Popen('C:\\windows\\System32\\calc.exe')
    将启动计算器


  • ★向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,subprocessseconds=5while seconds>0:    print(seconds)    time.sleep(1)    seconds-=1subprocess.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,emailfrom email.mime.text import MIMETextfrom email.utils import parseaddr,formataddrfrom 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<my_email_address@example.com>')  #需要替换成自己的邮箱msg['To']=_format_addr('recipient_name<recipient@example.com>')    #需要替换成接受者的邮箱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('my_email_address@example.com','password')  #这里的password是授权码#发送电子邮件smtp.sendmail('my_email_address@example.com',['recipient@example.com'],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出现以下问题:


  • ★POP3收取邮件
  • 参考廖雪峰网站:点击打开链接
  • import poplibfrom email.parser import Parserfrom email.header import decode_headerfrom email.utils import parseaddrdef decode_str(s):    value,charset=decode_header(s)[0]    if charset:        value=value.decode(charset)    return valuedef 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  charsetemail='your_email@example.com'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(详细的图像格式)

  • ★Image.new()函数可以创建一个空白的图像,它返回一个Image对象。该函数的参数有:
  • 字符串‘RGBA’
  • 大小,两整数的元组,作为新图像的宽度和高度
  • 背景颜色,是一个表示‘RGBA’值的四整数元组,或者是颜色名称

  • ★裁剪图像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 Imageimage=Image.open('crop.jpg')width,height=image.sizenew=image.resize((int(width/2),int(height/2)))new.save('new.jpg')

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


  • ★transpose()方法可以得到图像的“镜像翻转”。Image.FILP_LEFT_RIGHT水平翻转,Image.FLIP_TOP_BOTTOM垂直翻转。

  • ★更改单个像素
  • 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 Imageimport osSIZE=300LOGO_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...')

  • ★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,Imageim=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')

  • ★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 osarialFont=ImageFont.truetype(os.path.join(font,'arial.ttf'),32)draw.text((100,150),'World',fill='gray',font=arialFont)im.save('text.png')


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


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

  • ★写着写着又没了,这个编辑器真的好恶心。算了,不写了,直接看原文吧
  • 贴一些代码算了
  • import pyautogui,timetime.sleep(5)   #利用延迟打开画图软件,把鼠标置于画笔按钮pyautogui.click()pyautogui.moveTo(300,300,duration=2)distance=200while 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()正数向上滚,负数向下滚。(为啥我看不出效果???)
  • ★函数集合


  • ★自动填表程序
  • 表单来源:点击打开链接
  • 注意以下几点:
  • (1)按Tab键可以将见到移到下一个输入栏,Tab键为'\t'
  • (2)按钮使用press('enter')而不是click
  • (3)注意页面跳转需要等到页面加载完成,或者while看某一个点的像素是否改变(P370)
  • (4)注意输入栏鼠标位置的获取,可以使用sleep,然后在打开网页把鼠标放在输入栏位置调用position获取
  • import pyautogui,timefield=(584,453)field2=(623,446)data={    'email':'my_address@example.com',    'password':'password123',    'confirm':'password123',    'twitter':'yesic',    'facebook':'charels',    'google':'google',    'first':'Lin',    'last':'charles',    'phone':'1234567891241',    'address':'Att Fpntye 21. cm'}pyautogui.PAUSE=0.5TIME=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...')


原创粉丝点击