pythonaddin
㈠ arcGIS 插件(add-in)开发的书,有哪本比较好
http://resources.arcgis.com/en/help/arcobjects-net/conceptualhelp/#/Developing_with_ArcGIS/0001000001ww000000/
arcgis的帮助文档是行业的典范,你如果使用c#开发addin 就看这个,我当初就是看的这个。如果使用python或者java直接返回上一级去找就是。不过是英文的。
㈡ xlwingsapi要如何导入
xlwingsapi要如何导入
起初我发现python的flask模块结合excel函数WEBSERVICE,ENCODEURL可以实现在excel中调用python实现一些功能,比如md5,sha1加密,后来发现python可以直接用xlrd/xlwt这类模块操作excel,但xlrd/xlwt连xlsx都不支持,便转到了openpyxl,openpyxl的缺点是不能在文件打开状态写入,不好调试,文件被写坏了都不知道。于是选择了xlwings这个可以“代替VB成为Excel后台”的插件,个人认为差强人意,最大的缺点是官方文档很多说的并不清楚
xlwings中文文档
插件安装:
xlwings安装使用
安装python
cmd:pip install xlwings
cmd:xlwings addin install
重启excel可以在功能区看到xlwings一栏如图
在这里插入图片描述
建议是用cmd安装,用户文件夹名必须是英文不然xlwings addin install会报错
ps:我安装插件就花了一天,就因为上面这个。xlwings addin install一直失败,网络搜索无果,(中途直接在github里下载插件,虽然插件导入成功,但导入函数会有关于pywin32报错,这是我推荐cmd命令安装的原因)查看报错文件里代码才定位问题,寻法修改为英文,不成,最后还是创建了一个英文账户(无奈~)
如果一切顺利(希望如此) 基本上按照xlwings:操作Excel,通过宏调用Pyhton(VBA调Python)[@author qcyfred]一文所述就可以调用python来操作excel啦,
记录我所遇到的坑:
RunPython ("from xw import say_hi; say_hi()")
1
1
!!!这我是在其评论区发现的(感谢@longnershot):vba中这段代码里的xw是python文件名,要多加注意
解析json的python代码
主要用到递归思想:
# -*- coding: utf-8 -*-
import
import itertools
import json
import urllib.request
import xlwings as xw
import json
from openpyxl.utils import get_column_letter
def pyFunc():
resp = urllib.request.urlopen(
"https://api.bilibili.com/x/v2/reply?pn=2&type=1&oid=455803935&sort=2")
pending_data = json.loads(resp.read())["data"]["replies"]
def getkey(data):
def get_tree_list(data, lst,tr_lsts):
for idx, item in enumerate(data) if isinstance(data, list) else data.items():
_lst = .deep(lst)
_lst.append(idx)
if (isinstance(item, dict) and item.keys()) or (isinstance(item, list) and len(item) > 0):
get_tree_list(item, _lst, tr_lsts)
else:
tr_lsts.append(_lst)
lst = []
tr_lsts = []
get_tree_list(data, lst, tr_lsts)
return tr_lsts
tl = []
for i in pending_data:
keys = getkey(i)
for j in keys:
jlen = len(j)
if len(list(filter(lambda x: len(x) >= jlen and x[:jlen] == j, tl))) == 0:
for m in range(jlen):
if j[0:m] in tl:
tl.remove(j[0:m])
tl.append(j)
tl.sort()
wb = xw.Book.caller()
sht = wb.sheets[0]
def get_tree_dict(ptl, ptree, pdlen,pcol, prow):
dst =[list(g) for k,g in itertools.groupby(ptl,lambda x:x[pdlen])]
ctree = ptree["child"] = {}
mlen = max(list(map(lambda x: len(x), ptl)))
st=pcol
cdlen = pdlen+1
for ctl in dst:
title = ctl[0][pdlen]
ctd = ctree[title] = {}
cmlen = max(list(map(lambda x: len(x), ctl)))
ccol=st
nst=st+len(ctl)
crow =prow+mlen-cmlen+1
ctd["start"] = get_column_letter(ccol)
ctd["end"] = get_column_letter(nst-1)
rg = sht.range(ctd["start"]+str(prow) +
":"+ctd["end"]+str(crow-1))
rg.merge()
rg.value = title
if cmlen >cdlen:
get_tree_dict(ctl, ctd, cdlen,ccol, crow)
st +=len(ctl)
ptree = {}
get_tree_dict(tl, ptree, 0, 1, 1)
def insertData(cdata, _ptree, xs):
for idx, item in enumerate(cdata) if isinstance(cdata, list) else cdata.items():
_ctree=_ptree["child"][idx]
if (isinstance(item, dict) and item.keys()) or (isinstance(item, list) and len(item) > 0):
insertData(item, _ctree,xs)
else:
ys=_ctree["start"]
ye=_ctree["end"]
rg = sht.range(ys+str(xs) +
':'+ye+str(xs))
rg.merge()
rg.value = str(item)
# if isinstance(item, str):
# rg.api.Font.Color = 0x0000FF #b/g/r
# elif isinstance(item, int):
# rg.api.Font.Color = 0xFF0000
# else:
# rg.api.Font.Color = 0x00FF00
tlmlen=max(list(map(lambda x: len(x),tl)))
for i,v in enumerate(pending_data):
insertData(v, ptree,
其中pending_data即为待处理的json,是一个dict列表[{},{},....]
wb = xw.Book.caller() sht = wb.sheets[0] 按照个人需要修改sht 如sht=wb.active等等
修改for idx, item in enumerate(cdata) if isinstance(cdata, list) else cdata.items()以及(isinstance(item, dict) and item.keys()) or (isinstance(item, list) and len(item) > 0)可以只对dict类型解析,list则直接转str
调用range api,必须用字符串表示区间:range(“A1:D5”)有效,相对本与之等价的range((1,1),(5,4))无效,openpy.utils中的get_column_letter可以实现列数字转列字符串
# if isinstance(item, str):
# rg.api.Font.Color = 0x0000FF #b/g/r
# elif isinstance(item, int):
# rg.api.Font.Color = 0xFF0000
# else:
# rg.api.Font.Color = 0x00FF00
1
2
3
4
5
6
1
2
3
4
5
6
尾述
㈢ 用python操作excel数据之避坑秘技
用python操作excel表里的数据非常方便,可以把不同报表,不同类型的数据各种干坤大挪移,汇集到一起进行展示。但初学者可能会遇到一些大坑,百思不得其解,而不得不放弃这个神器。现把我在自学过程中遇到的一些坑与大家分享,给初学者参考,欢迎批评指正!
坑一:用pandas的to_excel写入EXCEL时,会把原数据清空。
解决方案:先用openpyxl的load_workbook打开工作薄,再用pandas的ExcelWriter新建写入器,把之前打开的工作薄赋值给写入器的工作薄。
坑二:把带有公式的sheet1数据导入再写入sheet2时,会发现带公式的数据全部为空。
解决方案:可用win32com.client中的Dispatch把EXCEL表打开再保存。
坑三:当把复制文件,新建文件,打开保存文件,数据写入都写在一个程序时,往往由于EXCEL打开保存时间较长而与后续程序冲突报错。
解决方案:每个环节建模块顺序执行,各环节间用time.sleep隔开。
㈣ arcgis Python加载项鼠标事件
arcgisPython加载项鼠标事件如下
加载项提供了一种向最终用户分发自定义用户界面的简便方式。不需要安装程序。只要将一个扩展名为.esriaddin的压缩文件复制到一个已知文件夹中,其他工作交给ArcGIS来处理。为了能够进一步简化开发过程,ESRI还提供了一个Python加载项向导。你可以从Esri官网下载安装向导。这也是本章要介绍的第一个案例。
我们还可以创建多个类型的加载项。按钮和工具是最为简单的加载项。点击按钮来执行业务逻辑操作。工具与按钮非常相似,不过工具需要先与地图窗口进行交互后再执行业务逻辑操作。组合框则提供了选项列表让用户进行选择。
㈤ Visual Studio 2013 网页安装卡住
我今天也遇到了同样的问题,官方的说法是可能是因为需要检查系统最新的更新是不是都安装了的关系...可是我已经等了1个小时了...
更新,现在装好了,根据安装日志,就这一项大概装了1小时15分钟,这一个KB包含了59项更新
包含以下内容:
WinBlue_AppCertKitx64Patch,WinBlue_SDKStoreDXRem,WinBlue_SDKDXRem,WinBlue_SDKStore,WinBlue_SDK,PythonToolsTemplate_DevEnv,AppInsights,VS核心更新,TypeScript,TypeScript_SDK,CoreCon,WindowsPhone81SDK,WindowsPhone81SDK,PhoneAddon_SharedCore,PhoneAddon_SharedCoreRes,PhoneAddon_ProfessionalCore,PhoneAddon_ProfessionalCoreRes,MemoryProfiler_CORE,MemoryProfilerRes,BehaviorsXamlPhoneSDK,MobileTools_AddInCore,VC编译器核心D11,VC库核心D11,VC运行时调试D11,VS2012UnitTestsdk,MobileTools_AddInCoreres,VS2012UnitTestsdk_res,vc_compilerCoreResD11,,WP81XamlAdSDK,Preparation_InstallAdvertised,Preparation,EmulatorWP81BundleExeCache,sqldom_Sql2014,TSqlLanguageService_Sql2014,SSDTDBSvcExternals_Sql2014,sqllocaldb_Sql2014,sqlsysclrtypes_Sql2014,sharedmanagementobjects_Sql2014
项目众多,我就不一一翻译了,相信作为开发者的你基本上也看得懂
㈥ sparksql缓存表能做广播变量吗
共享变量
通常情况下,当向Spark操作(如map,rece)传递一个函数时,它会在一个远程集群节点上执行,它会使用函数中所有变量的副本。这些变量被复制到所有的机器上,远程机器上并没有被更新的变量会向驱动程序回传。在任务之间使用通用的,支持读写的共享变量是低效的。尽管如此,Spark提供了两种有限类型的共享变量,广播变量和累加器。
广播变量
广播变量允许程序员将一个只读的变量缓存在每台机器上,而不用在任务之间传递变量。广播变量可被用于有效地给每个节点一个大输入数据集的副本。Spark还尝试使用高效地广播算法来分发变量,进而减少通信的开销。
Spark的动作通过一系列的步骤执行,这些步骤由分布式的洗牌操作分开。Spark自动地广播每个步骤每个任务需要的通用数据。这些广播数据被序列化地缓存,在运行任务之前被反序列化出来。这意味着当我们需要在多个阶段的任务之间使用相同的数据,或者以反序列化形式缓存数据是十分重要的时候,显式地创建广播变量才有用。
通过在一个变量v上调用SparkContext.broadcast(v)可以创建广播变量。广播变量是围绕着v的封装,可以通过value方法访问这个变量。举例如下:
scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))
broadcastVar: org.apache.spark.broadcast.Broadcast[Array[Int]] = Broadcast(0)
scala> broadcastVar.value
res0: Array[Int] = Array(1, 2, 3)
在创建了广播变量之后,在集群上的所有函数中应该使用它来替代使用v.这样v就不会不止一次地在节点之间传输了。另外,为了确保所有的节点获得相同的变量,对象v在被广播之后就不应该再修改。
累加器
累加器是仅仅被相关操作累加的变量,因此可以在并行中被有效地支持。它可以被用来实现计数器和总和。Spark原生地只支持数字类型的累加器,编程者可以添加新类型的支持。如果创建累加器时指定了名字,可以在Spark的UI界面看到。这有利于理解每个执行阶段的进程。(对于python还不支持)
累加器通过对一个初始化了的变量v调用SparkContext.accumulator(v)来创建。在集群上运行的任务可以通过add或者"+="方法在累加器上进行累加操作。但是,它们不能读取它的值。只有驱动程序能够读取它的值,通过累加器的value方法。
下面的代码展示了如何把一个数组中的所有元素累加到累加器上:
scala> val accum = sc.accumulator(0, "My Accumulator")
accum: spark.Accumulator[Int] = 0
scala> sc.parallelize(Array(1, 2, 3, 4)).foreach(x => accum += x)
...
10/09/29 18:41:08 INFO SparkContext: Tasks finished in 0.317106 s
scala> accum.value
res2: Int = 10
尽管上面的例子使用了内置支持的累加器类型Int,但是开发人员也可以通过继承AccumulatorParam类来创建它们自己的累加器类型。AccumulatorParam接口有两个方法:
zero方法为你的类型提供一个0值。
addInPlace方法将两个值相加。
假设我们有一个代表数学vector的Vector类。我们可以向下面这样实现:
object VectorAccumulatorParam extends AccumulatorParam[Vector] {
def zero(initialValue: Vector): Vector = {
Vector.zeros(initialValue.size)
}
def addInPlace(v1: Vector, v2: Vector): Vector = {
v1 += v2
}
}
// Then, create an Accumulator of this type:
val vecAccum = sc.accumulator(new Vector(...))(VectorAccumulatorParam)
在Scala里,Spark提供更通用的累加接口来累加数据,尽管结果的类型和累加的数据类型可能不一致(例如,通过收集在一起的元素来创建一个列表)。同时,SparkContext..accumulableCollection方法来累加通用的Scala的集合类型。
累加器仅仅在动作操作内部被更新,Spark保证每个任务在累加器上的更新操作只被执行一次,也就是说,重启任务也不会更新。在转换操作中,用户必须意识到每个任务对累加器的更新操作可能被不只一次执行,如果重新执行了任务和作业的阶段。
累加器并没有改变Spark的惰性求值模型。如果它们被RDD上的操作更新,它们的值只有当RDD因为动作操作被计算时才被更新。因此,当执行一个惰性的转换操作,比如map时,不能保证对累加器值的更新被实际执行了。下面的代码片段演示了此特性:
val accum = sc.accumulator(0)
data.map { x => accum += x; f(x) }
//在这里,accum的值仍然是0,因为没有动作操作引起map被实际的计算.
㈦ 云崽如何删除插件
方法一:使用质感文件进入插件目录Yunzai-Bot/plugins中手动进行删除对应插件文件夹,可能会出现无法删除文件夹情况,这时请退出termux运行或使用方法二。
方法二:在termux中的云崽目录下输入rm-rf?plugins/xxx,此处xxx为插件文件夹的名称,如miao-plugin与python-plugin,即为rm-rfplugins/miao-plugin与rm-rfplugins/python-plugin。
插件(Plug-in,又称addin、add-in、addon或add-on,又译外挂)是一种遵循一定规范的应用程序接口编写出来的程序。
㈧ plugin是什么文件夹
Plugin(Plug-in,addin,add-in,addon或add-on)是一种计算机应用程序,它和主应用程序(host application)互相交互,以提供特定的功能.可以说是一种插件。如果你在某个程序的文件夹下发现Plugin文件夹,那么应该是这个程序的插件。
㈨ QT应用程序怎么使用 plugin
Plugin(Plug-in,addin,add-in,addon或add-on)是一种计算机应用程序,它和主应用程序(host application)互相交互,以提供特定的功能。应用程序支持Plugin有许多原因,一些主要原因包括:使得第三方开发者有能力扩展应用程序,以提供无法先期预料的特色;减小应用程序的大小;由于软件版权之间的不兼容性将源代码和应用程序分享。
Plugin 通常译作插件,下文中以插件代替Plugin。
支持插件的软件例如有:
Email客户端 使用插件对email编码、解码
图像软件 使用插件对文件格式进行支持和处理图像(Adobe Photoshop,AcdSee)
媒体播放器 使用插件支持文件格式和应用过滤器(foobar2000,GStreamer,Quintessential,VST,Winamp,XMMS,WindowsMediaPlayer)
包嗅探器 使用插件对包的格式进行解码 (OmniPeek)
遥感应用 使用插件处理不同类型传感器的数据(Opticks)
软件开发环境 使用插件支持不同的编程语言(Eclipse,NetBeans,jEdit,MonoDevelop)
Web浏览器 使用插件播放视频和媒体格式(Flash,QuickTime)
blog应用平台 使用插件增强blog功能(WordPress,LightPress,MovableType,Z-Blog)
blog终端 使用插件增加blog编辑功能(Windows Live Writer)
文件编辑器 使用插件提供特定的文本编辑能力(Emeditor,Notepad++)
编译任务管理软件 使用插件提供第三方语言支持或编译任务支持(Ant)
企业Web应用平台 使用插件针对不同业务进行处理(Struts)
Plugin 架构
plugin 下包含有c++和jsp语法两种语言分类
C++
FxEngine Framework - 一个数据流处理框架
Qt PlugIns - TrollTech的 Qt 框架的一部分
Delphi
TMS Plugin Framework
Java
Java Plug-in Framework (JPF),一种由Eclipse的插件机制而改写的架构
RCP,由Eclipse发展而来的技术平台,应用程序可以以插件方式编写,应用程序本身也可以拥有插件
Python
Setuptools
The Twisted Plugin System
Sprinkles
Python plugin system
.NET
AL Platform
Mono Addins - .Net和Mono的一个addin框架
Code Project 基于.NET的插件框架
Active Visic
Active Visic