1.Python文件自动化管理
shutil文件操作模块;glob文件与文件夹获取模块
1.1.文件操作利器-shutil
1.1.1.文件的复制
1 # coding:utf-8 2 import os 3 from shutil import copy 4 5 #相对路径 6 copy('test.txt','test') 7 8 #绝对路径 9 path=os.path.join(os.getcwd(),'test1.txt') 10 target = os.path.join(os.getcwd(), 'test') 11 copy(path,target) 12 13 #通过copy实现文件内容覆盖 14 copy('test.txt','test2.txt')1.1.2.文件内容的覆盖
1 # coding:utf-8 2 import os 3 from shutil import copy,copyfile 4 5 #相对路径 6 copyfile('test.txt','test1.txt')1.1.3.文件裁剪(移动,重命名)
1 # coding:utf-8 2 3 from shutil import move 4 5 move('test2.txt','test/test22.txt')1.1.4.文件的删除
1 # coding:utf-8 2 3 import os 4 5 os.remove('test1.txt')1.1.5.文件/文件夹的压缩
1 # coding:utf-8 2 import os 3 from shutil import make_archive 4 5 make_archive('test','zip',os.getcwd())1.1.6.文件/文件夹的解压缩
1 # coding:utf-8 2 import os 3 from shutil import make_archive,unpack_archive 4 5 unpack_archive('test.zip',os.path.join(os.getcwd(),'test2'))
1.2.文件夹操作利器-shutil
1.2.1.文件夹的复制
1 # coding:utf-8 2 3 from shutil import copytree 4 5 copytree('test','test2') #copytree目标目录不能存在,不然报错1.2.2.文件夹的删除
1 # coding:utf-8 2 3 from shutil import rmtree 4 5 rmtree('test2')#删除的文件夹必须要存在,不然会报错,文件夹中不管有没有文件都可以直接删除1.2.3.文件夹的裁剪(移动,重命名)
1 # coding:utf-8 2 3 from shutil import move 4 5 move('test1','test')#当目标路径不存在,并且和来源目录属于相同路径下,相当于重命名操作
1.3.文件内容的查找:glob
1.3.1.glob的介绍
1.3.2.glob的基本使用
1 # coding:utf-8 2 import os 3 from glob import glob 4 5 print(glob(os.getcwd())) #['D:\\WorkSpace\\Python_Study\\filetest'] 只返回了当前路径,因为没有给范围 6 7 result=glob(os.getcwd()+'/*') #通过正则表达式来匹配 8 #也可以模糊匹配 result=glob(os.getcwd()+'/*.txt') 9 print(result) 10 ''' 11 [ 12 'D:\\WorkSpace\\Python_Study\\filetest\\file_test.py', 13 'D:\\WorkSpace\\Python_Study\\filetest\\filrtree_test.py', 14 'D:\\WorkSpace\\Python_Study\\filetest\\test', 15 'D:\\WorkSpace\\Python_Study\\filetest\\test.txt', 16 'D:\\WorkSpace\\Python_Study\\filetest\\test1', 17 'D:\\WorkSpace\\Python_Study\\filetest\\__init_ 18 '''1.3.3.练习1:查找指定的文件
1 # coding:utf-8 2 3 import glob 4 5 # 获取当前路径下所有内容 6 # 判断每个内容的类型(文件夹还是文件) 7 # 递归 8 9 path= glob.os.path.join(glob.os.getcwd(),'*') 10 11 def search(path,target): 12 result = glob.glob(path) 13 final_result=[] 14 15 for data in result: 16 if glob.os.path.isdir(data): 17 _path=glob.os.path.join(data,"*") 18 search(_path,target) 19 else: 20 if target in data: 21 final_result.append(data) 22 return final_result 23 24 if __name__=='__main__': 25 result=search(path,target='.py') 26 print(result) 27 28 ''' 29 ['D:\\WorkSpace\\Python_Study\\filetest\\file_test.py', 30 'D:\\WorkSpace\\Python_Study\\filetest\\filrtree_test.py', 31 'D:\\WorkSpace\\Python_Study\\filetest\\__init__.py'] 32 '''1.3.4.练习2:查找含有指定内容的文件
1 # coding:utf-8 2 3 import glob 4 5 path= glob.os.path.join(glob.os.getcwd(),'*') 6 final_result=[] 7 8 def search(path,target): 9 result = glob.glob(path) 10 11 for data in result: 12 if glob.os.path.isdir(data): 13 _path=glob.os.path.join(data,"*") 14 search(_path,target) 15 else: 16 try: 17 with open(data,'r',encoding='utf-8') as f: 18 content=f.read() 19 if target in content: 20 final_result.append(data) 21 except: 22 print('data read failed:%s'% data) 23 24 return final_result 25 26 if __name__=='__main__': 27 result=search(path,target='你好') 28 print(result) 29 30 ''' 31 ['D:\\WorkSpace\\Python_Study\\filetest\\filrtree_test.py', 32 'D:\\WorkSpace\\Python_Study\\filetest\\test\\test22.txt', 33 'D:\\WorkSpace\\Python_Study\\filetest\\test.txt'] 34 '''1.3.5.练习3:清理重复文件
1 # coding:utf-8 2 3 import glob 4 import hashlib 5 6 data={} 7 def clear(path): 8 result=glob.glob(path) 9 10 for _data in result: 11 if glob.os.path.isdir(_data): 12 _path=glob.os.path.join(_data,'*') 13 clear(_path) 14 else: 15 name=glob.os.path.split(_data)[-1] 16 if 'zip' in name: 17 open_type='rb' 18 is_byte=True 19 else: 20 open_type='r' 21 is_byte = False 22 with open(_data,open_type) as f: 23 content = f.read() 24 if is_byte: 25 hash_content_obj = hashlib.md5(content) 26 else: 27 hash_content_obj = hashlib.md5(content.encode('utf-8')) 28 hash_content = hash_content_obj.hexdigest() 29 if name in data: 30 sub_data=data[name] 31 is_delete=False 32 for k,v in sub_data: 33 if v == hash_content: 34 glob.os.remove(_data) 35 print('%s will delete' % _data) 36 is_delete=True 37 if not is_delete: 38 data[name][_data]=hash_content 39 else: 40 data[name]= { 41 _data:hash_content 42 } 43 44 if __name__=='__main__': 45 path = glob.os.path.join(glob.os.getcwd(),'*') 46 clear(path) 47 print(data)1.3.6.练习4:批量修改目录中的文件名称
1 # coding:utf-8 2 3 import glob 4 import shutil 5 6 7 def update_name(path): 8 result = glob.glob(path) 9 10 for index,data in enumerate(result): 11 if glob.os.path.isdir(data): 12 _path = glob.os.path.join(data,'*') 13 update_name(_path) 14 else: 15 path_list=glob.os.path.split(data) 16 name=path_list[-1] 17 new_name='%s_%s' % (index,name) 18 new_data=glob.os.path.join(path_list[0],new_name) 19 shutil.move(data,new_data) 20 21 if __name__=='__main__': 22 path = glob.os.path.join(glob.os.getcwd(),'*') 23 update_name(path)
2.Python Word自动化
2.1.Word操作利器之python-docx
2.1.1.python-docx的源头Document
2.1.2.段落的读取
1 # coding:utf-8 2 3 from docx import Document 4 5 doc=Document('文本.docx') #如果不是docx文件用不了,需要转格式即doc->docx 6 print(doc.paragraphs) #[<docx.text.paragraph.Paragraph object at 0x0000019CB5E75A48>, <docx.text.paragraph.Paragraph object at 0x0000019CB5E75F08>, <docx.text.paragraph.Paragraph object at 0x0000019CB5E75948>, <docx.text.paragraph.Paragraph object at 0x0000019CB5E75EC8>, <docx.text.paragraph.Paragraph object at 0x0000019CB5E75B48 7 8 for p in doc.paragraphs: 9 print(p.text) 10 ''' 11 paragraphs是读取不到图片以及表格等信息的,因为读取的是段落 12 文本 13 文本 14 文本 15 文本 16 文本 17 ''1 # coding:utf-8 2 3 from docx import Document 4 #获取word总行数,并输出每一行内容 5 doc =Document('文本.docx') 6 leng_doc=len(doc.paragraphs) 7 print('段落数:%s' % leng_doc) 8 for i in range(leng_doc): 9 print('第{}段的内容是:{}'.format(i+1,doc.paragraphs[i].text))2.1.3.表格的读取
1 # coding:utf-8 2 3 from docx import Document 4 5 doc=Document('文本.docx') #如果不是docx文件用不了,需要转格式即doc->docx 6 7 #按行去取数据 8 for t in doc.tables: #拿到表格 9 for row in t.rows: #拿到表格的行 10 _row_str='' #定义一个变量将一行的数据拼接在一起 11 for cell in row.cells: #遍历一行中的小表格即列 12 _row_str+=cell.text+'\t' #数据拼接 13 print(_row_str) 14 15 ''' 16 1-1 1-2 17 2-1 2-2 18 3-1 3-2 19 ''' 20 21 # 按列去取数据 22 for t in doc.tables: #拿到表格 23 for row in t.columns: #拿到表格的行 24 _row_str='' #定义一个变量将一行的数据拼接在一起 25 for cell in row.cells: #遍历一行中的小表格即行 26 _row_str+=cell.text+'\t' #数据拼接 27 print(_row_str) 28 ''' 29 1-1 2-1 3-1 30 1-2 2-2 3-2 31 '''2.1.4.练习:获取出有效简历-简历筛选
1 # coding:utf-8 2 3 import glob 4 5 from docx import Document 6 7 class ReadDoc(object): 8 def __init__(self, path): 9 self.doc = Document(path) 10 self.p_text = '' 11 self.table_text = '' 12 13 self.get_para() 14 self.get_table() 15 16 def get_para(self): 17 for p in self.doc.paragraphs: 18 self.p_text += p.text + '\n' 19 20 def get_table(self): 21 for table in self.doc.tables: 22 for row in table.rows: 23 _cell_str = '' 24 for cell in row.cells: 25 _cell_str += cell.text + ',' 26 self.table_text += _cell_str + '\n' 27 28 29 def search_word(path, targets): 30 result = glob.glob(path) 31 final_result = [] 32 33 for i in result: 34 isuse = True 35 if glob.os.path.isfile(i): 36 if i.endswith('.docx'): 37 doc = ReadDoc(i) 38 p_text = doc.p_text 39 t_text = doc.table_text 40 all_text = p_text + t_text 41 42 for target in targets: 43 if target not in all_text: 44 isuse = False 45 break 46 47 if not isuse: 48 continue 49 final_result.append(i) 50 return final_result 51 52 53 if __name__ == '__main__': 54 path = glob.os.path.join(glob.os.getcwd(), '*') 55 res = search_word(path, ['简历', '1']) 56 print(res)
2.2.生成word文档
2.2.1.生成标题
1 # coding:utf-8 2 3 from docx import Document 4 5 doc = Document() 6 7 #定义标题内容 8 title = doc.add_heading('My title',0) 9 10 #标题追加 11 title.add_run('\n123') 12 13 #保存doc对象 word文档 14 doc.save('test.docx')2.2.2.添加段落
1 # coding:utf-8 2 3 from docx import Document 4 5 doc = Document() 6 7 #定义标题内容 8 title = doc.add_heading('My title',0) 9 10 #标题追加 11 title.add_run('\n123') 12 13 #添加段落 14 p = doc.add_paragraph('这是段落内容') 15 #段落内容追加 16 p.add_run('\n这是追加的段落内容') 17 #保存doc对象 word文档 18 doc.save('test.docx')2.2.3.添加图片
1 # coding:utf-8 2 3 from docx import Document 4 from docx.shared import Inches 5 6 doc = Document() 7 8 #添加图片 9 image=doc.add_picture('logo2020.png',width=Inches(3),height=Inches(2)) 10 11 #保存doc对象 word文档 12 doc.save('test.docx')2.2.4.添加表格
1 # coding:utf-8 2 3 from docx import Document 4 5 doc = Document() 6 7 title = ['name','age','sex'] 8 9 table = doc.add_table(rows=1,cols=3) 10 title_cells = table.rows[0].cells 11 for i in range(len(title)): 12 title_cells[i].text=title[i] 13 14 data = [ 15 ('zhangsan','10','man'), 16 ('lisi','20','man'), 17 ('xiaofang','18','women') 18 ] 19 20 for d in data: 21 row_cells = table.add_row().cells 22 row_cells[0].text = d[0] 23 row_cells[1].text = d[1] 24 row_cells[2].text = d[2] 25 26 #保存doc对象 word文档 27 doc.save('test.docx')2.2.5.分页
1 # coding:utf-8 2 3 from docx import Document 4 5 doc = Document() 6 7 doc.add_heading('第一页',0) 8 9 #分页 10 doc.add_page_break() 11 12 doc.add_heading('第二页',0) 13 #保存doc对象 word文档 14 doc.save('test.docx')2.2.6.保存生成word
1 #保存doc对象 word文档 2 doc.save('test.docx')
2.3.word全局样式和文本样式
2.3.1.全局样式定义
1 # coding:utf-8 2 3 from docx import Document 4 from docx.shared import Inches,RGBColor,Pt 5 6 doc = Document() 7 8 #style的这些操作不会对标题产生影响 9 style = doc.styles['Normal'] 10 style.font.name = '仿宋' #字体类型 11 style.font.color.rgb = RGBColor(255,0,0) #字体颜色:红色 12 style.font.size = Pt(30) #字体大小:30 13 14 #标题 15 doc.add_heading('第一页',0) 16 #段落 17 doc.add_paragraph('这是段落内容') 18 19 #保存doc对象 word文档 20 doc.save('test.docx')2.3.2.文本样式定义-标题与段落
1 # coding:utf-8 2 3 from docx import Document 4 from docx.shared import Inches,RGBColor,Pt 5 from docx.enum.text import WD_PARAGRAPH_ALIGNMENT 6 7 doc = Document() 8 9 #标题 10 title = doc.add_heading('第一页',0) 11 title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #标题居中 12 title.style.font.size=Pt(30) #标题字体大小 13 title.italic = True #一开始的标题内容无法使其斜体格式生效,如果想要实现,那么我们在add_heading的时候传入一个空内容 14 _t = title.add_run('\n123') 15 _t.italic = True #标题追加的内容,可以使其变成斜体 16 _t.bold = True #标题加粗,同样只能对追加的标题内容生效 17 _t.underline = True #标题加下划线,同样只能对追加的标题内容生效 18 #段落 19 paragraph = doc.add_paragraph('这是段落内容') 20 paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #段落居中 21 paragraph.style.font.size=Pt(19) #段落字体大小 22 paragraph.italic = True #一开始的段落内容无法使其斜体格式生效,如果想要实现,那么我们在add_paragraph的时候传入一个空内容 23 _p = paragraph.add_run('\n456') 24 _p.italic = True #段落追加的内容,可以使其变成斜体 25 _p.bold = True #段落加粗,同样只能对追加的段落内容生效 26 _p.underline = True #段落加下划线,同样只能对追加的段落内容生效 27 28 #通过dir(段落)和dir(标题)可以看到更多的样式方法 29 30 #保存doc对象 word文档 31 doc.save('test.docx')2.3.3.图片的居中
1 # coding:utf-8 2 3 from docx import Document 4 from docx.shared import Inches 5 from docx.enum.text import WD_ALIGN_PARAGRAPH 6 7 doc = Document() 8 9 #图片 10 p1 = doc.add_paragraph() 11 p1.alignment = WD_ALIGN_PARAGRAPH.RIGHT 12 _p1 = p1.add_run() 13 image_obj=_p1.add_picture('logo2020.png',width=Inches(3),height=Inches(2)) 14 15 #保存doc对象 word文档 16 doc.save('test.docx') 17 18 print(dir(WD_ALIGN_PARAGRAPH)) 19 ''' 20 位置有哪些格式: 21 ['CENTER', 'DISTRIBUTE', 'JUSTIFY', 'JUSTIFY_HI', 'JUSTIFY_LOW', 'JUSTIFY_MED', 'LEFT', 'RIGHT', 22 'THAI_JUSTIFY', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__docs_rst__', 23 '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__l' 24 '''2.3.4.表格的样式定义
1 # coding:utf-8 2 3 from docx import Document 4 from docx.enum.style import WD_STYLE_TYPE 5 6 doc = Document() 7 8 for i in doc.styles: 9 if i.type == WD_STYLE_TYPE.TABLE: 10 print(i.name) #打印所有的表格样式 11 ''' 12 Normal Table 13 Table Grid 14 Light Shading 15 Light Shading Accent 1 16 Light Shading Accent 2 17 Light Shading Accent 3 18 Light Shading Accent 4 19 Light Shading Accent 5 20 Light Shading Accent 6 21 Light List 22 Light List Accent 1 23 Light List Accent 2 24 Light List Accent 3 25 Light List Accent 4 26 Light List Accent 5 27 Light List Accent 6 28 Light Grid 29 Light Grid Accent 1 30 Light Grid Accent 2 31 Light Grid Accent 3 32 Light Grid Accent 4 33 Light Grid Accent 5 34 Light Grid Accent 6 35 Medium Shading 1 36 Medium Shading 1 Accent 1 37 Medium Shading 1 Accent 2 38 Medium Shading 1 Accent 3 39 Medium Shading 1 Accent 4 40 Medium Shading 1 Accent 5 41 Medium Shading 1 Accent 6 42 Medium Shading 2 43 Medium Shading 2 Accent 1 44 Medium Shading 2 Accent 2 45 Medium Shading 2 Accent 3 46 Medium Shading 2 Accent 4 47 Medium Shading 2 Accent 5 48 Medium Shading 2 Accent 6 49 Medium List 1 50 Medium List 1 Accent 1 51 Medium List 1 Accent 2 52 Medium List 1 Accent 3 53 Medium List 1 Accent 4 54 Medium List 1 Accent 5 55 Medium List 1 Accent 6 56 Medium List 2 57 Medium List 2 Accent 1 58 Medium List 2 Accent 2 59 Medium List 2 Accent 3 60 Medium List 2 Accent 4 61 Medium List 2 Accent 5 62 Medium List 2 Accent 6 63 Medium Grid 1 64 Medium Grid 1 Accent 1 65 Medium Grid 1 Accent 2 66 Medium Grid 1 Accent 3 67 Medium Grid 1 Accent 4 68 Medium Grid 1 Accent 5 69 Medium Grid 1 Accent 6 70 Medium Grid 2 71 Medium Grid 2 Accent 1 72 Medium Grid 2 Accent 2 73 Medium Grid 2 Accent 3 74 Medium Grid 2 Accent 4 75 Medium Grid 2 Accent 5 76 Medium Grid 2 Accent 6 77 Medium Grid 3 78 Medium Grid 3 Accent 1 79 Medium Grid 3 Accent 2 80 Medium Grid 3 Accent 3 81 Medium Grid 3 Accent 4 82 Medium Grid 3 Accent 5 83 Medium Grid 3 Accent 6 84 Dark List 85 Dark List Accent 1 86 Dark List Accent 2 87 Dark List Accent 3 88 Dark List Accent 4 89 Dark List Accent 5 90 Dark List Accent 6 91 Colorful Shading 92 Colorful Shading Accent 1 93 Colorful Shading Accent 2 94 Colorful Shading Accent 3 95 Colorful Shading Accent 4 96 Colorful Shading Accent 5 97 Colorful Shading Accent 6 98 Colorful List 99 Colorful List Accent 1 100 Colorful List Accent 2 101 Colorful List Accent 3 102 Colorful List Accent 4 103 Colorful List Accent 5 104 Colorful List Accent 6 105 Colorful Grid 106 Colorful Grid Accent 1 107 Colorful Grid Accent 2 108 Colorful Grid Accent 3 109 Colorful Grid Accent 4 110 Colorful Grid Accent 5 111 Colorful Grid Accent 6 112 ''' 113 title = ['name','age','sex'] 114 table = doc.add_table(rows=1,cols=3,style='Colorful List Accent 3') 115 116 title_cells = table.rows[0].cells 117 for i in range(len(title)): 118 title_cells[i].text=title[i] 119 120 data=[ 121 ('zhangsan','10','man'), 122 ('lisi','20','man'), 123 ('xiaofang','18','women') 124 ] 125 126 for d in data: 127 row_cells = table.add_row().cells 128 for i in range(len(data)): 129 row_cells[i].text = d[i] 130 #保存doc对象 word文档 131 doc.save('test.docx')
2.3.生成pdf文档
2.3.1.pdf工具包
- 下载wkhtmltopdf安装包,并且安装到电脑上
- 下载地址:https://wkhtmltopdf.org/downloads.html
- 在pycharm中安装wkhtmltopdf库:
- pip install wkhtmltopdf
- 在代码中指定configuration参数
- configuration=pdfkit.configuration(wkhtmltopdf=r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe' 或者设置环境变量:为系统变量path加入wkhtmltopdf安装目录的bin即可
2.3.2.html转pdf
2.3.3.网址转pdf
2.3.4.字符串生成pdf
1 # coding:utf-8 2 3 import pdfkit 4 5 pdfkit.from_url('https://www.baidu.com','test1.pdf',configuration=pdfkit.configuration(wkhtmltopdf=r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe')) 6 7 html=''' 8 <html> 9 <head> 10 <meta charset="utf-8" /> 11 </head> 12 <body> 13 <p>你好</p> 14 </body> 15 </html> 16 ''' 17 pdfkit.from_string(html,'test2.pdf',configuration=pdfkit.configuration(wkhtmltopdf=r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe'))2.3.5.word转html之pydocx
# coding:utf-8 import pdfkit from pydocx import PyDocX html = PyDocX.to_html('简历1.docx') f = open('html1.html','w',encoding='utf-8') f.write(html) f.close() #方法一 pdfkit.from_file('html1.html','test3.pdf',configuration=pdfkit.configuration(wkhtmltopdf=r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe')) #方法二 pdfkit.from_string(html,'test4.pdf',configuration=pdfkit.configuration(wkhtmltopdf=r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe'))
3.Python Excel自动化
3.1.Excel读取之xlrd
3.1.1.xlrd的安装
3.1.2.常用函数介绍
1 # coding:utf-8 2 3 import xlrd 4 5 excel = xlrd.open_workbook('study.xlsx') 6 7 book = excel.sheet_by_name('学生手册') 8 print(book) #<xlrd.sheet.Sheet object at 0x000001F48391D708> 9 10 book = excel.sheet_by_index(0) 11 print(book.name) #打印sheet的名字,学生手册 12 13 for i in excel.sheets(): #打印excel所有的sheet 14 print(i.name) #学生手册3.1.3.读取工作薄内容
1 # coding:utf-8 2 3 import xlrd 4 5 excel = xlrd.open_workbook('study.xlsx') 6 7 book = excel.sheet_by_name('学生手册') 8 print(book) #<xlrd.sheet.Sheet object at 0x000001F48391D708> 9 10 book = excel.sheet_by_index(0) 11 print(book.name) #打印sheet的名字,学生手册 12 13 for i in excel.sheets(): #打印excel所有的sheet 14 print(i.name) #学生手册 15 16 print(book.nrows) #行数:6行 17 print(book.ncols) #列数:5列 18 19 for i in book.get_rows(): 20 print(i) #里面每一个键值对都是一个对象,[text:'姓名', text:'性别', text:'年龄', text:'成绩', text:'等级'] 21 content = [] 22 for j in i: 23 content.append(j.value) 24 print(content) #['姓名', '性别', '年龄', '成绩', '等级']
3.2.Excel写之xlsxwriter
xlsxwriter 只能创建新的文件(覆盖),不能对文件进行数据的操作,往后的随笔到数据分析可以使用pandas很好的完成追加
3.2.1.xlsxwriter的安装
3.2.2.常用函数介绍
1 # coding:utf-8 2 3 import xlsxwriter # pip install xlsxwriter 4 5 excel = xlsxwriter.Workbook('write1.xlsx') 6 book = excel.add_worksheet('study') 7 8 title = ['姓名', '性别', '年龄', '成绩', '等级'] 9 10 for index,data in enumerate(title): 11 book.write(0,index,data) 12 excel.close()1 # coding:utf-8 2 3 import xlsxwriter # pip install xlsxwriter 4 import xlrd 5 6 #excel 文件之间相互复制 7 def read(): 8 result = [] 9 excel = xlrd.open_workbook('study.xlsx') 10 book = excel.sheet_by_name('学生手册') 11 for i in book.get_rows(): 12 content=[] 13 for j in i: 14 content.append(j.value) 15 result.append(content) 16 return result 17 18 19 def write(content): 20 excel = xlsxwriter.Workbook('write1.xlsx') 21 book = excel.add_worksheet('study') 22 23 for index,data in enumerate(content): 24 for sub_index,sub_data in enumerate(data): 25 book.write(index,sub_index,sub_data) 26 excel.close() 27 28 if __name__=='__main__': 29 result = read() 30 write(result)3.2.3.生成图表
1 # coding:utf-8 2 3 import xlsxwriter # pip install xlsxwriter 4 import xlrd 5 6 #excel 文件之间相互复制 7 def read(): 8 result = [] 9 excel = xlrd.open_workbook('study.xlsx') 10 book = excel.sheet_by_name('学生手册') 11 for i in book.get_rows(): 12 content=[] 13 for j in i: 14 content.append(j.value) 15 result.append(content) 16 return result 17 18 19 def write(content): 20 excel = xlsxwriter.Workbook('write1.xlsx') 21 book = excel.add_worksheet('study') 22 23 for index,data in enumerate(content): 24 for sub_index,sub_data in enumerate(data): 25 book.write(index,sub_index,sub_data) 26 27 book1 = excel.add_worksheet('学生等级') 28 #生成图表 29 data = [ 30 ['优秀', '良好', '中', '差'], 31 [1100, 2000, 1000, 900] 32 ] 33 book1.write_column('A1',data[0]) 34 book1.write_column('B1',data[1]) 35 36 chart = excel.add_chart({'type':'column'}) 37 chart.add_series({ 38 'categories': '=学生等级!$A1:$A4', 39 'values': '=学生等级!$B1:$B4', 40 'name': '成绩占比' 41 }) 42 chart.set_title({'name': '成绩占比图表'}) 43 #将图表插入到A10位置 44 book1.insert_chart('A10', chart) 45 46 excel.close() 47 48 if __name__=='__main__': 49 result = read() 50 write(result)
4.PPT自动化
4.1.PPT的创建
4.1.1.python-pptx的安装
4.1.2.创建空ppt对象
1 # coding:utf-8 2 3 import pptx # pip install python-pptx 4 5 p = pptx.Presentation() # 生成ppt对象 6 7 layout = p.slide_layouts[1] # 选择布局 8 9 # 0 title 10 # 1 title content 11 # 7 12 slide = p.slides.add_slide(layout) 13 14 p.save('test1.ppt')
4.2.PPT段落的使用
4.2.1.获取段落
4.2.2.段落添加内容
1 # coding:utf-8 2 3 import pptx 4 5 p = pptx.Presentation() 6 layout = p.slide_layouts[1] # title content 7 slide = p.slides.add_slide(layout) 8 9 placeholder = slide.placeholders[1] # 0 title 1 content 10 placeholder.text = '欢迎学习ppt制作\n欢迎学习python' 11 12 13 14 title = slide.placeholders[0] 15 title.text = '题目' 16 p.save('test2.ppt')4.2.3.段落中定义多个段落
1 # coding:utf-8 2 3 import pptx 4 from pptx.util import Pt 5 from pptx.enum.text import PP_PARAGRAPH_ALIGNMENT 6 7 p = pptx.Presentation() 8 layout = p.slide_layouts[1] # title content 9 slide = p.slides.add_slide(layout) 10 11 placeholder = slide.placeholders[1] # 0 title 1 content 12 13 14 title = slide.placeholders[0] 15 title.text = '题目' 16 17 paragraph1 = placeholder.text_frame.add_paragraph() 18 paragraph1.text = '欢迎学习ppt制作' 19 paragraph1.bold = True 20 paragraph1.font.italic = True 21 paragraph1.font.size = Pt(16) 22 paragraph1.font.underline = True 23 paragraph1.alignment = PP_PARAGRAPH_ALIGNMENT.CENTER 24 25 26 paragraph2 = placeholder.text_frame.add_paragraph() 27 paragraph2.text = '欢迎学习python' 28 paragraph2.font.size = Pt(32) 29 paragraph2.alignment = PP_PARAGRAPH_ALIGNMENT.RIGHT 30 31 p.save('test2.ppt')4.2.4.自定义段落
1 # coding:utf-8 2 3 import pptx 4 from pptx.util import Pt, Inches 5 from pptx.enum.text import PP_PARAGRAPH_ALIGNMENT 6 from pptx.dml.color import RGBColor 7 8 p = pptx.Presentation() 9 layout = p.slide_layouts[6] # 只有一个title,没有段落 10 slide = p.slides.add_slide(layout) 11 left = top = width = height = Inches(5) 12 box = slide.shapes.add_textbox(left, top, width, height) 13 para = box.text_frame.add_paragraph() 14 15 para.text = 'this is a para test' 16 para.alignment = PP_PARAGRAPH_ALIGNMENT.CENTER 17 para.font.size = Pt(32) 18 para.font.color.rgb = RGBColor(255, 255, 0) 19 para.font.name = '微软雅黑' 20 21 p.save('test2.ppt')
4.3.PPT插入表格
1 # coding:utf-8 2 3 import pptx 4 from pptx.util import Inches 5 6 p = pptx.Presentation() 7 layout = p.slide_layouts[1] 8 slide = p.slides.add_slide(layout) 9 10 rows = 10 11 cols = 2 12 13 left = top = Inches(2) 14 width = Inches(6.0) 15 height = Inches(1.0) 16 17 table = slide.shapes.add_table(rows, cols, left, top, width, height).table 18 19 for index, _ in enumerate(range(rows)): 20 for sub_index in range(cols): 21 table.cell(index, sub_index).text = '%s:%s' % (index, sub_index) 22 23 p.save('test2.ppt')
4.4.PPT插入图片
1 # coding:utf-8 2 3 import pptx 4 from pptx.util import Inches 5 6 p = pptx.Presentation() 7 layout = p.slide_layouts[6] 8 slide = p.slides.add_slide(layout) 9 10 image = slide.shapes.add_picture( 11 image_file='logo2020.png', 12 left=Inches(1), 13 top=Inches(1), 14 width=Inches(6), 15 height=Inches(4) 16 ) 17 18 p.save('test2.ppt')
4.5.读取PPT
1 # coding:utf-8 2 3 import pptx 4 5 p = pptx.Presentation('test2.ppt') 6 for slide in p.slides: 7 for shape in slide.shapes: 8 if shape.has_text_frame: 9 print(shape.text_frame.text) 10 if shape.has_table: 11 for cell in shape.table.iter_cells(): 12 print(cell.text)
5.Python邮件自动化
5.1.发送邮件
1 # coding:utf-8 2 3 #发送qq邮件 4 import smtplib 5 6 from email.mime.text import MIMEText 7 from email.header import Header 8 9 10 #第三方的smtp 11 mail_host = 'smtp.qq.com' #smtp服务器地址 12 mail_user = '34503' #用户名 13 mail_pass = 'cqsahmvsf假的看自己的' #smtp 开通, 授权码 14 15 sender = '34503@qq.com' #发送人 16 receivers = ['gei@are.cc'] #接收者邮箱 17 18 mesage = MIMEText('这是一个测试','plain','utf-8') #定义邮件发送内容的对象,编码格式为utf-8,邮件类型为文本类型的plain普通邮件,邮件内容为:这是一个测试 19 20 mesage['Form'] = Header(sender) #邮件发送内容对象Form属性:是谁发送的 21 mesage['Subject'] = Header('python脚本测试','utf-8') #邮件发送内容对象Subject属性:邮件标题 22 23 smtpobj = smtplib.SMTP() #创建smtp协议对象 24 smtpobj.connect(mail_host,25) #协议链接到服务地址,服务地址端口 25 smtpobj.login(mail_user,mail_pass) #登录 26 smtpobj.sendmail(sender,receivers,mesage.as_string()) #发送,发送者,接收者,邮件对象通过as_string进行加密
5.2.发送html邮件
1 # coding:utf-8 2 3 import smtplib 4 5 from email.mime.text import MIMEText 6 from email.header import Header 7 8 9 #第三方的smtp 10 mail_host = 'smtp.qq.com' #smtp服务器地址 11 mail_user = '34503' #用户名 12 mail_pass = 'cqsahmvsfl' #smtp 开通, 授权码 13 14 sender = '34503@qq.com' #发送人 15 receivers = ['gei@are.cc'] #接收者邮箱 16 17 mesage = MIMEText('<p style="color:red;">这是二个测试</p>', 'html', 'utf-8') #定义邮件发送内容的对象,编码格式为utf-8,邮件类型为html类型,邮件内容为:这是二个测试 18 19 mesage['Form'] = Header(sender) #邮件发送内容对象Form属性:是谁发送的 20 mesage['Subject'] = Header('python脚本测试','utf-8') #邮件发送内容对象Subject属性:邮件标题 21 22 smtpobj = smtplib.SMTP() #创建smtp协议对象 23 smtpobj.connect(mail_host,25) #协议链接到服务地址,服务地址端口 24 smtpobj.login(mail_user,mail_pass) #登录 25 smtpobj.sendmail(sender,receivers,mesage.as_string()) #发送,发送者,接收者,邮件对象通过as_string进行加密
5.3.发送带附件的邮件
1 # coding:utf-8 2 3 import smtplib 4 5 from email.mime.text import MIMEText 6 from email.header import Header 7 from email.mime.multipart import MIMEMultipart 8 9 #第三方的smtp 10 mail_host = 'smtp.qq.com' #smtp服务器地址 11 mail_user = '34503' #用户名 12 mail_pass = 'cqsahmvsfl' #smtp 开通, 授权码 13 14 sender = '34503@qq.com' #发送人 15 receivers = ['gei@are.cc'] #接收者邮箱 16 17 message = MIMEMultipart() 18 message['Form'] = Header(sender) #邮件发送内容对象Form属性:是谁发送的 19 message['Subject'] = Header('python脚本测试','utf-8') #邮件发送内容对象Subject属性:邮件标题 20 21 attr = MIMEText(open('send.py','rb').read(),'base64','utf-8') 22 attr['Content-Type'] = 'application/octet-stream' 23 attr['Content-Disposition'] = 'attachment;filename="send.py"' 24 25 message.attach(attr) 26 message.attach(MIMEText('这是一个带附件的邮件', 'plain', 'utf-8')) 27 28 smtpobj = smtplib.SMTP() #创建smtp协议对象 29 smtpobj.connect(mail_host,25) #协议链接到服务地址,服务地址端口 30 smtpobj.login(mail_user,mail_pass) #登录 31 smtpobj.sendmail(sender,receivers,message.as_string()) #发送,发送者,接收者,邮件对象通过as_string进行加密
5.4.定时发送邮件
1 # coding:utf-8 2 3 import smtplib 4 import schedule 5 6 from email.mime.text import MIMEText 7 from email.header import Header 8 from email.mime.multipart import MIMEMultipart 9 from time import sleep 10 #第三方的smtp 11 mail_host = 'smtp.qq.com' #smtp服务器地址 12 mail_user = '34503' #用户名 13 mail_pass = 'cqsahmvsfl' #smtp 开通, 授权码 14 15 sender = '34503@qq.com' #发送人 16 receivers = ['gei@are.cc'] #接收者邮箱 17 18 message = MIMEMultipart() 19 message['Form'] = Header(sender) #邮件发送内容对象Form属性:是谁发送的 20 message['Subject'] = Header('python脚本测试','utf-8') #邮件发送内容对象Subject属性:邮件标题 21 22 attr = MIMEText(open('send.py','rb').read(),'base64','utf-8') 23 attr['Content-Type'] = 'application/octet-stream' 24 attr['Content-Disposition'] = 'attachment;filename="send.py"' 25 26 message.attach(attr) 27 message.attach(MIMEText('这是一个带附件的邮件', 'plain', 'utf-8')) 28 29 def send(): 30 try: 31 smtpobj = smtplib.SMTP() #创建smtp协议对象 32 smtpobj.connect(mail_host,25) #协议链接到服务地址,服务地址端口 33 smtpobj.login(mail_user,mail_pass) #登录 34 smtpobj.sendmail(sender,receivers,message.as_string()) #发送,发送者,接收者,邮件对象通过as_string进行加密 35 except smtplib.SMTPException as e: 36 print('error: %s' %e) 37 38 39 if __name__=='__main__': 40 schedule.every(10).seconds.do(send) 41 42 while 1: 43 schedule.run_pending() 44 sleep(1)