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

xiaoxiao2021-02-28  30

第十二章--处理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 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') ★添加标题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文件的不同之处 ★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 csv file=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 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和lineterminatordelimiter是文本中的分隔符,分隔符是一行中单元格之间出现的字符。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() ★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,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程序中启动一个外部程序,就将改程序名传递给subprocess.Popen(),返回值是一个Popen对象,它有两个方法,poll和wait。(1)poll()可以认为是问你的朋友,它是否执行完你给他的代码。(2)wait()就像等你的朋友执行完他的代码,然后你在执行你的代码。wait()方法将阻塞,直至该进程终止。如果你希望你的程序暂停等到其他进程完成,该方法有用。import time,subprocess proc = 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,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 SchedulerOS X 上的launchdLinux上的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<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 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='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 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') ★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 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...') ★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') ★ImageDraw.text()绘制文本(P346) ImageDraw.text()方法用于在图像上绘制文本,有四个参数,xy(列表),text,fill,fontImageFont.truetype()函数有两个参数,第一个参数是字符串,表示字体的TrueType文件,这个文件是硬盘上存在的文件,后缀名为.ttf,通常在以下文件夹中找到:(1)windows:c://windows//Fonts(2)OS X:/Library/Fonts and/System/Library/Fonts(3)Linux:/usr/share/fonts/truetypeim=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') ★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()正数向上滚,负数向下滚。(为啥我看不出效果???)★函数集合 ★自动填表程序表单来源:点击打开链接注意以下几点:(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':'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.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...')
转载请注明原文地址: https://www.6miu.com/read-40464.html

最新回复(0)