pip
time
string
random
selenium
os
IO
docx
requests
Path
EasyGui
openpyxl
CheatSheet
Email
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ?
#!/usr/bin/env python
为了防止操作系统用户没有将python装在默认的/usr/bin路径里。
目的是在运行python脚本的时候告诉操作系统我们要用python解释器去运行py脚本。
# -*- coding: UTF-8 -*-
为了告诉Python解释器:此源程序是utf-8编码的,也即告诉python解释器要按照utf-8编码的方式来读取程序。
https://pypi.org/project/
安装特定版本的第三方包
pip install package==version
#package:包名;version:版本号
安装模块
pip install package
卸载模块
pip uninstall package
查看当前环境安装的所有包
pip list
显示所安装包的信息
pip show package
查看所有可更新的模块
pip list --outdated
更新某一个模块
pip install --upgrade package
指定更新源更新模块
pip install --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple package
更新所有的模块
pip-review --local --interactive
import time
当前时间戳:time.time() 格式为10位整数的浮点数,int取整。
当前时间戳:round(time.time()*1000) 格式为13位整数
格式化成年-月-日 时:分:秒形式:time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
import pyttsx3
engine = pyttsx3.init()
engine.setProperty('voice','HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_ZH-CN_HUIHUI_11.0')
engine.setProperty('rate', 123)
engine.say('百度安全验证')
engine.runAndWait()
import string
生成所有数字:string.digits
生成所有大小写字母:string.ascii_letters
生成所有小写字母:string.ascii_lowercase
生成所有大写字母:string.ascii_uppercase
string.printable:返回所有可打印字符及空格等
string.punctuation:返回所有标点符号
import random
random.random():生成一个随机的浮点数范围是在0.0~1.0之间
random.uniform():设定浮点数的范围
random.randint(a,b):返回包含数字为a到b之间的数字
random.choice():可以从任何序列选取一个随机的元素返回
random.shuffle():随机打乱序列中的元素
random.sample():随机的截取指定长度的片断
import string
生成所有数字:string.digits
生成所有大小写字母:string.ascii_letters
生成所有小写字母:string.ascii_lowercase
生成所有大写字母:string.ascii_uppercase
string.printable:返回所有可打印字符及空格等
string.punctuation:返回所有标点符号
https://www.selenium.dev/zh-cn/documentation/webdriver/elements
安装:pip install selenium
驱动:chromedrive.exe
反爬:StealthJS # window.navigator.webdriver
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.wait import WebDriverWait
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://127.0.0.1:80") # 设置代理ip
options.add_argument('--user-agent=""') # 设置请求头的User-Agent
options.add_argument('--disable-infobars') # 禁止策略化
options.add_argument('--no-sandbox') # 解决DevToolsActivePort文件不存在的报错
options.add_argument('window-size=1920x1080') # 指定浏览器分辨率
options.add_argument('--disable-gpu') # 谷歌文档提到需要加上这个属性来规避bug
options.add_argument('--incognito') # 隐身模式(无痕模式)
options.add_argument('--disable-javascript') # 禁用javascript
options.add_argument('--start-maximized') # 最大化运行 不建议设置
options.add_argument('--disable-infobars') # 禁用浏览器正在被自动化程序控制的提示
options.add_argument('--hide-scrollbars') # 隐藏滚动条, 应对一些特殊页面
options.add_argument('--blink-settings=imagesEnabled=false') # 不加载图片, 提升速度
options.add_argument('--headless') # 浏览器不提供可视化页面
options.add_argument('--ignore-certificate-errors') # 去掉您的链接不是私密的提示处理
options.add_argument("excludeSwitches", ["enable-automation"]) # 去掉浏览器被自动化软件控制的提示
options.add_experimental_option('useAutomationExtension',False) # 去掉浏览器被自动化软件控制的提示
options.add_experimental_option('excludeSwitches', ['enable-logging']) # 去掉errorcode:-105报错
browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{'source':'Object.defineProperty(navigator,"webdriver",{get:()=>undefind})'})
# 可以通过隐藏WebDriver提示条和自动化扩展信息来跳过百度安全验证?
prefs = {
"profile.default_content_setting_values": {
"notifications": 2
}
}
options.add_experimental_option("prefs", prefs) # 禁止弹窗
driver = webdriver.Chrome(chrome_options=chromeOptions)
driver = webdriver.Chrome(executable_path='', options=options) # 去掉errorcode:-105报错?
通过元素id定位:find_element_by_id
通过元素name定位:find_element_by_name
通过xpath表达式定位:find_element_by_xpath
通过完整超链接定位:find_element_by_link_text
通过部分链接定位:find_element_by_partial_link_text
通过标签定位:find_element_by_tag_name
通过类名进行定位:find_element_by_class_name
通过css选择器进行定位:find_elements_by_css_selector
如上所示定位多个元素则修改为:elements
设置浏览器的大小:set_window_size()
控制浏览器后退:back()
控制浏览器前进:forward()
刷新当前页面:refresh()
清除文本:clear()
模拟按键输入:send_keys (value) 通过send_keys()方法可实现文件上传
单击元素:click()
用于提交表单:submit()
获取元素属性值:get_attribute(name)
设置该元素是否用户可见:is_displayed()
返回元素的尺寸:size
获取元素的文本:text
构造ActionChains对象:ActionChains(driver)
执行鼠标悬停操作:context_click()
右击:move_to_element(above)
双击:double_click()
拖动:drag_and_drop()
执行鼠标悬停操作:move_to_element(above)
用于模拟鼠标右键操作在调用时需要指定元素定位:context_click()
执行所有ActionChains中存储的行为可以理解成是对整个操作的提交动作:perform()
删除键(BackSpace):send_keys(Keys.BACK_SPACE)
空格键(Space):send_keys(Keys.SPACE)
制表键(Tab):send_keys(Keys.TAB)
回退键(Esc):send_keys(Keys.ESCAPE)
回车键(Enter):send_keys(Keys.ENTER)
全选(Ctrl+A):send_keys(Keys.CONTROL,‘a’)
复制(Ctrl+C):send_keys(Keys.CONTROL,‘c’)
剪切(Ctrl+X):send_keys(Keys.CONTROL,‘x’)
粘贴(Ctrl+V):send_keys(Keys.CONTROL,‘v’)
键盘(F1…Fn):send_keys(Keys.F1…Fn)
用于获得当前页面的标题:title
用户获得当前页面的URL:current_url
获取搜索条目的文本信息:text
将当前定位的主体切换为frame/iframe表单的内嵌页面中:switch_to.frame()
跳回最外层的页面:switch_to.default_content()
获得当前窗口句柄:current_window_handle
返回所有窗口的句柄到当前会话:window_handles
切换到相应的窗口:switch_to.window()
返回alert/confirm/prompt中的文字信息:text
接受现有警告框:accept()
解散现有警告框:dismiss()
将文本发送至警告框:send_keys(keysToSend)
下拉框select标签的value属性的值:select_by_value(“选择值”)
下拉框的索引:select_by_index(“索引值”)
下拉框的文本值:select_by_visible_testx(“文本值”)
获得所有cookie信息:get_cookies()
返回cookie信息:get_cookie(name) 返回字典的key为name的cookie信息
添加cookie:add_cookie(cookie_dict) cookie_dict指字典对象必须有name和value值
删除cookie信息:delete_cookie(name,optionsString) name是要删除的cookie的名称optionsString是该cookie的选项
删除所有cookie信息:delete_all_cookies()
调用JavaScript代码:js="window.scrollTo(左边距,上边距);" driver.execute_script(js)
用于截取当前窗口并把图片保存到本地:get_screenshot_as_file(self, filename)
用于获取指定元素的截图并保存到本地:element.screenshot(filename)
driver.implicitly_wait(10) # 隐性等待-秒
time.sleep(10) # 强制等待-秒
WebDriverWait(driver,10,poll_frequency=0.5,ignored_exceptions=None) # 显示等待-秒
关闭单个窗口:close()
关闭所有窗口:quit()
# browser.switch_to.alert.accept() 弹出框-同意
# browser.switch_to.alert.dismiss() 弹出框-取消
# browser.switch_to.alert.text() 弹出框-内容
# browser.switch_to.alert.send_keys() 弹出框-输入
import os
os.sep #系统路径的分隔符,Windows为\\ Linux/Unix为/。
os.name #系统平台,Windows为nt Linux/Unix为posix。
os.environ() #获取系统环境变量
os.getenv(环境变量名称) #读取环境变量
os.getcwd() #获取当前路径
os.listdir() #返回指定目录下的所有文件和目录名
os.mkdir() #创建一个目录文件
os.rmdir() #仅删除一个空目录文件
os.makedirs(dirname) #生成多次递归目录
os.removedirs(dirname) #仅删除多层递归的空目录
os.chdir() #改变当前目录到指定目录中
os.rename() #重命名目录名或文件名
os.path.exists(path) #判断文件或目录是否存在
os.path.isfile(path) #判断是否为文件
os.path.isdir(path) #判断是否为目录
os.path.basename(path) #返回文件名
os.path.dirname(path) #返回文件路径
os.path.getsize(name) #获得文件大小,如果name是目录返回OL。
os.path.abspath(name) #获得绝对路径
os.path.join(path,name) #连接目录与文件名
r = 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
w = 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a = 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件进行写入。
rb = 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
wb = 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab = 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件进行写入。
r+ = 打开一个文件用于读写。文件指针将会放在文件的开头。
w+ = 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a+ = 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
rb+ = 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
wb+ = 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab+ = 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
with open(path, 'r', encoding='gbk') as f:
f.write('Hello World')
f.read() #读取全部文件内容
f.read(size) #每次读取size个字节内容
f.readline() #每次读取一行的内容
f.readlines() #读取全部内容,但结果是个list,每行内容是一个元素
import docx
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH #设置对象居中、对齐等。
from docx.enum.text import WD_TAB_ALIGNMENT,WD_TAB_LEADER #设置制表符等
from docx.shared import Inches #设置图像大小
from docx.shared import Pt #设置像素、缩进等
from docx.shared import RGBColor #设置字体颜色
from docx.shared import Length #设置宽度
file = docx.Document(path) #读取文本文档
print('段落:'+str(len(file.paragraphs)))
for para in file.paragraphs:
print(para.text)
for i in range(len(file.paragraphs)):
print(file.paragraphs[i].text)
file = docx.Document(path) #读取表格文档
for table in doc.tables: #遍历所有表格
for row in table.rows: #遍历表格的所有行
row_str = '\t'.join([cell.text for cell in row.cells]) #一行数据
for cell in row.cells:
print(cell.text, '\t',)
print() #换行
document = Document() #创建文档对象
document.styles['Normal'].font.name = '宋体' #设置西文字体
document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') #设置中文字体
document.add_heading(u'文档标题',0)
p = document.add_paragraph('往文档中添加段落')
p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY #设置对齐方式
p.paragraph_format.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE #设置行间距
p.paragraph_format.space_after = Pt(0) #设置段后间距
p.add_run('粗体').bold = True
p.add_run('等等')
p.add_run('斜体').italic = True
run = p.add_run('content') #延长段落
run.font.color.rgb = RGBColor(255, 0, 0) #设置字体颜色
run.font.size = Pt(21) #设置字号
run.font.bold = True #设置下划线
document.add_heading(u'添加一级标题, level = 1',level = 1)
document.add_paragraph('Intense quote',style = 'IntenseQuote')
document.add_paragraph('添加无序列表',style = 'ListBullet')
document.add_paragraph('添加有序列表1',style = 'ListNumber')
document.add_paragraph('添加有序列表2',style = 'ListNumber')
document.add_paragraph('添加有序列表3',style = 'ListNumber')
document.add_picture('azenta.png',width = Inches(2.25)) #添加图片,并指定宽度。
table = document.add_table(rows = 1,cols = 2) #添加表格: 1行2列
hdr_cells = table.rows[0].cells #获取第一行的单元格列表对象
hdr_cells[0].text = 'Name' #为每一个单元格赋值
hdr_cells[1].text = 'Age' #注:值都要为字符串类型
new_cells = table.add_row().cells #为表格添加一行
new_cells[0].text = 'Tom'
new_cells[1].text = '19'
document.add_page_break() #添加分页符
p = document.add_paragraph('往新的一页中添加段落')
document.save('demo1.doc') #保存文档
import requests
requests.request(method, url, **kwargs)
**kwargs:控制访问的参数,均为可选项,共13个。
params:字典或字节序列,作为参数增加到url中。
data:字典、字节序列或文件对象,作为Request的对象。
json:JSON格式的数据,作为Request的内容。
headers:字典,HTTP定制头。
cookies:字典或CookieJar,Request中的cookie。
auth:元组,支持HTTP认证功能。
files:字典类型,传输文件。
timeout:设定超时时间,秒为单位。
proxies:字典类型,设置访问代理服务器,可以增加登录认证。
allow_redirects:True/False,默认为Ture,重定向开关。
stream:True/False,默认为True,获取内容立即下载开关。
verify:True/False,默认为True,认证SSL证书开关。
cert:本地SSL证书路径。
response = requests.get('http://www.baidu.com')
print(response.status_code) # 打印状态码
HTTP请求的返回状态,200表示连接成功,404表示失败。
若状态码为403一般是目标存有防火墙,触发了反爬策略被限制了IP。
print(response.url) # 打印请求url
print(response.encoding) # 打印响应内容编码方式
print(response.headers) # 打印头信息
print(response.cookies) # 打印cookie信息
jar = requests.cookies.RequestsCookieJar()
将CookieJar转为字典:cookies = requests.utils.dict_from_cookiejar(r.cookies)
将字典转为CookieJar:cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)
print(response.text) # 以文本形式打印网页源码
print(response.content) # 以字节流形式打印
下载图片:open('img', 'wb').write(response.content)
response.json()方法同json.loads(response.text)
requests.get(url, params=None, **kwargs)
requests.post(url, data=None, json=None, **kwargs)
requests.put(url, data=None, **kwargs)
requests.head(url, **kwargs)
requests.delete(url, **kwargs)
requests.patch(url, data=None, **kwargs)
requests.options(url, **kwargs)
# 以上方法均是在此方法的基础上构建
requests.request(method, url, **kwargs)
书验证设置:
from requests.packages import urllib3
urllib3.disable_warnings() #从urllib3中消除警告
response = requests.get('https://www.12306.cn',verify=False) #证书验证设为FALSE
超时异常捕获:
from requests.exceptions import ReadTimeout
try:
res = requests.get('http://httpbin.org', timeout=0.1)
print(res.status_code)
except ReadTimeout:
print(timeout)
使用代理:
proxy = {
'http': '000.000.000.000:00',
'https' '000.000.000.000:000'
}
response = requests.get("https://www.baidu.com/s?wd=AZENTA")
heads = {}
heads['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36'
data = {
'wd': 'AZENTA',
}
response = requests.get('http://www.baidu.com?', params=data, headers=heads)
会话维持:
S = requests.Session()
S.get('http://www.baidu.com')
异常处理:
from requests.exceptions import ReadTimeout,HTTPError,RequestException
try:
response = requests.get('http://www.baidu.com',timeout=0.5)
print(response.status_code)
except ReadTimeout:
print('timeout')
except HTTPError:
print('httperror')
except RequestException:
print('reqerror')
from pathlib import Path
p = Path(file)
p.cwd() # 获取当前路径
p.stat() # 获取当前文件的信息
p.exists() # 判断当前路径是否是文件或者文件夹
p.glob(filename) # 获取路径下的所有符合filename的文件,返回一个generator
p.rglob(filename) # 与上面类似,只不过是返回路径中所有子文件夹的符合filename的文件。
p.is_dir() # 判断该路径是否是文件夹
p.is_file() # 判断该路径是否是文件
p.iterdir() #当path为文件夹时,通过yield产生path文件夹下的所有文件、文件夹路径的迭代器
P.mkdir(parents=Fasle) # 根据路径创建文件夹,parents=True时,会依次创建路径中间缺少的文件夹
p_news = p/'new_dirs/new_dir'
p_news.mkdir(parents=True)
P.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None) #类似于open()函数
p.rename(target) # 当target是string时,重命名文件或文件夹;当target是Path时,重命名并移动文件或文件夹
p.replace(target) # 重命名当前文件或文件夹,如果target所指示的文件或文件夹已存在,则覆盖原文件
p.parent() , p.parents() # parent获取path的上级路径,parents获取path的所有上级路径
p.is_absolute() # 判断path是否是绝对路径
p.match(pattern) # 判断path是否满足pattern
p.rmdir() # 当path为空文件夹的时候,删除该文件夹
p.name # 获取path文件名
p.suffix # 获取path文件后缀
pip install easygui
import easygui as eg
eg.egdemo()
eg.msgbox(msg='消息', title='标题', ok_button='按钮', image=None, root=None)
eg.ccbox(msg='消息', title='标题', choices=('选择1[1]', '选择2[2]'), image=None)
eg.ynbox(msg="消息", title="标题", choices=("[F1]Yes", "[F2]No"), image=None, default_choice='[F1]Yes', cancel_choice='[F2]No')
eg.buttonbox(msg="消息", title="标题, choices=("按钮1[1]", "按钮2[2]", "按钮3[3]"), image=None, images=None, default_choice=None, cancel_choice=None, callback=None,run=True)
eg.indexbox(msg="消息", title="标题", choices=("Yes", "No"), image=None, default_choice='Yes', cancel_choice='No')
eg.boolbox(msg="消息", title="标题", choices=("[Y]es", "[N]o"), image=None, default_choice='Yes', cancel_choice='No')
eg.buttonbox("消息", image=".jpg.gif.png", choices=("选择1","选择2","选择3"))
eg.choicebox(msg="消息", title="标题", choices=['单选1', '单选2', '单选3'], preselect=0, callback=None, run=True)
eg.multchoicebox(msg="消息", title="标题", choices=['多选1', '多选2', '多选3', '多选4', '多选5'])
eg.enterbox(msg="消息", title="标题", default=None, strip=True, image=None, root=None)
eg.integerbox(msg="请输入数字", title="标题", default=None, lowerbound=1, upperbound=99, image=None, root=None)
msg: 输入框描述信息提示,不传时默认为"Enter an interger between lowerbound an upperbound"
title: 输入框标题,默认为 " "
lowerbound: 用户可输入的最小值,默认为0
upperbound: 用户可输入的最大值,默认为99
image: 输入框显示图片,默认无
default: 用户默认输入值
eg.enterbox(msg="请输入文本", title="标题", default="默认", strip=True, image=None, root=None)
msg: 输入框描述信息提示,默认"Enter something."
title: 输入框标题,默认为 " "
default: 用户默认输入文本
strip: 是否去除空格,默认True
image: 输入框显示图片,默认无
eg.multenterbox(msg="请对应输入", title="标题", fields=["苹果", "香蕉", "橘子", "草莓"], values=[], callback=None, run=True):
msg: 输入框描述信息提示,默认“Fill in values for the fields”
title: 输入框标题,默认为 " "
fields: 输入框名称赋值,数组类型,必填,若未传入时抛出TypeError: cannot unpack non-iterable NoneType object异常
values: 用户默认输入文本,数组类型,当传入时,fields中的每项默认显示values中的值
run:默认True
eg.multpasswordbox(msg='请登录账户', title='标题', fields=(["用户", "密码"]), values=())
eg.passwordbox(msg='请输入密码', title='标题', default='', image=None, root=None)
eg.textbox(msg='消息', title='标题', text='文本', codebox=1)
eg.codebox(msg='消息', title='标题', text='文本')
eg.diropenbox(msg='请选择文件', title='标题', default=None)
eg.fileopenbox(msg='请选择文件', title='标题', default='*.pdf', filetypes=None)
eg.filesavebox(msg='请选择文件', title='标题', default='路径', filetypes=None)
eg.exceptionbox(msg=None, title=None)
try:
print('AZENTA·COURIER')
int('这里会产生异常')
except:
eg.exceptionbox()
pip install openpyxl
from openpyxl import load_workbook
from openpyxl.worksheet.hyperlink import hyperlink
from openpyxl.styles import Font,Color # Color用16进制数表示颜色
from openpyxl.styles import colors # colors:res,yellow之类的表示颜色
Workbook是对工作簿的抽象(工作簿 一个excel文件包含多个sheet)
Worksheet是对表格的抽象(工作表 一个workbook有多个表名识别 如“sheet1”,“sheet2”等)
Cell是对单元格的抽象(单元格 存储数据对象)
wb = load_workbook('test.xlsx') #openpyxl第三方库只能处理.xlsx格式的Excel表格
wb.read_only #判断某一指定Excel是否以只读方式打开(返回True或者False)
print(wb.encoding, end='\n\n') #获取文档的字符集编码
print(wb.properties) #获取文档的元数据如标题,创建者,创建日期等
ws = wb.active #获取worksheet对象 处于激活状态下的工作表sheet表
target = wb.copy_worksheet(source) #复制当前活跃的sheet表
①只有单元格(包括值、样式、超链接、备注)和一些工作表对象(包括尺寸、格式和参数)会被复制,其他属性不会被复制,如图片、图表。
②无法在两个文档中复制工作表。
③当文档处于只读或只写状态时也无法复制工作表。
wb = Workbook('test.xlsx') #新建名为test的工作簿
ws.title = 'new' #修改当前所处工作表名称
ws = wb['Sheet2'] #指定sheet工作表:sheet表名可以作为字典的key进行索引
ws.max_column 获取某一指定sheet表中的最大最大列数
ws.max_row 获取某一指定sheet表中的最大行数
wb.sheetnames #获取文档所有sheet表名(以列表格式返回)
wb.worksheets #以列表形式返回所有sheet工作表对象
wb['Sheet1'] #获取指定的工作表
wb.active #获取当前活跃的工作表
cell = ws['A1'] #选择单个单元格(获取指定位置的单元格对象)
ws.cell(1, 1) #参数先行后列 都是索引下标
print(ws['A1'].value) #获取指定单元格的值
print(ws.cell(1, 1).value) #获取指定单元格的值
ws.append([1, 2, 3]) #在指定sheet表最后空白行新增行数据
ws['A1'] = '第一行第一列修改过后的单元格值'
ws.cell(1, 2).value = '第一行第二列修改过后的单元格值'
print(ws.values, end='\n\n') #生成器对象,将一行单元格作为元组单元 组成的生成器
print(list(ws.values), end='\n\n') #将生成器对象转换为列表数据 列表中是生成器中的所有数据
for i in ws.values:
print(i)
ws转Pandas
import pandas as pd
df = pd.DataFrame(ws.values)
Pandas转ws
for i in df.values:
ws.append(i.tolist())
for i in ws.rows:
for j in i:
print(j,j.value,end=',')
print('')
print(ws.iter_rows()) #将每一个单元格对象(按行数据中的单元格)作为一个元组单元 组成的生成器
print(ws.rows, end='\n\n') #将每一个单元格对象(按行数据中的单元格)作为一个元组单元 组成的生成器
for i in ws.rows: #遍历以单元格对象为单位的元组单元组成的生成器
for j in i: #遍历单元格对象中的属性
print(j, j.value)
print(ws.columns, end='\n\n') # 将每一个单元格对象(按照列数据)作为一个元组单元 组成的生成器
print(ws.iter_cols(), end='\n\n') # 将每一个单元格对象(按照列数据)作为一个元组单元 组成的生成器
for i in ws.columns:
print(i)
print(cell.col_idx,cell.column) #单元格列索引
print(cell.row) #单元格行索引
print(cell.column_letter) #单元格列名
print(cell.coordinate) #单元格的坐标
print(cell.data_type) #单元格数字类型 n:数值 s:字符串 d:日期时间
print(cell.encoding) #单元格编码格式 默认utf-8
print(cell.has_style) # 默认样式是 Normal,如果是默认样式,返回False
print(cell.style) #单元格样式
print(cell.style_id) #单元格样式id
ws1 = wb.create_sheet('Mysheet') #插入工作表到最后(默认)
ws2 = wb.create_sheet('Mysheet',0) #插入工作表到最前
ws3 = wb.create_sheet('Mysheet',-1) #插入工作表到倒数第二
ws['A'] #选择一列
ws[1] #选择一行
ws['A:B'] #选择多列
ws[5:10] #选择多行
ws['A3:B9'] #选择指定区域单元格
wb.remove('Mysheet') #删除工作表(方法一)
del wb('Mysheet') #删除工作表(方法二)
ws.delete_cols(1) #删除第一列 以此类推 n代表删除第n列
删除行或者列后,后面的行或者列会自动往前填充,也就是说,删除第一列,原来的第二列就会变成第一列。
ws.delete_rows(1) #删除第一行 以此类推 n代表删除第n行
ws.merge_cells("A1:B1") #合并单元格 合并单元格后之后保留最左上角的值 其他单元格的值全为空(None)
ws.merged_cells #已存在的合并单元格
ws.merged_cell_ranges #已存在的合并单元格列表
ws.unmerge_cells('A1:D3') #解除已存在的合并单元格
样式设置 - 颜色
Color(index=0) #根据索引进行填充
Color(rgb='00000000') #根据rgb值进行填充
COLOR_INDEX = (
'00000000', '00FFFFFF', '00FF0000', '0000FF00', '000000FF', #0-4
'00FFFF00', '00FF00FF', '0000FFFF', '00000000', '00FFFFFF', #5-9
'00FF0000', '0000FF00', '000000FF', '00FFFF00', '00FF00FF', #10-14
'0000FFFF', '00800000', '00008000', '00000080', '00808000', #15-19
'00800080', '00008080', '00C0C0C0', '00808080', '009999FF', #20-24
'00993366', '00FFFFCC', '00CCFFFF', '00660066', '00FF8080', #25-29
'000066CC', '00CCCCFF', '00000080', '00FF00FF', '00FFFF00', #30-34
'0000FFFF', '00800080', '00800000', '00008080', '000000FF', #35-39
'0000CCFF', '00CCFFFF', '00CCFFCC', '00FFFF99', '0099CCFF', #40-44
'00FF99CC', '00CC99FF', '00FFCC99', '003366FF', '0033CCCC', #45-49
'0099CC00', '00FFCC00', '00FF9900', '00FF6600', '00666699', #50-54
'00969696', '00003366', '00339966', '00003300', '00333300', #55-59
'00993300', '00993366', '00333399', '00333333', #60-63
)
BLACK = COLOR_INDEX[0]
WHITE = COLOR_INDEX[1]
RED = COLOR_INDEX[2]
DARKRED = COLOR_INDEX[8]
BLUE = COLOR_INDEX[4]
DARKBLUE = COLOR_INDEX[12]
GREEN = COLOR_INDEX[3]
DARKGREEN = COLOR_INDEX[9]
YELLOW = COLOR_INDEX[5]
DARKYELLOW = COLOR_INDEX[19]
样式设置 - 字体
ws.cell(5,3).value='哈哈哈'
ws.cell(5,3).font = Font(name='仿宋',size=12,color=Color(index=0),b=True,i=True)
# size sz 字体大小
# b bold 是否粗体
# i italic 是否斜体
# name family 字体样式
ws["B1"] = "字体样式"
font = Font(
name="微软雅黑", # 字体
size=15, # 字体大小
color="0000FF", # 字体颜色 用16进制rgb表示
bold=True, # 是否加粗 True/False
italic=True, # 是否斜体 True/False
strike=None, # 是否使用删除线,True/False
underline=None, # 下划线 可选'singleAccounting', 'double', 'single', 'doubleAccounting'
)
ws["B1"].font = font
样式设置 - 对齐
Alignment(horizontal='fill',vertical='center')
# 参数可选项
horizontal = {'fill', 'distributed', 'centerContinuous', 'right','justify', 'center', 'left', 'general'}
vertical = {'distributed', 'justify', 'center', 'bottom', 'top'}
ws.cell(3,3).alignment= Alignment()
ws["B2"] = "对齐方式"
ws['B2'].alignment = Alignment(
horizontal='left', # 水平对齐 可选general、left、center、right、fill、justify、centerContinuous、distributed
vertical='top', # 垂直对齐 可选top、center、bottom、justify、distributed
text_rotation=0, # 字体旋转0~180整数
wrap_text=False, # 是否自动换行
shrink_to_fit=False, # 是否缩小字体填充
indent=0, # 缩进值
)
样式设置 - 边框
Side(style='thin',color=Color(index=0)) #style可选项
style = ('dashDot','dashDotDot', 'dashed','dotted','double','hair', 'medium', 'mediumDashDot', 'mediumDashDotDot','mediumDashed', 'slantDashDot', 'thick', 'thin')
# 'medium' 中粗
# 'thin' 细
# 'thick' 粗
# 'dashed' 虚线
# 'dotted' 点线
ws["B3"] = "边框样式"
side = Side(
style="medium", # 边框样式 可选dashDot、dashDotDot、dashed、dotted、double、hair、medium、mediumDashDot、mediumDashDotDot、mediumDashed、slantDashDot、thick、thin
color="ff66dd", # 边框颜色 16进制rgb表示
)
ws["B3"].border = Border(
top=side, # 上
bottom=side, # 下
left=side, # 左
right=side, # 右
diagonal=side # 对角线
)
样式设置 - 填充
PatternFill(patternType='solid',fgColor=Color(), bgColor=Color())
# fgColor前景色 bgColor后景色
# 参数可选项
patternType = {'darkDown', 'darkUp', 'lightDown', 'darkGrid', 'lightVertical', 'solid', 'gray0625', 'darkHorizontal', 'lightGrid', 'lightTrellis',
'mediumGray', 'gray125', 'darkGray', 'lightGray', 'lightUp', 'lightHorizontal', 'darkTrellis', 'darkVertical'}
ws.cell(3,3).fill = PatternFill()
ws["B4"] = "填充渐变"
fill = PatternFill(
patternType="solid", # 填充类型 可选none、solid、darkGray、mediumGray、lightGray、lightDown、lightGray、lightGrid
fgColor="F562a4", # 前景色 16进制rgb
bgColor="0000ff", # 背景色 16进制rgb
# fill_type=None, # 填充类型
# start_color=None, # 前景色 16进制rgb
# end_color=None # 背景色 16进制rgb
)
ws["B4"].fill = fill
ws["B4"].fill = GradientFill(
degree=60, # 角度
stop=("000000", "FFFFFF") # 渐变颜色 16进制rgb
)
ws['C5'].value = '=HYPERLINK("#Sheet!B2","名称")'
ws['C5'].hyperlink = Hyperlink(ref='',location='Sheet!H5',target='')
ws['C5'].value = '链接' # target目标文件 location目标单元格 工作表名+!+单元格名
link = Namedstyle(name='link',font=Font(color=color.BLUE,underline='single'))
ws['C5'].style = link
row = ws.row_dimensions[1]
row.height = 15 #行高
col = ws.column_dimensions['E']
col.width = 10 #列宽
italic24Font = Font(size=24, italic=True)
ws['B3'].font = italic24Font
ws['B3'] = '24pt Italic'
boldRedFont = Font(name= 'Times New Roman', bold=True, color=colors.BLUE)
ws['A1'].font = boldRedFont
ws['A1'] = 'Bold Blue Times New Roman'
boldRedFont = Font(color=colors.COLOR_INDEX[2])
ws['D1'].font = boldRedFont
ws['D1'] = 'RED'
boldRedFont = Font(color=colors.COLOR_INDEX[5])
ws['G1'].font = boldRedFont
ws['G1'] = 'YELLOW'
ws = wb.copy_worksheet(wb.worksheets[0])
ws.title = 'Formulas'
ws['A1'] = 200
ws['A2'] = 300
ws['A3'] = '=SUM(A1:A2)'
wb.save('test.xlsx') #保存工作簿完成新工作簿的建立(将覆盖同名文件且无警告)
print(wb, end='\n\n')
速查表 - ( 点 击 查 看 更 多 )
import win32com.client as win32
outlook = win32.Dispatch("outlook.application")
mail = outlook.CreateItem(0)
mail.SentOnBehalfOfName = 'xiaojing.zhou@azenta.com' #选择发送邮箱
mail.To = '46268330@qq.com' #收件人
mail.CC = '1987874878@qq.com' #抄送人
mail.Bcc = '1546268330@qq.com' #密抄收件人
mail.Subject = '测试邮件主题' #邮件主题
mail.Body = '这是一封测试邮件正文' #邮件正文
mail.BodyFormat = 2 # 2表示使用Html format,可以调整格式等
mail.Importance = 2 #设置重要性为高
mail.Attachments.Add(r'C:\1.jpg') #添加附件1
mail.Attachments.Add(r'C:\2.jpg') #添加附件2
mail.HTMLBody = '''请注意
这是一封测试邮件并且没有附件
'''
mail.HtmlBody = "" #在htmlbody里面调用这个图片,就可以进入到正文里面了.
mail.Display() #显示发送邮件界面
mail.Send() #发送