pandas
读写{
读取 xlsx文件失败,换别的引擎
df=pandas.read_excel(‘data.xlsx’,engine=‘openpyxl’)
多Sheet写入。
{
writer = pd.ExcelWriter("fileName.xlsx")
df1.to_excel(writer,sheet_name = "...")
df2.to_excel(writer,sheet_name = "...")
writer.save()
writer.close()
}
非常规xlsx写入 (存在特殊符号)
df.to_excel(writer, sheet_name="DutyRectDataSheet", engine='xlsxwriter')
}
获取变量名方法:
{
字典化:
abc = 376 variable_name = list(dict(abc=abc).keys())[0]
}
导入数据
{
pd.read_csv(filename)
pd.read_table(filename)
pd.read_excel(filename)
pd.read_sql(filename)
pd.read_json(filename)
pd.read_html(filename)
pd.read_clipboard(filename)
pd.DataFrame(filename)
}
导出数据
{
df.to_csv(filename)
df.to_excel(filename)
df.to_sql(filename)
df.to_json(filename)
}
查看数据
{
df.head(n) 查看DataFrame前n行
df.tail(n) 查看最后n行
df.loc(n) 查看第n行的数据
b = df.loc(n) 特定行
b.axes -> 对应的每列标签。
b.axes[0][i] -> 对应的具体标签
df.loc[:,[a,b]] 看a,b列
df.iloc[0] 看行
df.loc[0] 看行
}
数据操作
{
数据去重
根据某列数据重复来去重行
df.drop_duplicates(subset = [‘A’,‘B’],keep = ‘first’,inplace = False).reset_index()
inplace = False 生成新表 True 则在原数据上操作
reset_index() 剔除无效行
}
添加数据
{
df[“New Col”] = [Fun(i) for i in Resources]
}
筛选
{
条件筛选 df[(df[‘quantity’] > 20) | (df[‘单价’] > 100)]
特定条件筛选 df[df[‘单价’].isin[20.98,30.98]]
多值筛选 df[df["A"].isin(Arr)]
分类
type = df.groupby("A")
模糊筛选 str.contains() 正则匹配 切片
province = pd.DataFrame(['广东', '广西', '福建', '福建省'], columns=['省份'])
province[province["省份"].str.contains("福")]#筛选出带广的省份数据
函数筛选 : df[df["A"].map(lambda x:x>5)]
data[data["data"].map(lambda x:fun(x))] #fun为预定义函数
重复值筛选 :
}
坑:
{
1. val in df[“索引”] : 就算val在df[“索引”]也会报False
正确使用方法: val in df[“索引”].values
}
Collections 库
import collections as cls
-
Counter : 计算字符串每个字符的个数并输出字典类型
ans = cls.counter(“asf8y1241123123”)ans.elements() ---> 包含所有counter的迭代器 ans.most_common(n) -> 最多的n个字符
-
defaultdict
def default_dic():
return “default_value”dic = cls.defaultdict(default_dic,"a" = 123) #设置不存在的键的默认值
-
Deque 双端队列
deque = cls.deque(“”)
#右端插入
deque.extend(“abcde”)
deque.append(“f”)#左端插入
deque.extendleft(“ddd”)
deque.appendleft(“c”)#删除
deque.pop()
deque.popleft()队列旋转
deque.rotate(2) #所有数据右移两位,越位重置
deque.rotate(-2) -
namedtuple #带名称的tuple
Persion = cls.namedtuple(“Person”,“name age gender”)
bob = Person(name = “Bob”, age = 30, gender = “male”)
-
OrderedDict #有顺序的字典
requesets 库
import requesets
import json
1. 访问url获取资源
url = "http://insight.sf-express.com/topt/api/monitor_cover/indicator_card"
headers = {"Content-Type" : "application/json"} #headers,反爬虫编码
TraditionalData = json.dumps({"date_type":"week","start_time":start_time,"end_time":end_time,"type":"传统资源监控"})
CloudData = json.dumps({"date_type":"week","start_time":start_time,"end_time":end_time,"type":"云资源监控"})
response1 = requests.post(url,TraditionalData,headers = headers)
time.sleep(0.3)
response2 = requests.post(url,CloudData,headers = headers)
获取cookies:
import os
import sqlite3
from win32.win32crypt import CryptUnprotectData
selenium库
需要安装浏览器以及对应驱动
from selenium import webdriver
wb = webdriver.Chrome(r"D:\pySelenium\chromedriver.exe")
wb.get("http://itsm-his.sf-express.com/balantflow/module/balantreport/report/showReport.do?id=483")
#可能要扫码
input1 = wb.find_element_by_name("createDateStart")
input2 = wb.find_element_by_name("createDateEnd")
input1.send_keys("2021-07-08") #输入想要开始的时间
input2.send_keys("2021-07-21") #输入想要的结束时间
sosuoButton = wb.find_element_by_id("btnSubmit") #单机搜索
exportBtn = wb.find_element_by_class_name("btnExport") #到处excel的按钮,一开始看不到
downBtn = wb.find_element_by_class_name("caret") #下拉按钮
#先按下拉按钮---> 再按导出按钮
downBtn.click()
exportBtn.click()
文件下载成功。
设置文件下载路径
{
prefs = {"download.default_directory":"路径位置"}
prefs = webdriver.ChromeOption()
option.add_experimental_option("prefs",prefs)
wb = webdriver.Chrome(...)
}
Web 自动化
pip install selenium
download chromedriver:http://chromedriver.storage.googleapis.com/index.html
https://www.cnblogs.com/lfri/p/10542797.html
自动化程序 --> 浏览器驱动 —> 浏览器
浏览器驱动和浏览器需要配套
-
打开网址
{
from selenium import webdriver as web
wb = web.Chrome(r’D:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe’) #驱动地址wb.get(“https://baidu.com”)。
//跳转到百度
}
2.选择元素
{
#通过id找
element = wb.find_element_by_id(“kw”)
//百度的输入框
element = wb.find_element_by_id("su")
//"百度一下" 按钮
#根据class找
element = wb.find_elements_by_class("animal")
find_elements_by_class: 找不到返回空列表
#根据标签找
wb.find_elements_by_tag_name("span")
#通过webelement查找。
通过webelement查找找到的是该元素内部的
element = wb.find_element_by_id("kw")
element1 = element.find_elements_by_tag_name("span")
}
3.连接等待
{
#隐式等待。若没找到元素,等待半秒钟。
#直到达到超时时间10s
wb = web.Chrome(r’D:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe’) #驱动地址
wb.implicitly_wait(10)
取代time.sleep(..)
}
4.操控元素
{
获取属性
element.find_element_by_id("1")
获取某一个class的属性值srcid
element.get_attribute("srcid")
获取整个元素对应的HTML
element.get_attribute("outerHTML")
获取某个元素内部的HTML文本
element.get_attribute("innerHTML")
}
5.css表达式
{
selenium在4.0以后,废除了find_element_by_xxx的方法,替代方法如下
{
from selenium.webdriver.common.by import By
input2= wb.find_elements(By.CSS_SELECTOR,‘(CSS表达式)’)
}
1.# .className 根据class来找
wb.find_element_by_css_selector('.plant')
2.# tag 根据tag来找
wb.find_element_by_css_selector('span')
3.# #id 根据id来找
wb.find_element_by_css_selector('#1')
4.# 元素1>元素2 子元素
wb.find_element_by_css_selector('#ok >.plant')
查找到id为ok子元素的 class为plant的元素
5.# 元素1 元素2 (空格隔开) 后代元素
wb.find_element_by_css_selector('#ok .plant')
查找到id为ok后代元素的 class为plant的元素
6.#通用属性选择使用[]
# [herf = .. ]
wb.find_element_by_css_selector("[herf = "http://www.miitbeian.goc.cn"]")
# 找到herf属性的
wb.find_elements_by_css_selector("[herf]")
css Selector
在浏览器中按F12开启
7.#选中ul标签-className为yw-list 并且bosszone ="antip_1"的元素
ul.yw-list[bosszone ="antip_1"]
8.#使用 , 来表示分别选中
#选中所有className = "plant" 或 className = "animal"
.plant,.animal
9.#根据次序选择 :nth-child(2) nth-last-child(2)
#选择第二个后代节点li
.nav-mod li:nth-child(2)
#选择倒数第二个后代节点li
.nav-mod li:nth-last-child(2)
#第二个类型为span的元素
span:nth-of-type(2)
#奇数,偶数节点 nth-child(odd) nth-child(even)
10. #根据连接(兄弟关系)关系: h3 + span (同级)
h3+span #得到在h3后面的span元素
h3 ~ span #h3后面所有的span
}
6.frame 切换
{
iframe frame
内部可以包含一个html文档。
切换到frame/iframe中:
wb.switch_to.frame('frame') #内部可以嵌套cssSelector
#切换到外层
wb.switch_to.default_content()
切换到新的窗口
wb.switch_to.window(handle)
handle: wb.window_handles列表中有
exp
{
for handle in wb.window_handles:
wb.switch_to.window(handle):
if "Bing" in wb.title:
break
}
}
pyWin32 库
模拟Windows操作软件
#https://www.jb51.net/article/165080.htm
import win32api as api32
import win32gui as gui32
1.打开软件或文件:
{
32api.
ShellExecutewin32api.ShellExecute
(1,‘open’,
r’D:\work\month-9\date21-9-27\系统健康性.pdf’,
‘’,‘’,1)
{
win32api.ShellExecute()的参数主要包括:
HWND:指定父窗口句柄
Operation:指定动作, 譬如"edit",“explore”,“open”,“find”,“print”,“NULL”
FileName:指定要打开的文件或程序
Parameters:指定打开程序所需参数
Directory:缺省目录
ShowCmd:打开选项,可选值:
SW_HIDE = 0; {隐藏窗口,活动状态给令一个窗口}
SW_SHOWNORMAL = 1; {用最近的大小和位置显示窗口, 同时令其进入活动状态}
SW_NORMAL = 1; {用当前的大小和位置显示一个窗口,不改变活动窗口}
SW_SHOWMINIMIZED = 2; {最小化窗口,并将其激活}
SW_SHOWMAXIMIZED = 3; {最大化窗口,并将其激活}
SW_MAXIMIZE = 3; {同 SW_SHOWMAXIMIZED}
SW_SHOWNOACTIVATE = 4; {用最近的大小和位置显示一个窗口,不改变活动窗口}
SW_SHOW = 5; {用当前的大小和位置显示一个窗口,令其进入活动状态}
SW_MINIMIZE = 6; {最小化窗口, 不激活}
SW_SHOWMINNOACTIVE = 7; {同 SW_MINIMIZE}
SW_SHOWNA = 8; {用当前的大小和位置显示一个窗口,不改变活动窗口}
SW_RESTORE = 9; {同 SW_SHOWNORMAL}
SW_SHOWDEFAULT = 10; {同 SW_SHOWNORMAL}
SW_MAX = 10; {同 SW_SHOWNORMAL}
执行成功会返回应用程序句柄, 如果返回值 <= 32,则表示执行错误。返回值可能的错误有:
0—— {内存不足}
2—— {文件名错误}
3—— {路径名错误}
11—— {EXE 文件无效}
26—— {发生共享错误}
27—— {文件名不完全或无效}
28—— {超时}
29—— {DDE 事务失败}
30—— {正在处理其他 DDE 事务而不能完成该 DDE 事务}
31—— {没有相关联的应用程序}
}
}
2.查找窗体的句柄
para_handle = gui32.FindWindow(None,“窗口名”)
{
win32gui.FindWindow()的参数主要包括 (lpClassName=None, lpWindowName=None):
lpClassName:字符型,窗体的类名,可以在Spy++里找到
lpWindowName:字符型,窗口名,也就是标题栏上能看见的那个标题。
}
3、查找句柄的类名和标题
title = gui32.GetWindowText(66862)
classname = win32gui.GetClssName(66862)
#这样就可以得到程序的进程类名了
windows handler : 66862
title : '丰声'
classname : 'Chrome_WidgetWin_1'
-
调用win32gui.EnumWindows()枚举所有窗口句柄
hWndList = []
win32gui.EnumWindows(lambda hWnd,param.append(hWnd),hWndList)
#hWndList 当前所有窗口的句柄列表 -
将指定窗体设置为最顶层并激活该窗口
?? 无效
win32gui.SetForegroundWindow(para_hld) -
模拟键盘输入
win32api.keybd_event(bVk, bScan, dwFlags, dwExtraInfo)bVk:虚拟键码(键盘键码对照表见附录);
bScan:硬件扫描码,一般设置为0即可;
dwFlags:函数操作的一个标志位,如果值为KEYEVENTF_EXTENDEDKEY则该键被按下,也可设置为0即可,如果值为KEYEVENTF_KEYUP则该按键被释放;
dwExtraInfo:定义与击键相关的附加的32位值,一般设置为0即可。 -
模拟鼠标输入
win32api.GetCursorPos() --》 #获取当前鼠标位置坐标#参数 tuple(x,y)
win32api.SetCursorPos((100, 100)) --》 #将鼠标移到制定位置pip install pymouse
pip install pykeyboard
模拟键盘鼠标–>PyUser库
from pymouse import PyMouse
from pykeyboard import PyKeyboard