关于python:如何判断深度学习推理是不是真的跑在显卡上了

seo 优化: 如何判断深度学习推理是不是真的跑在显卡上了如何判断 pytorch 跑在 cpu 还是在 GPU如何判断以后程序 运行在 cpu 还是在 GPU英伟达显卡如何判断程序是否运行的显卡上nvidia-smi 判断程序是否运行的显卡上如何判断显卡是不是真的被应用了此办法针对英伟达显卡,应用 nvidia-smi 命令 办法一:看 GPU 利用率这个参数办法二:看上面的 processes 列表 从这个截图能够看出,以后有两个 python 过程在应用 GPU

February 15, 2023 · 1 min · jiezi

关于python:oeasypython0083十进制数如何存入计算机八卦纪事BCD编码BinaryCodedDecimal

编码进化回顾上次内容上次 钻研了 视频终端的 演变 从VT05 到 VT100从 黑底绿字 到 RGB 24位真彩色造成了 VT100选项从而 将色彩 数字化 了 生存中咱们更罕用 10个数字 然而 计算机中 用二进制日常计数的十进制数 是如何存储进计算机的呢?从10进制到2进制日常生活中 为什么用10进制? 是因为 人的生理构造 计算机中 应用2进制 是因为 计算机的生理构造 电灯、开关等电器 有两种状态先回顾一下 之前编码的 历史编码编码是 绞丝旁的 能够追溯 到有 文字之前 结绳 为约 事大 大结其绳事小 小结其绳上古 结绳而治 后世圣人 易之以书契八卦事 都往绳子上 系 记住数字 到底是几在绳子上 系住了 这事件就算是 记住了留下了 纪录 当前把绳子 挂进去 进行 比拟、判断这就是 卦经典的卦 三个 地位能够示意 八种状态事件 都在这八种模式下广泛分割变幻无穷这就是八卦古代数字 如何编码 呢?编码格局 演变最早电报时代 数字编码 是 摩斯电码 右下角 是数字的 编码长短空 ...

February 14, 2023 · 2 min · jiezi

关于python:oeasypython0082VT100演化颜色设置VT选项基础色高亮色索引色RGB总结

更多色彩回顾上次内容上次 理解了管制序列 背地的故事 所有规范 都是 从无到有 的就连 负责规范的组织 也是 从无到有 的 VT-05 奠定了 根底色彩 黑底 绿字隔行 扫描但 多色彩设置 是如何呈现 的呢??控制字符1974年 产品 从VT05 进化到VT50控制字符 层出不穷 管制序列 中 ABCDH 被留了下来其余的 控制字符 被更新VT521975年 DEC 公布了 VT52 80*24 成为 经典屏幕字符分辨率VT1001978年 80*24 经典比例 被连续 而且 成为 可拆散的!!!结构VT100 依然是 一台终端机 VT100 只是负责 输入输出 计算量和数据 还是 在主机那里这款机器 设计得 十分奇妙可拆散的 设计在过后 是十分人性化的设计 圆角 设计 过后 都是亮点视频 终端机 开始应用 通用芯片芯片用的是 intel的8080 某种程度 也预示着 intel的 崛起 尺寸 不大 过后 被称为 智能终端 ...

February 13, 2023 · 1 min · jiezi

关于python:Python-发展趋势与-Rust-深度融合更易于编写-Web-应用

大家好,我是猫哥,好久不见!2022 年末的时候,我不可避免地阳了,借着身材不难受就停更了,接踵而至的是除夕和春节假期,又给本人放了假,连年终总结也鸽了,一懈怠就到了 2 月中旬…… 当初是我家娃出世的第三个月,全家人大部分的工夫和精力都在他身上,后果是幸福与疲累共存。新生儿是那么的可恶,又是那么的“吵闹”,影响着咱们的情绪和生活节奏。这三个月的基调跟过来的日子齐全不同,它是新一年的开始,是将来日子的底色,疏导着咱们的生存重心偏移。 在过来的两年工夫里,我工作上的工作与 Python 根本无关了,转向了 Java 的营垒。然而,在业余时间里,我对 Python 的激情始终不灭(只管有退减),直到近期,懒怠的念头变多了。 身心状态与家庭节奏是这段时间停更的次要起因吧。 往年的这第一篇文章,就当作给大家问声好,给本人打个气吧。唯愿 2023 年,家庭、工作与趣味都能顺顺利利,不留遗憾,置信后方有美妙的将来! 最近的 Pycoder‘s Weekly 中有一篇《Three Python trends in 2023》,它介绍了当下较为热门的三个话题。我简略翻译/摘录进去,分享给大家。 趋势一:PythonRustRust 对 Python 技术生态的影响越来越大了。要害的赋能者是 PyO3,它为 Python 提供了 Rust 绑定。有了 PyO3 后,Python 能够轻松调用 Rust 代码,同时 Rust 也能执行 Python 代码。 另外,上面的工具在进一步加深这两门语言的友情: pydantic-core:pydantic v2 的校验外围。pydantic 的作者 Samuel Colvin 将在 Pycon 2023 上发表相干演讲。ruff:速度极快的 linter。它领有简直与 Flake8 雷同的性能,包含一些风行的插件。此外,它具备与 autoflake、isort、pydocstyle 和 pyupgrade 等工具雷同的性能。因而,它基本上是检测 Python 代码的瑞士军刀。polars:更快的 DataFrames,是超级宽泛应用的 pandas 的性能竞争对手。Robyn:带 Rust 运行时的异步 Python web 框架。这有一篇博客对于《Robyn 的 2023 年路线图》。Rust 目前的热度极高,将来它将融入到更多 Python 相干的我的项目和工具中。Python + Rust 的组合在将来的待业市场上,也可能有很高的需要。 ...

February 12, 2023 · 1 min · jiezi

关于python:Python-选列表-list-还是元组-tuple-的思考

list 和 tuple 最大的区别就是:前者是可变对象、后者是不可变对象 以及可变、不可变带来的内存区别:list 为了扩容,会多申请一些内存,所以 list 的内存应用也会比 tuple 多。(tuple 是用多少申请多少) 除了下面人尽皆知的区别,还有一个区别:typing hint 当初写 python 代码如果还不加 typing hint 的话,就太过分了! 先说论断 如果元素的 type 都是一样的,就用 list如果元素的 type 是不一样的,就用 tuple

February 12, 2023 · 1 min · jiezi

关于python:2023最新Python阅读书籍推荐

a byte of python(中文:扼要 Python 教程) 入门的书很多,但能让老手轻松看懂的就少了,作者写的思路十分清晰,对每一个知识点解说的很到位,不多不少,对初学者来说,力道刚刚好。这本书是Python入门最好的书。《A byte-of-python》就像一把钥匙一样,开启编程世界的大门。而且篇幅也短,适宜零根底小白。 Python编程:从入门到实际(第2版) 《Python编程:从入门到实际(第2版)》是针对所有档次Python读者而作的Python入门书。全书分两局部:第一局部介绍用Python编程所必须理解的基本概念,包含Matplotlib等弱小的Python库和工具,以及列表、字典、if语句、类、文件与异样、代码测试等内容;第二局部将实践付诸实践,解说如何开发三个我的项目,包含简略的2D游戏、利用数据生成交互式的信息图以及创立和定制简略的Web利用,并帮忙读者解决常见编程问题和困惑。第2版进行了全面订正,简化了Python装置流程,新增了f字符串、get()办法等内容,并且在我的项目中应用了Plotly库以及新版本的Django和Bootstrap,等等。 Python王者归来(增强版) 《Python王者归来(增强版)》全书以约 800 个程序实例解说了:残缺的 Python 语法,Python 的输与输入,Python 的数据型态, 列表(list)、元组(tuple)、字典(dict)、汇合(set),函数设计,类别设计,应用零碎与内部模块(module), 设计本人的模块(module),文件压缩与解压缩,程序除错与异样解决,文件读写与目录治理,正则表白 式(Regular Expression)与文字探勘,剪贴簿(clipboard)、Word、PDF 文件解决,Excel、CSV、Json 文 件解决,图表绘制,电子邮件与简讯,鼠标与键盘管制,人脸识别零碎,QR code 制作 晦涩的Python 《晦涩的Python》致力于帮忙Python开发人员开掘这门语言及相干程序库的优良个性,防止重复劳动,同时写出简洁、晦涩、易读、易保护,并且具备纯粹Python格调的代码。本书尤其深入探讨了Python语言的高级用法,涵盖数据结构、Python格调的对象、并行与并发,以及元编程等不同的方面。 本书适宜中高级Python软件开发人员浏览参考。 Python 3面向对象编程(第2版) 《Python 3 面向对象编程(第2版)》Python 是一种面向对象的解释型语言,面向对象是其十分重要的个性。本书通过Python 的数据结构、语法、设计模式,从简略到简单,从高级到高级,一步步通过例子来展现了Python 中面向对象的概念和准则。 本书不是Python 的入门书籍,适宜具备Python 根底教训的开发人员浏览。如果你领有其余面向对象语言的教训,你会更容易了解本书的内容。 深刻了解Python个性 本书致力于帮忙Python开发人员开掘这门语言及相干程序库的优良个性,防止重复劳动,同时写出简洁、晦涩、易读、易保护的代码。用好Python须要理解的最重要的个性、Python 2过渡到Python 3须要把握的古代模式、有其余编程语言背景想疾速上手Python的程序员须要特地留神的问题,等等,本书都能够解决。 Python外围编程(第3版) 《Python外围编程(第3版)》是经典滞销图书《Python外围编程(第二版)》的全新降级版本,总共分为3局部。第1局部为解说了Python的一些通用利用,包含正则表达式、网络编程、Internet客户端编程、多线程编程、GUI编程、数据库编程、Microsoft Office编程、扩大Python等内容。第2局部解说了与Web开发相干的主题,包含Web客户端和服务器、CGI和WSGI相干的Web编程、Django Web框架、云计算、高级Web服务。第3局部则为一个补充/试验章节,包含文本处理以及一些其余内容。 Python高级编程(第2版) 《Python高级编程(第2版)》 基于Python 3.5版本进行解说,通过13章的内容,深度揭示了Python编程的高级技巧。本书从Python语言及其社区的现状开始介绍,对Python语法、命名规定、Python包的编写、部署代码、扩大程序开发、治理代码、文档编写、测试开发、代码优化、并发编程、设计模式等重要话题进行了全面系统化的解说。 本书适宜想要进一步提高本身Python编程技能的读者浏览,也适宜对Python编程感兴趣的读者参考学习。全书联合典型且实用的开发案例,能够帮忙读者创立高性能的、牢靠且可保护的Python利用。 Python高性能编程 《Python高性能编程》共有12章,围绕如何进行代码优化和放慢理论利用的运行速度进行具体解说。本书次要蕴含以下主题:计算机内部结构的背景常识、列表和元组、字典和汇合、迭代器和生成器、矩阵和矢量计算、并发、集群和工作队列等。最初,通过一系列实在案例展示了在利用场景中须要留神的问题。 本书适宜高级和中级Python程序员、有肯定Python语言根底想要失去进阶和进步的读者浏览。 Python性能剖析与优化 对于Python程序员来说,仅仅晓得如何写代码是不够的,还要可能充分利用要害代码的解决能力。本书将探讨如何对Python代码进行性能剖析,找出性能瓶颈,并通过不同的性能优化技术打消瓶颈。 《Python性能剖析与优化》从根本的概念开始,循序渐进地介绍高级的优化主题。首先介绍了Python的支流性能分析器,以及用于帮忙了解性能剖析后果的可视化工具。而后介绍了通用的性能优化办法和专门针对Python的性能优化办法,带你浏览该语言的次要构造,让你只需做一点扭转,即可迅速改善代码的性能。最初介绍了一些专门用于数据处理的程序库,教你如何正确地应用它们以获得最佳性能。

February 11, 2023 · 1 min · jiezi

关于python:oeasypython0081ANSI序列由来终端机VT100DECVT选项终端控制序列

更多色彩回顾上次内容上次 首先理解了RGB色彩设置能够把一些形象的色调名字 落实到具体的 RGB色彩 计算机所做的所有 其实就是量化、编码把生存的所有都进行数字化 规范 是ANSI制订的 这个ANSI 又是 怎么来的 呢??由来ANSI 听起来 是 官网组织其实 是 专业技能人士的 民间组织 ANSI进化过程1918 美国工程规范委员会(AESC) 美国政府的三个部(商务部、陆军部、海军部) 也参加了该委员会的筹备工作美国资料试验协会(ASTM)美国机械工程师协会(ASME)美国矿业与冶金工程师协会(ASMME)美国土木工程师协会(ASCE)美国电气工程师协会(AIEE)等组织 这个 AIEE 就是 IEEE 的前身 IEEE 干什么的来着?很多通信协议都是ieee搞的还有 浮点数规范ascii 也有 ieee 的参加独特成立了美国工程规范委员会(AESC) 工业化很重要的就是可能把规范量化 从钢铁的碳含量到螺丝的螺距甚至篮筐的尺寸1928 AESC 改选为美国规范协会(ASA)1966 美利坚合众国规范学会(USASI)1969 美国国家标准学会(ANSI)ascii 是不是 也经验了 一个历史过程呢?历史没错!!! 所有 都是 工夫的产物 没有什么 是 一下子就成为规范的 规范 首先得 能用得起来而且 也会 一直地倒退是在历史长河中 一段时间内的 产物各种组织 也有各自生灭的 过程就像 esc 从无到有的过程一样esc 来历早年间 没有 esc 键 次要是 电传打字机 作为终端 键盘 输出纸张 输入都在 和主机(MainFrame)交互ASR-331963年 这款神机 问世 ...

February 11, 2023 · 1 min · jiezi

关于python:LyScript-插件实现自定义反汇编

LyScript 插件默认提供了一个get_disasm_code()办法能够间接获取到指定行数的反汇编代码,但如果须要自定义获取或者是须要本人封装一个反汇编办法,则你能够用如下两种形式来失去。 插件地址:https://github.com/lyshark/Ly...第一步间接获取到指定EIP地位的反汇编代码,这段代码能够这样来写。 from LyScript32 import MyDebugif __name__ == "__main__": dbg = MyDebug() conn = dbg.connect() # 获取以后EIP地址 eip = dbg.get_register("eip") print("eip = {}".format(hex(eip))) # 向下反汇编字节数 count = eip + 15 while True: # 每次失去一条反汇编指令 dissasm = dbg.get_disasm_one_code(eip) print("0x{:08x} | {}".format(eip, dissasm)) # 判断是否满足退出条件 if eip >= count: break else: # 失去本条反汇编代码的长度 dis_size = dbg.assemble_code_size(dissasm) eip = eip + dis_size dbg.close() pass输入成果如下。 第二步失去以后EIP机器码,获取到以后EIP指针所在位置的机器码,你能够灵活运用反汇编代码的组合实现。 from LyScript32 import MyDebug# 失去机器码def GetHexCode(dbg,address): ref_bytes = [] # 首先失去反汇编指令,而后失去该指令的长度 asm_len = dbg.assemble_code_size( dbg.get_disasm_one_code(address) ) # 循环失去每个机器码 for index in range(0,asm_len): ref_bytes.append(dbg.read_memory_byte(address)) address = address + 1 return ref_bytesif __name__ == "__main__": dbg = MyDebug() conn = dbg.connect() # 获取以后EIP地址 eip = dbg.get_register("eip") print("eip = {}".format(hex(eip))) # 失去机器码 ref = GetHexCode(dbg,eip) for i in range(0,len(ref)): print("0x{:02x} ".format(ref[i]),end="") dbg.close() pass输入成果如下所示: ...

February 10, 2023 · 2 min · jiezi

关于python:LyScript-寻找ROP漏洞指令片段

ROP绕过片段简略科普一下,你能够了解成一个能够关闭系统本身内存保护的一段机器指令,这段代码须要咱们本人结构,这就波及到在对端内存搜查这样的指令,LyScript插件加强了指令片段的查找性能,但须要咱们在LyScript插件根底上封装一些办法,实现起来也不难。 插件地址:https://github.com/lyshark/Ly...封装机器码获取性能: 首先封装一个办法,当用户传入指定汇编指令的时候,主动的将其转换成对应的机器码,这是为搜寻ROP片段做铺垫的,代码很简略,首先dbg.create_alloc(1024)在过程内存中开拓堆空间,用于寄存咱们的机器码,而后调用dbg.assemble_write_memory(alloc_address,"sub esp,10")将一条汇编指令变成机器码写到对端内存,而后再op = dbg.read_memory_byte(alloc_address + index)顺次将其读取进去即可。 from LyScript32 import MyDebug# 传入汇编指令,获取该指令的机器码def get_assembly_machine_code(dbg,asm): passif __name__ == "__main__": dbg = MyDebug() connect_flag = dbg.connect() print("连贯状态: {}".format(connect_flag)) machine_code_list = [] # 开拓堆空间 alloc_address = dbg.create_alloc(1024) print("调配堆: {}".format(hex(alloc_address))) # 失去汇编机器码 machine_code = dbg.assemble_write_memory(alloc_address,"sub esp,10") if machine_code == False: dbg.delete_alloc(alloc_address) # 失去汇编指令长度 machine_code_size = dbg.assemble_code_size("sub esp,10") if machine_code == False: dbg.delete_alloc(alloc_address) # 读取机器码 for index in range(0,machine_code_size): op = dbg.read_memory_byte(alloc_address + index) machine_code_list.append(op) # 开释堆空间 dbg.delete_alloc(alloc_address) # 输入机器码 print(machine_code_list) dbg.close()咱们持续封装如上办法,封装成一个能够间接应用的get_assembly_machine_code函数。 ...

February 10, 2023 · 2 min · jiezi

关于python:LyScript-获取上或下一条汇编指令

LyScript 插件默认并没有提供上一条与下一条汇编指令的获取性能,当然你能够应用LyScriptTools工具包间接调用内置命令失去,不过这种形式显然在效率上并不现实,咱们须要在LyScript插件API根底上本人封装实现这个性能。 插件地址:https://github.com/lyshark/Ly...获取下一条汇编指令: 下一条汇编指令的获取须要留神如果是被命中的指令则此处应该是CC断点占用一个字节,如果不是则失常获取到以后指令即可。 1.咱们须要查看以后内存断点是否被命中,如果没有命中则阐明此处咱们须要获取到原始的汇编指令长度,而后与以后eip地址相加取得。2.如果命中了断点,则此处有两种状况 1.1 如果是用户下的断点,则此处调试器会在指令地位替换为CC,也就是汇编中的init停机指令,该指令占用1个字节,须要eip+1失去。1.2 如果是零碎断点,EIP所停留的地位,则咱们须要失常获取以后指令地址,此处调试器没有改变汇编指令仅仅只下下了异样断点。from LyScript32 import MyDebug# 获取以后EIP指令的下一条指令def get_disasm_next(dbg,eip): next = 0 # 查看以后内存地址是否被下了绊子 check_breakpoint = dbg.check_breakpoint(eip) # 阐明存在断点,如果存在则这里就是一个字节了 if check_breakpoint == True: # 接着判断以后是否是EIP,如果是EIP则须要应用原来的字节 local_eip = dbg.get_register("eip") # 阐明是EIP并且命中了断点 if local_eip == eip: dis_size = dbg.get_disasm_operand_size(eip) next = eip + dis_size next_asm = dbg.get_disasm_one_code(next) return next_asm else: next = eip + 1 next_asm = dbg.get_disasm_one_code(next) return next_asm return None # 不是则须要获取到原始汇编代码的长度 elif check_breakpoint == False: # 失去以后指令长度 dis_size = dbg.get_disasm_operand_size(eip) next = eip + dis_size next_asm = dbg.get_disasm_one_code(next) return next_asm else: return Noneif __name__ == "__main__": dbg = MyDebug() dbg.connect() eip = dbg.get_register("eip") next = get_disasm_next(dbg,eip) print("下一条指令: {}".format(next)) prev = get_disasm_next(dbg,12391436) print("下一条指令: {}".format(prev)) dbg.close()获取后果如下: ...

February 10, 2023 · 1 min · jiezi

关于python:LyScript-实现对内存堆栈扫描

LyScript插件中提供了三种根本的堆栈操作方法,其中push_stack用于入栈,pop_stack用于出栈,而最有用的是peek_stack函数,该函数可用于查看指定堆栈地位处的内存参数,利用这个个性就能够实现,对堆栈地址的检测,或对堆栈的扫描等。 插件地址:https://github.com/lyshark/Ly...peek_stack命令传入的是堆栈下标地位默认从0开始,并输入一个十进制有符号长整数,首先实现有符号与无符号数之间的转换操作,为后续堆栈扫描做筹备。 from LyScript32 import MyDebug# 有符号整数转无符号数def long_to_ulong(inter,is_64 = False): if is_64 == False: return inter & ((1 << 32) - 1) else: return inter & ((1 << 64) - 1)# 无符号整数转有符号数def ulong_to_long(inter,is_64 = False): if is_64 == False: return (inter & ((1 << 31) - 1)) - (inter & (1 << 31)) else: return (inter & ((1 << 63) - 1)) - (inter & (1 << 63))if __name__ == "__main__": dbg = MyDebug() connect_flag = dbg.connect() print("连贯状态: {}".format(connect_flag)) for index in range(0,10): # 默认返回有符号数 stack_address = dbg.peek_stack(index) # 应用转换 print("默认有符号数: {:15} --> 转为无符号数: {:15} --> 转为有符号数: {:15}". format(stack_address, long_to_ulong(stack_address),ulong_to_long(long_to_ulong(stack_address)))) dbg.close()通过上述封装函数,即可实现对有符号和无符号数的转换。 ...

February 10, 2023 · 2 min · jiezi

关于python:LyScript-验证PE程序开启的保护

有些破绽利用代码须要在某个保护模式被敞开的状况下才能够利用胜利,在此之前须要失去程序开启了何种保护方式。验证其实有很多办法,其原理是读入PE文件头部构造,找到OPTIONAL_HEADER.DllCharacteristics构造,通过与不同的操作数与运算失去,LyScript插件齐全能够实现这个验证性能,实现起来也是很简略的。 插件地址:https://github.com/lyshark/Ly...验证PE保护方式: 验证本身保护方式无须要遍历加载过的模块,读入DllCharacteristics并顺次与操作数与运算失去主程序的保护方式。 from LyScript32 import MyDebugimport pefileif __name__ == "__main__": # 初始化 dbg = MyDebug() dbg.connect() # 依据text节失去程序首地址 base = dbg.get_base_from_address(dbg.get_local_base()) byte_array = bytearray() for index in range(0,4096): read_byte = dbg.read_memory_byte(base + index) byte_array.append(read_byte) oPE = pefile.PE(data = byte_array) # 随机基址 => hex(pe.OPTIONAL_HEADER.DllCharacteristics) & 0x40 == 0x40 if ((oPE.OPTIONAL_HEADER.DllCharacteristics & 64) == 64): print("基址随机化: True") else: print("基址随机化: False") # 数据不可执行 DEP => hex(pe.OPTIONAL_HEADER.DllCharacteristics) & 0x100 == 0x100 if ((oPE.OPTIONAL_HEADER.DllCharacteristics & 256) == 256): print("DEP爱护状态: True") else: print("DEP爱护状态: False") # 强制完整性=> hex(pe.OPTIONAL_HEADER.DllCharacteristics) & 0x80 == 0x80 if ((oPE.OPTIONAL_HEADER.DllCharacteristics & 128) == 128): print("强制完整性: True") else: print("强制完整性: False") if ((oPE.OPTIONAL_HEADER.DllCharacteristics & 1024) == 1024): print("SEH异样爱护: True") else: print("SEH异样爱护: False") dbg.close()程序运行后即可输入,以后主程序内启用了何种保护方式: ...

February 10, 2023 · 2 min · jiezi

关于python:LyScript-从文本中读写ShellCode

LyScript 插件通过配合内存读写,可实现对特定地位的ShellCode代码的导出,或者将一段存储在文本中的ShellCode代码插入到程序堆中,此性能可用于疾速将本人编写的ShellCode注入到指标过程中,以用于后续测试工作。 插件地址:https://github.com/lyshark/Ly...将本地ShellCode注入到堆中: 第一种用法是将一个本地文本中的ShellCode代码导入到堆中。 首先筹备一个文本文件,将生成的shellcode放入文件内。 而后能够循环读取文本,并一一将shellcode注入到指标堆空间中。 from LyScript32 import MyDebug# 将shellcode读入内存def read_shellcode(path): shellcode_list = [] with open(path,"r",encoding="utf-8") as fp: for index in fp.readlines(): shellcode_line = index.replace('"',"").replace(" ","").replace("\n","").replace(";","") for code in shellcode_line.split("\\x"): if code != "" and code != "\\n": shellcode_list.append("0x" + code) return shellcode_listif __name__ == "__main__": dbg = MyDebug() dbg.connect() # 开拓堆空间 address = dbg.create_alloc(1024) print("开拓堆空间: {}".format(hex(address))) if address == False: exit() # 设置内存可执行属性 dbg.set_local_protect(address,32,1024) # 从文本中读取shellcode shellcode = read_shellcode("d://shellcode.txt") # 循环写入到内存 for code_byte in range(0,len(shellcode)): bytef = int(shellcode[code_byte],16) dbg.write_memory_byte(code_byte + address, bytef) # 设置EIP地位 dbg.set_register("eip",address) input() dbg.delete_alloc(address) dbg.close()执行后,堆空间内会主动填充。 ...

February 10, 2023 · 1 min · jiezi

关于python:LyScript-内存交换与差异对比

LyScript 针对内存读写函数的封装性能并不多,只提供了内存读取和内存写入函数的封装,本篇文章将持续对API进行封装,实现一些在软件逆向剖析中十分实用的性能,例如内存替换,内存区域比照,磁盘与内存镜像比拟,特色码检索等性能。 插件地址:https://github.com/lyshark/Ly...内存区域替换: 实现被加载程序内特定一块内存区域的替换,该办法实现原理就是两个变量之间的替换,只是在替换时须要一一字节进行,调用read_memory_byte()函数实现起了很容易。 from LyScript32 import MyDebug# 替换两个内存区域def memory_xchage(dbg,memory_ptr_x,memory_ptr_y,bytes): ref = False for index in range(0,bytes): # 读取两个内存区域 read_byte_x = dbg.read_memory_byte(memory_ptr_x + index) read_byte_y = dbg.read_memory_byte(memory_ptr_y + index) # 替换内存 ref = dbg.write_memory_byte(memory_ptr_x + index,read_byte_y) ref = dbg.write_memory_byte(memory_ptr_y + index, read_byte_x) return refif __name__ == "__main__": dbg = MyDebug() dbg.connect() eip = dbg.get_register("eip") # 内存替换 flag = memory_xchage(dbg, 6815744,6815776,4) print("内存替换状态: {}".format(flag)) dbg.close()PE文件头节点替换后如下: 内存区域比照: 可用于比照该过程内存中的特定一块区域的差别,返回是列表中的字典模式,别离传入比照内存x,y以及须要比照的内存长度,此处倡议不要超过1024字节。 from LyScript32 import MyDebug# 比照两个内存区域def memory_cmp(dbg,memory_ptr_x,memory_ptr_y,bytes): cmp_memory = [] for index in range(0,bytes): item = {"addr":0, "x": 0, "y": 0} # 读取两个内存区域 read_byte_x = dbg.read_memory_byte(memory_ptr_x + index) read_byte_y = dbg.read_memory_byte(memory_ptr_y + index) if read_byte_x != read_byte_y: item["addr"] = memory_ptr_x + index item["x"] = read_byte_x item["y"] = read_byte_y cmp_memory.append(item) return cmp_memoryif __name__ == "__main__": dbg = MyDebug() dbg.connect() eip = dbg.get_register("eip") # 内存比照 cmp_ref = memory_cmp(dbg, 6815744,6815776,4) for index in range(0,len(cmp_ref)): print("地址: 0x{:08X} -> X: 0x{:02x} -> y: 0x{:02x}".format(cmp_ref[index].get("addr"),cmp_ref[index].get("x"),cmp_ref[index].get("y"))) dbg.close()比照特定内存区域,返回差别字节地址: ...

February 10, 2023 · 4 min · jiezi

关于python:LyScript-实现应用层钩子扫描器

Capstone 是一个轻量级的多平台、多架构的反汇编框架,该模块反对目前所有通用操作系统,反汇编架构简直全副反对,本篇文章将使用LyScript插件联合Capstone反汇编引擎实现一个钩子扫描器。 插件地址:https://github.com/lyshark/Ly...要实现应用层钩子扫描,咱们须要失去程序内存文件的机器码以及磁盘中的机器码,并通过capstone这个第三方反汇编引擎,对两者进行反汇编,最初逐条比照汇编指令,实现过程钩子扫描的成果。 通过LyScript插件读取出内存中的机器码,而后交给第三方反汇编库执行,并将后果输入成字典格局。 #coding: utf-8import binascii,os,sysimport pefilefrom capstone import *from LyScript32 import MyDebug# 失去内存反汇编代码def get_memory_disassembly(address,offset,len): # 反汇编列表 dasm_memory_dict = [] # 内存列表 ref_memory_list = bytearray() # 读取数据 for index in range(offset,len): char = dbg.read_memory_byte(address + index) ref_memory_list.append(char) # 执行反汇编 md = Cs(CS_ARCH_X86,CS_MODE_32) for item in md.disasm(ref_memory_list,0x1): addr = int(pe_base) + item.address dasm_memory_dict.append({"address": str(addr), "opcode": item.mnemonic + " " + item.op_str}) return dasm_memory_dictif __name__ == "__main__": dbg = MyDebug() dbg.connect() pe_base = dbg.get_local_base() pe_size = dbg.get_local_size() print("模块基地址: {}".format(hex(pe_base))) print("模块大小: {}".format(hex(pe_size))) # 失去内存反汇编代码 dasm_memory_list = get_memory_disassembly(pe_base,0,pe_size) print(dasm_memory_list) dbg.close()成果如下: ...

February 10, 2023 · 2 min · jiezi

关于python:LyScript-实现绕过反调试保护

LyScript插件中内置的办法可实现各类反调试以及屏蔽特定API函数的性能,这类性能在应答病毒等恶意程序时十分无效,例如当程序调用特定API函数时咱们能够将其拦挡,从而实现爱护零碎在调试时不被毁坏的目标。 插件地址:https://github.com/lyshark/Ly...绕过反调试机制: 最罕用的反调试机制就是用IsDebuggerPresent该标记查看PEB+2地位处的内容,如果为1则示意正在被调试,咱们运行脚本间接将其设置为0即可绕过反调试机制。 也就是过程环境块中+2的地位,此处是一个字节标记,反调试的机制是,程序调用IsDebuggerPresent查看此处的标记,如果为1则阐明程序正在被调试,为0则阐明没有被调试,只须要在运行之前将其设置为0即可绕过反调试。 from LyScript32 import MyDebugif __name__ == "__main__": # 初始化 dbg = MyDebug() dbg.connect() # 通过PEB找到调试标记位 peb = dbg.get_peb_address(dbg.get_process_id()) print("调试标记地址: 0x{:x}".format(peb+2)) flag = dbg.read_memory_byte(peb+2) print("调试标记位: {}".format(flag)) # 将调试标记设置为0即可过掉反调试 nop_debug = dbg.write_memory_byte(peb+2,0) print("反调试绕过状态: {}".format(nop_debug)) dbg.close()将程序载入调试器,并运行如上脚本,而后运行程序,你会发现反调试被绕过了。 其次咱们还能够动静的在函数结尾地位写入sub eax,eax,ret指令,这样当程序要调用特定函数时,会间接返回退出,从而达到屏蔽函数执行等目标。 from LyScript32 import MyDebug# 失去所须要的机器码def set_assemble_opcde(dbg,address): # 失去第一条长度 opcode_size = dbg.assemble_code_size("sub eax,eax") # 写出汇编指令 dbg.assemble_at(address, "sub eax,eax") dbg.assemble_at(address + opcode_size , "ret")if __name__ == "__main__": # 初始化 dbg = MyDebug() dbg.connect() # 失去函数所在内存地址 process32first = dbg.get_module_from_function("kernel32","Process32FirstW") process32next = dbg.get_module_from_function("kernel32","Process32NextW") messagebox = dbg.get_module_from_function("user32.dll","MessageBoxA") messageboxw = dbg.get_module_from_function("user32.dll", "MessageBoxW") print(hex(messagebox)," ",hex(messageboxw)) # 替换函数地位为sub eax,eax ret set_assemble_opcde(dbg, messagebox) set_assemble_opcde(dbg,messageboxw) dbg.close()如上,咱们在弹窗地位写出返回指令,而后运行程序,你会发现,弹窗不会呈现了,这也就把这个函数给屏蔽了。 ...

February 10, 2023 · 1 min · jiezi

关于python:LyScript-插件实现UPX寻找入口

LyScript 插件可实现对压缩壳的疾速脱壳操作,目前反对两种脱壳形式,一种是使用API接口本人编写脱壳过程,另一种是间接加载现有的脱壳脚本运行脱壳。 插件地址:https://github.com/lyshark/Ly...首先筹备一个加了UPX压缩壳的程序,而后咱们通过本人编写脚本实现脱壳工作。 咱们将以后EIP停留在UPX壳的首地址处,执行如下脚本,将能够主动寻找到以后EIP的具体位置。 from LyScript32 import MyDebugif __name__ == "__main__": # 初始化 dbg = MyDebug() # 连贯到调试器 connect_flag = dbg.connect() print("连贯状态: {}".format(connect_flag)) # 检测套接字是否还在 ref = dbg.is_connect() print("是否在连贯: ", ref) is_64 = False # 判断是否时64位数 if is_64 == False: currentIP = dbg.get_register("eip") if dbg.read_memory_word(currentIP) != int(0xBE60): print("[-] 可能不是UPX") dbg.close() patternAddr = dbg.scan_memory_one("83 EC ?? E9 ?? ?? ?? ?? 00") print("匹配到的地址: {}".format(hex(patternAddr))) dbg.set_breakpoint(patternAddr) dbg.set_debug("Run") dbg.set_debug("Wait") dbg.delete_breakpoint(patternAddr) dbg.set_debug("StepOver") dbg.set_debug("StepOver") print("[+] 程序OEP = 0x{:x}".format(dbg.get_register("eip"))) else: currentIP = dbg.get_register("rip") if dbg.read_memory_dword(currentIP) != int(0x55575653): print("[-] 可能不是UPX") dbg.close() patternAddr = dbg.scan_memory_one("48 83 EC ?? E9") print("匹配到的地址: {}".format(hex(patternAddr))) dbg.set_breakpoint(patternAddr) dbg.set_debug("Run") dbg.set_debug("Wait") dbg.delete_breakpoint(patternAddr) dbg.set_debug("StepOver") dbg.set_debug("StepOver") print("[+] 程序OEP = 0x{:x}".format(dbg.get_register("eip"))) dbg.close()运行如上代码,将通过特色码疾速定位并寻找到程序加壳前的OEP地位。 ...

February 10, 2023 · 1 min · jiezi

关于python:LyScript-批量搜索反汇编特征

LyScript 插件实现对特定汇编指令片段的批量搜寻性能,用户传入一个汇编指令列表,而后循环搜寻该列表内的所有指令特色,如果找到了,则返回该指令的内存地址。 插件地址:https://github.com/lyshark/Ly...失去汇编指令机器码: 该性能次要实现,失去用户传入汇编指令所对应的机器码,这段代码你能够这样来实现。 from LyScript32 import MyDebugif __name__ == "__main__": dbg = MyDebug() connect_flag = dbg.connect() print("连贯状态: {}".format(connect_flag)) addr = dbg.create_alloc(1024) print("堆空间: {}".format(hex(addr))) asm_size = dbg.assemble_code_size("mov eax,1") print("汇编代码占用字节: {}".format(asm_size)) write = dbg.assemble_write_memory(addr,"mov eax,1") byte_code = bytearray() for index in range(0,asm_size): read = dbg.read_memory_byte(addr + index) print("{:02x} ".format(read),end="") dbg.delete_alloc(addr)封装如上代码接口,实现get_opcode_from_assemble()用户传入汇编指令,失去该指令对应机器码。 from LyScript32 import MyDebug# 传入汇编代码,失去对应机器码def get_opcode_from_assemble(dbg_ptr,asm): byte_code = bytearray() addr = dbg_ptr.create_alloc(1024) if addr != 0: asm_size = dbg_ptr.assemble_code_size(asm) # print("汇编代码占用字节: {}".format(asm_size)) write = dbg_ptr.assemble_write_memory(addr,asm) if write == True: for index in range(0,asm_size): read = dbg_ptr.read_memory_byte(addr + index) # print("{:02x} ".format(read),end="") byte_code.append(read) dbg_ptr.delete_alloc(addr) return byte_code else: return bytearray(0)if __name__ == "__main__": dbg = MyDebug() connect_flag = dbg.connect() print("连贯状态: {}".format(connect_flag)) # 获取汇编代码 byte_array = get_opcode_from_assemble(dbg,"xor eax,eax") for index in byte_array: print(hex(index),end="") print() # 汇编一个序列 asm_list = ["xor eax,eax", "xor ebx,ebx", "mov eax,1"] for index in asm_list: byte_array = get_opcode_from_assemble(dbg, index) for index in byte_array: print(hex(index),end="") print() dbg.close()运行如上代码,可找出符合条件的内存地址。 ...

February 10, 2023 · 3 min · jiezi

关于python:LyScript-自实现汇编搜索功能

通过对LyScript自动化插件进行二次封装,实现从内存中读入指标过程解码后的机器码,并通过Python代码在这些机器码中寻找特定的十六进制字符数组,或间接检索是否存在间断的反汇编指令片段等性能。 插件地址:https://github.com/lyshark/Ly...搜寻内存中的机器码: 内存机器码须要配合LyScript32插件,从内存中寻找指令片段。 from LyScript32 import MyDebug# 将可执行文件中的复数转换为 0x00 格局def ReadHexCode(code): hex_code = [] for index in code: if index >= 0 and index <= 15: #print("0" + str(hex(index).replace("0x",""))) hex_code.append("0" + str(hex(index).replace("0x",""))) else: hex_code.append(hex(index).replace("0x","")) #print(hex(index).replace("0x","")) return hex_code# 获取到内存中的机器码def GetCode(): try: ref_code = [] dbg = MyDebug() connect_flag = dbg.connect() if connect_flag != 1: return None start_address = dbg.get_local_base() end_address = start_address + dbg.get_local_size() # 循环失去机器码 for index in range(start_address,end_address): read_bytes = dbg.read_memory_byte(index) ref_code.append(read_bytes) dbg.close() return ref_code except Exception: return False# 在字节数组中匹配是否与特色码统一def SearchHexCode(Code,SearchCode,ReadByte): SearchCount = len(SearchCode) #print("特色码总长度: {}".format(SearchCount)) for item in range(0,ReadByte): count = 0 # 对十六进制数切片,每次向后遍历SearchCount OpCode = Code[ 0+item :SearchCount+item ] #print("切割数组: {} --> 比照: {}".format(OpCode,SearchCode)) try: for x in range(0,SearchCount): if OpCode[x] == SearchCode[x]: count = count + 1 #print("寻找特色码计数: {} {} {}".format(count,OpCode[x],SearchCode[x])) if count == SearchCount: # 如果找到了,就返回True,否则返回False return True exit(0) except Exception: pass return Falseif __name__ == "__main__": # 读取到内存机器码 ref_code = GetCode() if ref_code != False: # 转为十六进制 hex_code = ReadHexCode(ref_code) code_size = len(hex_code) # 指定要搜寻的特色码序列 search = ['c0', '74', '0d', '66', '3b', 'c6', '77', '08'] # 搜寻特色: hex_code = exe的字节码,search=搜寻特色码,code_size = 搜寻大小 ret = SearchHexCode(hex_code, search, code_size) if ret == True: print("特色码 {} 存在".format(search)) else: print("特色码 {} 不存在".format(search)) else: print("读入失败")输入成果: ...

February 10, 2023 · 2 min · jiezi

关于python:LyScript-内存扫描与查壳实现

LyScript 中提供了多种内存特色扫描函数,每一种扫描函数用法各不相同,在应用扫描函数时应首先搞清楚他们之间的差别,如下将别离具体介绍每一种内存扫描函数是如何灵活运用的,最初将实现一个简易版内存查壳脚本,可疾速定位目标程序加了什么壳。 插件地址:https://github.com/lyshark/Ly...先来理解第一个函数scan_memory_all()的特点,该函数用来扫描以后过程内EIP所指向地位处整个内存段中符合条件的特色,如果找到了则返回一个列表,如果没有找到则返回False,该函数与scan_memory_one()函数原理是统一的,惟一的不同是all以列表模式返回所有匹配到的行,one则只返回匹配到的第一条记录,这两个函数都反对??含糊匹配。 如果载入一个程序,默认停留在零碎领空,则调用该函数你所能失去的特色记录只能是零碎领空特定dll内的特色集。 例如扫描ntdll.dll模块内的所有特色字段是55 8b ec 83 e4的记录,代码是这样的。 from LyScript32 import MyDebugif __name__ == "__main__": dbg = MyDebug() conn = dbg.connect() ref_one = dbg.scan_memory_one("55 8b ec 83 e4") print("扫描一行: {}".format(hex(ref_one))) ref_all = dbg.scan_memory_all("55 8b ec 83 e4") for index in range(0, len(ref_all)): print("记录: {} 地址: {}".format(index,hex(ref_all[index]))) dbg.close()运行成果如下: 有时咱们须要指定扫描某个模块,例如扫描过程内的msvcr120.dll模块,外面的特征值。 此时须要想得到该模块的入口地址,而后将EIP切换过来,此时在调用scan_memory_all()来实现搜寻,当然最好先备份原始EIP地位,这样扫描完当前能够间接切回去。 from LyScript32 import MyDebugif __name__ == "__main__": dbg = MyDebug() conn = dbg.connect() # 失去所有模块 local_module_base = dbg.get_all_module() for index in local_module_base: # 找到须要的模块 if index.get("name") == "msvcr120.dll": entry = index.get("entry") print("扫描入口: {}".format(hex(entry))) # 切过去 dbg.set_register("eip",entry) # 开始搜寻特色 scan_ref = dbg.scan_memory_all("5d c2 0c 00 55 8b ec") for x in scan_ref: print("扫描到: {}".format(hex(x))) dbg.close()输入后果如下: ...

February 10, 2023 · 2 min · jiezi

关于python:LyScript-通过PEB结构解析堆基址

LyScript中默认并没有提供获取过程堆基址的函数,不过却提供了获取PEB/TEB的函数,以PEB获取为例,能够调用dbg.get_peb_address(local_pid)用户传入以后过程的PID号,通常PID号能够应用dbg.get_process_id()函数失去,当失去了PEB过程环境块的基地址,那么获取堆基址就变得很简略了。 插件地址:https://github.com/lyshark/Ly...首先以获取kernel32.dll模块基地址为例,如果应用汇编获取则代码是这样的,依据这段代码咱们触类旁通。 _asm{ push esi mov esi, dword ptr fs : [0x30] // PEB地址 mov esi, [esi + 0x0C] // PEB_LDR_DATA mov esi, [esi + 0x1C] // InInitializationOrderModuleList mov esi, [esi] // mov eax, [esi + 0x08] // 模块基址 pop esi}应用lyscript失去地址的代码就变得很简略了,只须要屡次读取指针变量即可失去。 from LyScript32 import MyDebugif __name__ == "__main__": dbg = MyDebug() conn = dbg.connect() # 内置函数失去过程PEB local_pid = dbg.get_process_id() peb = dbg.get_peb_address(local_pid) print("过程PEB: {}".format(hex(peb))) # esi = PEB_LDR_DATA构造体的地址 ptr = peb + 0x0c # 读取内存指针 PEB_LDR_DATA = dbg.read_memory_ptr(ptr) print("读入PEB_LDR_DATA外面的地址: {}".format(hex(PEB_LDR_DATA))) # esi = 模块链表指针InInitializationOrderModuleList ptr = PEB_LDR_DATA + 0x1c InInitializationOrderModuleList = dbg.read_memory_ptr(ptr) print("读入InInitializationOrderModuleList外面的地址: {}".format(hex(InInitializationOrderModuleList))) # 取出kernel32.dll模块基址 ptr = InInitializationOrderModuleList + 0x08 modbase = dbg.read_memory_ptr(ptr) print("kernel32.dll = {}".format(hex(modbase))) dbg.close()读取成果如下: ...

February 10, 2023 · 8 min · jiezi

关于python:LyScript-实现Hook改写MessageBox

LyScript 可实现自定义汇编指令的替换性能,用户能够自行编写一段汇编指令,将程序中特定的通用函数进行性能改写与转向操作,此性能原理是简略的Hook操作。 插件地址:https://github.com/lyshark/Ly...首先咱们先来实现一个Hook模板,在代码中实现直达机制,如下代码以MessageBoxA函数为案例实现批改汇编参数传递。 from LyScript32 import MyDebug# 传入汇编列表,写出到内存def assemble(dbg, address=0, asm_list=[]): asm_len_count = 0 for index in range(0,len(asm_list)): # 写出到内存 dbg.assemble_at(address, asm_list[index]) # print("地址: {} --> 长度计数器: {} --> 写出: {}".format(hex(address + asm_len_count), asm_len_count,asm_list[index])) # 失去asm长度 asm_len_count = dbg.assemble_code_size(asm_list[index]) # 地址每次递增 address = address + asm_len_countif __name__ == "__main__": dbg = MyDebug() connect_flag = dbg.connect() print("连贯状态: {}".format(connect_flag)) # 找到MessageBoxA messagebox_address = dbg.get_module_from_function("user32.dll","MessageBoxA") print("MessageBoxA内存地址 = {}".format(hex(messagebox_address))) # 调配空间 HookMem = dbg.create_alloc(1024) print("自定义内存空间: {}".format(hex(HookMem))) # 写出FindWindowA内存地址,跳转地址 asm = [ f"push {hex(HookMem)}", "ret" ] # 将列表中的汇编指令写出到内存 assemble(dbg,messagebox_address,asm) dbg.close()上方代码中能够看到,首先获取到MessageBoxA函数内存地址,而后咱们通过dbg.create_alloc(1024)调配一段空间,并利用assemble()函数写出一个跳转指令。 ...

February 10, 2023 · 2 min · jiezi

关于python:LyScript-计算片段Hash并写出Excel

本案例将学习使用LyScript计算特定程序中特定某些片段的Hash特征值,并通过xlsxwriter这个第三方模块将计算到的hash值存储成一个excel表格,本例中的知识点能够说曾经具备了简略的表格输入能力,如果工夫富余齐全能够实现自动化报告生成。 插件地址:https://github.com/lyshark/Ly...第一步实现计算特定片段的特征值,此类代码实现原理用户传入一个rva绝对地址以及读入指令长度,并通过内置的hashlib库实现计算内存段内指令的特色,如下代码先来实现计算两段指令特色。 import hashlibimport zlib,binasciifrom LyScript32 import MyDebug# 计算哈希def calc_hash(dbg, rva,size): read_list = bytearray() ref_hash = { "va": None, "size": None, "md5":None, "sha256":None, "sha512":None, "crc32":None } # 失去基地址 base = dbg.get_local_module_base() # 读入数据 for index in range(0,size): readbyte = dbg.read_memory_byte(base + rva + index) read_list.append(readbyte) # 计算特色 md5hash = hashlib.md5(read_list) sha512hash = hashlib.sha512(read_list) sha256hash = hashlib.sha256(read_list) # crc32hash = binascii.crc32(read_list) & 0xffffffff ref_hash["va"] = hex(base+rva) ref_hash["size"] = size ref_hash["md5"] = md5hash.hexdigest() ref_hash["sha256"] = sha256hash.hexdigest() ref_hash["sha512"] = sha512hash.hexdigest() ref_hash["crc32"] = hex(zlib.crc32(read_list)) return ref_hashif __name__ == "__main__": dbg = MyDebug() connect = dbg.connect() # 传入绝对地址,计算计算字节 ref = calc_hash(dbg,0x19fd,10) print(ref) # 计算第二段 ref = calc_hash(dbg,0x1030,26) print(ref) dbg.close()计算后输入字典格局: ...

February 10, 2023 · 2 min · jiezi

关于python:LyScript-实现Hook隐藏调试器

LyScript 插件集成的内置API函数可灵便的实现绕过各类反调试爱护机制,前段时间公布的那一篇文章并没有具体解说各类反调试机制的绕过措施,本次将补充这方面的知识点,使用LyScript实现绕过大多数通用调试机制,实现暗藏调试器的目标。 插件地址:https://github.com/lyshark/Ly...咱们以此实现Patches如下函数: IsDebuggerPresentZwQueryInformationProcessCheckRemoteDebuggerPresentPEB.IsDebuggedPEB.ProcessHeap.FlagPEB.NtGlobalFlagPEB.Ldr 0xFEEEFEEE fillingGetTickCountZwQuerySystemInformationFindWindowAFindWindowWFindWindowExAFindWindowExWEnumWindows首先第一步咱们须要本人封装实现一个反汇编转机器码的函数,其作用是当用户传入汇编列表时,主动将其转为机器码并输入为列表格局。 from LyScript32 import MyDebug# 传入汇编代码,失去对应机器码def get_opcode_from_assemble(dbg_ptr,asm): byte_code = bytearray() addr = dbg_ptr.create_alloc(1024) if addr != 0: asm_size = dbg_ptr.assemble_code_size(asm) # print("汇编代码占用字节: {}".format(asm_size)) write = dbg_ptr.assemble_write_memory(addr,asm) if write == True: for index in range(0,asm_size): read = dbg_ptr.read_memory_byte(addr + index) # print("{:02x} ".format(read),end="") byte_code.append(read) dbg_ptr.delete_alloc(addr) return byte_code else: return bytearray(0)# 传入汇编机器码失去机器码列表def GetOpCode(dbg, Code): ShellCode = [] for index in Code: ref = get_opcode_from_assemble(dbg,index) for opcode in ref: ShellCode.append(opcode) return ShellCodeif __name__ == "__main__": dbg = MyDebug() connect = dbg.connect() ShellCode = GetOpCode(dbg, ["DB 0x64","mov eax,dword ptr ds:[18]","sub eax,eax","ret"]) print(ShellCode) dbg.close()输入成果如下: ...

February 10, 2023 · 7 min · jiezi

关于python:0基础学爬虫爬虫基础之爬虫的基本介绍

大数据时代,各行各业对数据采集的需要日益增多,网络爬虫的使用也更为宽泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前曾经推出不少爬虫进阶、逆向相干文章,为实现从易到难全方位笼罩,特设【0根底学爬虫】专栏,帮忙小白疾速入门爬虫,本期为爬虫的根本介绍。一、爬虫概述爬虫又称网络蜘蛛、网络机器人,网络爬虫依照系统结构和实现技术,大抵能够分为以下几种类型: 通用网络爬虫(Scalable Web Crawler):抓取互联网上所有数据,爬取对象从一些种子 URL 裁减到整个 Web,次要为门户站点搜索引擎和大型 Web 服务提供商采集数据,是捜索引擎抓取零碎(Baidu、Google、Yahoo 等)的重要组成部分。聚焦网络爬虫(Focused Crawler):抓取互联网上特定数据,依照事后定义好的主题有选择地进行网页爬取的一种爬虫,将爬取的指标网页定位在与主题相干的页面中,选择性地爬取特定畛域信息。增量式网络爬虫(Incremental Web Crawler):抓取互联网上刚更新的数据,采取增量式更新和只爬取新产生的或者曾经发生变化网页,它可能在肯定水平上保障所爬取的页面是尽可能新的页面,缩小工夫和空间上的消耗。深层网络爬虫(Deep Web Crawler):表层网页(Surface Web)是指传统搜索引擎能够索引的页面,以超链接能够达到的动态网页为主形成的 Web 页面;深层网页(Deep Web)是指不能通过动态链接获取的、暗藏在搜寻表单后的,只有用户提交一些关键词能力取得的 Web 页面。在互联网中,深层页面的数量往往比表层页面的数量要多很多。爬虫程序能模仿浏览器申请站点的行为,把站点返回的HTML代码/JSON数据/二进制数据(图片、视频、音频) 等爬取到本地,进而提取本人须要的数据,并寄存起来应用,每一个程序都有本人的规定,网络爬虫也不例外,它会依据人们施加的规定去采集信息,这些规定为网络爬虫算法,依据使用者的目标,爬虫能够实现不同的性能,但所有爬虫的实质,都是不便人们在海量的互联网信息中找到并下载到本人要的那一类,晋升信息获取效率。 爬虫采集的都是失常用户能浏览到的内容,而非所谓的 ”入侵服务器“,常说高水准者可 ”所见即所得“,意为只有是能看的内容就能爬取到,心愿各位都能达到这个水平~ 二、爬虫的用处现如今大数据时代曾经到来,网络爬虫技术成为这个时代不可或缺的一部分,企业须要数据来剖析用户行为、本人产品的不足之处以及竞争对手的信息等,而这所有的首要条件就是数据的采集。网络爬虫的价值其实就是数据的价值,在互联网社会中,数据是价值连城,所有皆为数据,谁领有了大量有用的数据,谁就领有了决策的主动权。 网络爬虫目前次要的应用领域如:搜索引擎、数据采集、数据分析、信息聚合、竞品监控、认知智能、舆情剖析等等,爬虫业务相干的公司不可胜数,如百度、谷歌、天眼查、企查查、新榜、飞瓜等等,在大数据时代,爬虫的利用范围广、需要大,简略举几个贴近生活的例子: 求职需要:获取各个城市的招聘信息及薪资规范,不便筛选出适宜本人的;租房需要:获取各个城市的租房信息,以便挑选出心仪的房源;美食需要:获取各个中央的好评美食,让吃货不迷路;购物需要:获取各个商家同一个商品的价格及折扣信息,让购物更实惠;购车需要:获取心仪车辆近年的价格稳定,以及不同渠道各车型的价格,助力筛选爱车。三、URI 及 URL 的含意URI(Uniform Resource Identifier),即对立资源标志符,URI(Uniform Resource Location),即对立资源定位符,例如 https://www.kuaidaili.com/ ,既是一个 URI,也是一个 URL,URL 是 URI 的子集,对于个别的网页链接,习惯称为 URL,一个 URL 的根本组成格局如下: scheme://[username:password@]host[:port][/path][;parameters][?query][#fragment]各局部含意如下: scheme:获取资源应用的协定,例如 http、https、ftp 等,没有默认值,scheme 也被称为 protocol;username:password:用户名与明码,某些状况下 URL 须要提供用户名和明码能力拜访,这是个非凡的存在,个别拜访 ftp 时会用到,显式的表明了拜访资源的用户名与明码,然而能够不写,不写的话可能会让输出用户名明码;host:主机地址,能够是域名或 IP 地址,例如 www.kuaidaili.com、112.66.251.209;port:端口,服务器设定的服务端口,http 协定的默认端口为 80,https 协定的默认端口为 443,例如 https://www.kuaidaili.com/ 相当于 https://www.kuaidaili.com:443;path:门路,指的是网络资源在服务器中的指定地址,通过 host:port 咱们能找到主机,然而主机上文件很多,通过 path 则能够定位具体文件。例如 https://www.baidu.com/file/in...,path 为 /file/index.html,示意咱们拜访 /file/index.html 这个文件;parameters:参数,用来指定拜访某个资源时的附加信息,次要作用就是像服务器提供额定的参数,用来示意本次申请的一些个性,例如 https://www.kuaidaili.com/dps;kspider,kspider 即参数,当初用的很少,大多数将 query 局部作为参数;query:查问,因为查问某类资源,若多个查问,则用 & 隔开,通过 GET 形式申请的参数,例如:https://www.kuaidaili.com/dps...,query 局部为 username=kspider&type=spider,指定了 username 为 kspider,type 为 spider;fragment:片段,对资源形容的局部补充,用来标识次级资源,例如 https://www.kuaidaili.com/dps...,kspider 即为 fragment 的值: ...

February 10, 2023 · 2 min · jiezi

关于python:吾剑未尝不利国内Azure平替科大讯飞人工智能免费AI语音合成TTS服务Python310接入

微软Azure平台的语音合成(TTS)技术的确神乎其技,这一点在之前的一篇:含辞未吐,声若幽兰,史上最强收费人工智能AI语音合成TTS服务微软Azure(Python3.10接入),曾经做过具体介绍,然则Azure平台须要信用卡验证,有肯定门槛,对国内用户不太敌对,放眼神州,科大讯飞的讯飞开放平台也有语音合成服务接口,能够通过语音合成流式接口将文字信息转化为声音信息。 创立语音利用首先注册讯飞开放平台,随后创立语音合成利用:https://console.xfyun.cn/app/... 创立胜利后,能够获取5个小时的收费语音合成工夫,同时获取利用的appid、秘钥和APIKey: 该语音合成能力是通过基于Websocket协定的长连贯接口API的形式给开发者提供一个通用的接口。 Websocket协定接口具备流式传输能力,实用于须要流式数据传输的AI服务场景,比起集成在客户端的SDK,流接口具备轻量、跨语言的特点;相较于传统的HTTP协定接口,Websocket协定接口有原生反对跨域的劣势,换句话说,从前端就能够间接进行语音转换,而不须要后端参加。 接口鉴权依据官网的接口文档:https://www.xfyun.cn/doc/tts/...\_tts/API.html ,咱们先装置对应的三方库: pip3 install websocket==0.2.1 pip3 install websocket-client==0.56.0因为讯飞的服务端反对的websocket版本是13,所以须要确保申请端应用的库反对该版本。 首先导入根底库,并且预设语音合成类的参数: import websocket import datetime import hashlib import base64 import hmac import json from urllib.parse import urlencode import time import ssl from wsgiref.handlers import format_date_time from datetime import datetime from time import mktime import _thread as thread import os file_path = "/Users/liuyue/wodfan/work/xunfei-ttp" file_name = "demo.mp3" class Ifly: # 初始化 def __init__(self, APPID, APIKey, APISecret, Text): self.APPID = APPID self.APIKey = APIKey self.APISecret = APISecret self.Text = Text # 公共参数(common) self.CommonArgs = {"app_id": self.APPID} # 业务参数(business),更多个性化参数可在官网查看 self.BusinessArgs = {"aue": "lame", "auf": "audio/L16;rate=16000", "vcn": "xiaoyan", "tte": "utf8","sfl":1,"speed":80} self.Data = {"status": 2, "text": str(base64.b64encode(self.Text.encode('utf-8')), "UTF8")}这里把利用的APPID, APIKey, APISecret作为实例化参数进行传入,Text为须要语音合成的文本。 ...

February 8, 2023 · 3 min · jiezi

关于python:快速上手python的简单web框架flask

简介python能够做很多事件,尽管它的强项在于进行向量运算和机器学习、深度学习等方面。然而在某些时候,咱们依然须要应用python对外提供web服务。 比方咱们当初有一个用python写好的模型算法,这个模型算法须要接管前端的输出,而后进行模仿运算,最终失去最初的输入。这个流程是一个典型的web服务,与其咱们应用java或者nodejs来搭建一个web服务器,不如咱们就应用python本人的web框架来实现这一指标,缩小技术栈的同时,还能够实现代码逻辑的对立,何乐而不为呢? 其实python的web框架也有很多种,比方django、flask等等。 这本系列的文章中,咱们会介绍flask这个轻量级的web框架。 web框架的重要组成部分置信大家都用过不少web框架吧,从java的spring MVC,到nodejs的express和koa,有性能简单的,也有性能简略的。 然而不论他们的性能如何,其最重要最根本的一个性能就是可能提供web服务,也就是说能够接管HTTP或者HTTPS的申请,而后返回对应的数据。这个性能通常蕴含的是外围的路由跳转性能。 有了这个外围的性能,web框架基本上就能够失常运行了。配合上当初风行的前后端拆散技术,所有瓜熟蒂落。 如果不想用前后端拆散,那么web框架还须要波及到页面的出现技术。一般来说都会应用模板引擎作为前端页面的出现模式。 而后配合上对数据库、缓存、音讯队列、动态资源、日志、调试等附加的性能,一个残缺的web框架就实现了。 flask尽管是一个轻量级web框架,然而该有的性能它全都有。 它的外围是提供了对web路由的反对,同时反对Jinja的模板语言。 疾速上手flaskflask是一个非常简单优雅的web框架,flask须要Python 3.7及以上版本的反对。 为了辨别python的不同开发环境,咱们在应用flask的时候,能够应用python自带的venv来创立不同的虚拟环境。venv跟conda的env很相似,都是用来创立虚拟环境,从而实现不同的环境进行拆散的作用。 应用venv非常简单,如果你用的开发工具是pycharm,那么在创立python的flask我的项目的时候,会主动抉择对应的虚拟环境创立工具,这里咱们抉择应用venv即可主动创立。 当然你也能够应用上面的命令来手动创立venv: $ mkdir learn-flask$ cd learn-flask$ python3 -m venv venv创立好venv之后,应用上面的命令来激活这个env: . venv/bin/activatevenv装置结束之后,咱们能够应用上面的命令装置flask: pip install Flask装置结束之后,你能够在python我的项目site-packages外面找到flask对应的依赖包: 能够看到外面出了flask之外,还有其余的一些第三方依赖包,这些都是能够在后续的flask利用中应用到的。 flask的第一个利用flask的依赖包都装置好之后,咱们就能够写一个最最简略的web应用程序了,咱们把这个应用程序命名为first.py: from flask import Flaskapp = Flask(__name__)@app.route('/')def first(): return "<p>这是我的第一个flask程序!</p>"if __name__ == '__main__': app.run()和一般的python程序不同的是,这里咱们先实例化了一个Flask对象,而后用相似注解的形式定义了一个route在fist这个办法上。 程序写好了,如果你在pycharm IDE中,那么能够右键运行,能够失去上面的内容: FLASK_APP = first.pyFLASK_ENV = developmentFLASK_DEBUG = 0In folder /Users/data/git/ddean2009/learn-flask/Users/data/git/ddean2009/learn-flask/venv/bin/python -m flask run * Serving Flask app 'first.py' * Debug mode: offWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on http://127.0.0.1:5000能够看到IDE为咱们设置了几个环境变量,别离是FLASK_APP:示意要运行的app名称。FLASK_ENV:示意当初的运行环境是开发环境还是线上环境。FLASK_DEBUG示意是否是debug模式。 ...

February 6, 2023 · 1 min · jiezi

关于python:oeasypython0068-字体样式正常加亮变暗控制序列

字体款式回顾上次内容上次理解了一个新的本义模式 \33 逃逸控制字符 escesc 让输入 退出规范输入流 进行管制信息的设置 能够清屏也能够设置光标输入的地位 还能做什么呢? 能够设置字符的色彩吗???查看细节回顾 管制序列 前导符\033[\是转义字符 要和 前面的内容 一起 形成转义序列\033 是转义序列 本义本义 转化含意转义序列\033对应的 字符含意 是Escape再次 逃逸 进来字符串 外面呈现了 Escape后 能逃去到哪里呢?从 输入的字符串 中 Escape 进来 前面的内容 不是纯文本了而是 管制序列(Control Sequence)具体管制\033[ 是 CSI CSI n mCSI 之后的是ansi给的对于字体款式的设置细节 上图中的 CSI Control Sequence Introducer管制序列前导符CSI 就是 \033[上图中的 n 对应 0-10的一个数字上图中的m 阐明 这是 要进行 外观设置这个 局部属于 SGR (Select Graphic Rendition) parameters抉择图形渲染 参数正如上次 用H 管制地位n从1-10 具体是 设置了些 什么呢?具体设置从1m 到10m 咱们 试试1m、0m ...

February 1, 2023 · 2 min · jiezi

关于python:oeasypython0068控制序列清屏控制输出位置2J

光标地位回顾上次内容上次理解了键盘演变的过程 ESC 从 组合键到 独立按键 ESC 的目标 是进入管制序列配置管制信息管制信息 \033[y;xH 设置光标地位\033[2J 清屏这到底怎么管制来着???当初 零碎里 这些行为 是谁来实现的呢?管制 是由 gui零碎中 终端软件 来实现的具体来说就是 xfce terminal输入字符\033是转义序列 \33是\033的省略写法33 是 8 进制数状态的ord("\e") 也能够 写成 16进制状态 \x1bprint("\033[2J")J 是模式抉择 清屏模式分为四种清屏 0J - 从光标清到屏幕完结1J - 从光标清到屏幕结尾2J - 整屏幕清3J - 整屏幕清并抉择清空滚动缓存 2J 是 整屏幕清察看环境进入vi 察看屏幕大小 终端屏幕默认 80*24 (字符)设置光标\33[ 是CSI 管制序列前导符print("\33[1;1Hoeasy")1;1 指的是 屏幕左上角终端大小 横向80字符纵向24字符两头用分隔符是分号(;)设置好了 之后 输入 前面的字符 oeasyH 是模式抉择 能够先清屏再输入么?清屏并设置光标print("\33[2J")print("\33[1;1Hoeasy")这是两句话 实现两件事 2J清屏1;1H设置输入地位两句话能够合并成一句吗?合并输入"\33[2J\33[1;1Hoeasy" \33[2J 终端接管到后清屏\33[1;1H 终端接管到后设置光标终端输入 oeasyprint("\33[2J\33[1;1Hoeasy")能够换个地位 输入吗?换个地位print("\33[2J\33[10;10Hoeasy")"\33[2J\33[10;10Hoeasy" 先清屏再在(10,10)坐标输入oeasy这就是esc的作用escape从以后输入序列中退出来 进行管制信息的输入 看起来很像平安逃生进口总结这次理解了一个新的本义模式 \33 逃逸控制字符 escesc 让输入 退出规范输入流 ...

January 31, 2023 · 1 min · jiezi

关于python:python-如何运行子层-py-脚本

seo优化: python 如何运行非顶层 py 脚本须要被运行的 py 脚本不在顶层怎么运行? 比方这个我的项目:https://github.com/ponponon/i... 我在我的项目根门路运行 idocker/cli/main.py, 这个时候,我能够在终端输出 python -m idocker.cli.main 输入如下: ╰─➤ python -m idocker.cli.mainUsage: python -m idocker.cli.main [OPTIONS] COMMAND [ARGS]...Options: --help Show this message and exit.Commands: ps view all container

January 31, 2023 · 1 min · jiezi

关于python:vscode中调试python代码

vscode应用的好,真的不比免费软件差。vscode的代码提醒曾经很好了,debug性能也不差。  前提本文默认PC中曾经装置python3、vscode,微软提供的python插件和Python Extension Pack。  调试代码咱们应用如何创立一个超时后不会被kill的python子过程中的代码来进行调试 import subprocessfrom subprocess import TimeoutExpiredif __name__ == '__main__': try: proc=subprocess.Popen('adb install -g -r -t ~/tmp/app-uiautomator.apk', shell=True, text=True, stdout=subprocess.PIPE)stdout,errs = proc.communicate(timeout=60) print(f'stdout1:\n{stdout}') except TimeoutExpired as te: print('timeout') stdout,errs = proc.communicate() print(f'stdout2:\n{stdout}') 调试设置关上vscode后,应用快捷键shift+command+p后输出setting 关上设置页面,如没有以下配置,请退出以下配置configurations里的代码 { "name":"Python: Current File (Integrated Terminal)", "type":"python", "request":"launch", "program":"${file}", "console":"integratedTerminal"}解释其中要害的配置选项: name 呈现在调试下拉菜单中的名字type 调试类型* request 执行调试的模式,可选luanch和attch其中之一program 填写须要调试的文件的全门路名字,${file}代表以后关上的文件增加后就能够调试以后关上的python文件了。 传递代码运行参数减少args 配置即可 { "name":"Python: Current File (Integrated Terminal)_args", "type":"python", "request":"launch", "program":"${file}", "console":"integratedTerminal", "args":[ "--port", "1593" ]}从新执行后,能够在控制台看到咱们在settings.json中增加的--port和1593参数被打印输出了。 attach形式调试如果参数常常须要变动,把参数写死在配置文件里有时也不太不便,咱们能够应用attach模式来进行调试。  装置debugpypip3 install debugpysetting.json配置增加{ "name":"Python: Attach", "type":"python", "request":"attach", "connect":{ "host":"localhost", "port":5678 }} 在命令行执行程序python3 -m debugpy --listen 5678 --wait-for-client test_subprocess.py 在vscode中执行python attach ...

January 30, 2023 · 1 min · jiezi

关于python:oeasypython0067ESC键进化历史键盘演化过程ANSI控制序列转义序列CSI

光标地位回顾上次内容上次理解了 新的本义模式 \33 逃逸控制字符 esc 这个字符让输入退出规范输入流进行管制信息的设置 能够设置光标输入的地位 ASR33中的ALT MODE 是 明天的ESC吗????查问文档http://bitsavers.org/communic... 在过后还没有esc键的时候 应用ctrl + shift + k实现esc成果起初的键盘 都有了 专门的esc 键escape 跳出当初键盘都有这个按键 个别在左上角退出以后游戏跳出菜单个别用这个 上图esc在 1 的左下Q 的右边能够从以后的纯文字规范输入流外面 逃(escape)进去进行管制信息的传输键盘的进化过程早年间的一体机 当年最风行的 DEC VT100 esc还在1旁边 过后还没有在最左上的地位地位的变动玩一些terminal下面的游戏时 能够退出主游戏进行设置、存盘、读档、退出之类的菜单操作晓得 什么时候退 比晓得 怎么玩更重要 功能键在 最右边 键盘还没有 对立的规范规范键盘这是101 规范键盘 左上角是esc 规范地位 起初放在第一行第一列 escape体现重要性还要用边距和F1之类的拉开距离行业标准键盘开始有了行业标准 能够在ascii外面找到这个esc字符么?esc在下图中尝试找到esc (001 1011)2再到ascii利用找一下esc?ascii找到这个字符 这个esc对应的是 27 - 10进制对应16进制多少呢?1b1b 是(1b)16进制 对应着(27)10进制对应着(33)8进制 下面的别离是 十六进制状态十进制状态八进制状态正如上面 不同的状态都能够 用来本义吗?不同状态不同的本义形式不影响性能 操作大全地位控制代码 CSI 是 Control Sequence Introducer就是esc加[ esc就是\033用的是几进制的模式?\033八进制的 模式 \033[nA 光标上移 n 行\033[nB 光标下移 n 行\033[nC 光标右移 n 行\033[nD 光标左移 n 行\033[y;xH 设置光标地位\033[2J 清屏\033[K 革除从光标到行尾的内容\033[s 保留光标地位\033[u 复原光标地位\033[?25l 暗藏光标\033[?25h 显示光标咱们先试试\033[2J总结本次理解了键盘演变的过程 ...

January 30, 2023 · 1 min · jiezi

关于python:oeasypython0066控制序列光标位置设置ESC逃逸字符CSI

光标地位回顾上次内容上次讲了 三引号的输入三引号中 回车和引号 都会 被原样输入\ 还是须要从 \\本义光明森林 快被摸排清了 还有哪个 转义序列 没 钻研过吗? \e是 干什么的?回顾本义本义本义 转化含意 \反斜杠(backslash)加了之后字符就不是原来的意思了 本义么本义本义 转化含意所以\反斜杠这个字符 也叫做转义字符Escape character\b 这两个字符的序列算是一个转义序列 Escape sequence\ 这个转义字符会让 \b转义序列 本义为 Backspace 这个含意Backspace退格就是这个序列转化含意之后的含意这个转化后的含意也对应一个ascii字符 就是 \b键盘上的退格对应的数值就是8本义 Escape\e是什么意思呢? 本义之后的的含意居然是 escape搜寻后果来捋一捋 \是转义字符 要和前面的字符一起形成转义序列\e是转义序列 本义的含意是 escape所谓本义本义 转化含意转义序列\e对应的字符含意是Escape再次逃逸进来能逃去到哪里呢?逃逸从规范输入序列中逃逸进去 能够让输入 从以后的字符串序列中 逃逸(Escape)进来前面的内容 可就不是 输入的文本 了而是 管制序列(Control Sequence) [10;20H 管制 输入地位 在第10行第20列进行输入这种管制办法 在明天被称为 ANSI escape code 规范咱们来试试入手试验 真的能够定位输入从失常的输入流逃逸到了管制序列!!! 那为什么有管制序列呢?缘起电传打字机 输入的色彩 只能通过 管制色带(相似于墨盒) 来管制 打印色彩的深浅 是物理过程 晚期的终端 通过调节 显示器亮度 来扭转显示成果各个终端的 制造商 都有 本人独特的 控制字符这些特殊字符 是和 机器相干 的彼此 并不兼容但只有 承受到 这些控制字符 ...

January 29, 2023 · 1 min · jiezi

关于python:nameko-队列名的构成规则

以 evt-imdb_produce_service-to_refresh--imdb_consumer_service.refresh 队列举例 投递音讯 dispatch( 'imdb_produce_service', 'to_refresh', message.json(ensure_ascii=False))生产音讯 class ImdbRefreshService: name = 'imdb_consumer_service' @event_handler( source_service='imdb_produce_service', event_type='to_refresh', requeue_on_error=True) def refresh(self, payload: str) -> None: message = Message.parse_raw(payload)所以,nameko 队列的命名规定是: evt-{source_service_name}-{event_type}--{dst_service_name}.{dst_class_func_name}

January 29, 2023 · 1 min · jiezi

关于python:Python-内置界面开发框架-Tkinter入门篇-乙

以下内容为自己的学习笔记,如须要转载,请申明原文链接 微信公众号「englyf」https://mp.weixin.qq.com/s/2G... 本文大略 1685 个字,浏览需花 6 分钟内容不多,但也花了一些精力如要交换,欢送关注我而后评论区留言谢谢你的点赞珍藏分享这篇文章属于系列文章《Python 内置界面开发框架 Tkinter入门篇》的第二篇,上接《Python 内置界面开发框架 Tkinter入门篇 甲》,欢送关注我的微信公众号「englyf」查看这个系列相干文章。 根本控件上一篇里,介绍了局部根本控件,还有局部也须要持续介绍。 Scale 刻度条下面经已介绍的那些控件在动静批改数值时,对于用户来说还是不太不便。为了更不便地批改数值,比方用户能够按住鼠标键间接拖动控件时,数值就会跟着变动,刻度条控件 Scale 就刚好能够实现这样的性能。 上面举个栗子,在主界面增加一个刻度条控件。 import tkinter as tkwindow = tk.Tk()scale = tk.Scale( master=window, orient=tk.VERTICAL, length=150, from_=0, to_=200 )scale.pack()window.mainloop()实例化控件 Scale,参数 orient 指定刻度条方向(VERTICAL 对应垂直方向,HORIZONTAL 对应程度方向),参数 length 设定控件长度(单位为像素), 参数 from_ 设置数值范畴的最小值,参数 to 设置数值范畴的最大值。 获取控件 Scale 的以后值,应用 get(),返回整数值或者浮点数。 设置控件 Scale 的以后值,应用 set(),输出设置的数值。 看看显示成果 拖动两头的滑块,把控件以后值拉到168。 Listbox 列表如果有很多相似的内容须要显示给用户,那么就适宜用到列表控件 Listbox。控件 Listbox 用于显示单行文本项的列表,容许用户浏览列表内容,并且抉择一个或多个选项。 举个例子应用控件 Listbox 来显示花名单 import tkinter as tkwindow = tk.Tk()contents = ["贵爷", "蔡礼佛", "梁老师", "鸡毛", "瘦子"]listvar = tk.StringVar(value=contents)listbox = tk.Listbox( window, bd=2, bg="#dddddd", listvariable=listvar )listbox.grid()contents.append("助班")listvar.set(contents)window.mainloop()实例化控件 Listbox 时,也应用了一个不便疾速操作外部数据的参数 listvariable,相似其它控件的 textvariable 参数,然而因为列表控疾速切换到主题控件件外部治理的是文本列表,所以 listvariable 接管的量必须是列表类型[]。先是间接创立一个列表量,而后传入 StringVar() 转换成非凡格局返回,返回值 listvar 再赋给控件 Listbox 实例化的参数 listvariable。 ...

January 29, 2023 · 2 min · jiezi

关于python:python简单实现对桌面进行实时捕捉画面

介绍最近在钻研指标检测方面的小东西,须要到对桌面进行实时捕获画面,获取画面后再检测,达到实时桌面指标检测的目标,所以写了一段小代码来实现该性能,实测速度很快,合乎我的需要。特此记录一下。 代码import argparseimport timeimport cv2import keyboardimport mssimport numpy as npimport win32com.clientimport win32conimport win32guiclass ScreenCapture: """ parameters ---------- screen_frame : Tuple[int, int] 屏幕宽高,别离为x,y region : Tuple[float, float] 理论截图范畴,别离为x,y,(1.0, 1.0)示意全屏检测,越低检测范畴越小(始终保持屏幕核心为核心) window_name : str 显示窗口名 exit_key : int 完结窗口的退出键值,为键盘各键对应的ASCII码值,默认是ESC键 """ def __init__(self, screen_frame=(1920, 1080), region=(0.5, 0.5), window_name='test', exit_key=0x1B): self.parser = argparse.ArgumentParser() self.parser.add_argument('--region', type=tuple, default=region, help='截图范畴;别离为x,y,(1.0, 1.0)示意全屏检测,越低检测范畴越小(始终保持屏幕核心为核心)') self.parser_args = self.parser.parse_args() self.cap = mss.mss(mon=-1, optimize=True) # 实例化mss,并应用高效模式 self.screen_width = screen_frame[0] # 屏幕的宽 self.screen_height = screen_frame[1] # 屏幕的高 self.mouse_x, self.mouse_y = self.screen_width // 2, self.screen_height // 2 # 屏幕中心点坐标 # 截图区域 self.GAME_WIDTH, self.GAME_HEIGHT = int(self.screen_width * self.parser_args.region[0]), int( self.screen_height * self.parser_args.region[1]) # 宽高 self.GAME_LEFT, self.GAME_TOP = int(0 + self.screen_width // 2 * (1. - self.parser_args.region[0])), int( 0 + 1080 // 2 * (1. - self.parser_args.region[1])) # 原点 self.RESZIE_WIN_WIDTH, self.RESIZE_WIN_HEIGHT = self.screen_width // 4, self.screen_height // 4 # 显示窗口大小 self.mointor = { 'left': self.GAME_LEFT, 'top': self.GAME_TOP, 'width': self.GAME_WIDTH, 'height': self.GAME_HEIGHT } self.window_name = window_name self.Exit_key = exit_key def grab_screen_mss(self, monitor): # cap.grab截取图片,np.array将图片转为数组,cvtColor将BRGA转为BRG,去掉了通明通道 return cv2.cvtColor(np.array(self.cap.grab(monitor)), cv2.COLOR_BGRA2BGR) def run(self): SetForegroundWindow_f = 0 # 判断是否须要置顶窗口 while True: # 判断是否按下 ctrl+U 窗口始终置顶 if keyboard.is_pressed('ctrl+U'): while keyboard.is_pressed('ctrl+U'): continue if SetForegroundWindow_f == 0: SetForegroundWindow_f = 1 time.sleep(1) continue else: SetForegroundWindow_f = 0 img = self.grab_screen_mss(self.mointor) cv2.namedWindow(self.window_name, cv2.WINDOW_NORMAL) # cv2.WINDOW_NORMAL 依据窗口大小设置图片大小 cv2.resizeWindow(self.window_name, self.RESZIE_WIN_WIDTH, self.RESIZE_WIN_HEIGHT) cv2.imshow(self.window_name, img) if SetForegroundWindow_f == 1: shell = win32com.client.Dispatch("WScript.Shell") shell.SendKeys('%') win32gui.SetForegroundWindow(win32gui.FindWindow(None, self.window_name)) win32gui.ShowWindow(win32gui.FindWindow(None, self.window_name), win32con.SW_SHOW) if cv2.waitKey(1) & 0XFF == self.Exit_key: # 默认:ESC cv2.destroyAllWindows() exit("完结")代码解说性能实现思路次要是应用 mss 库进行截图,并应用 opencv 库进行图像显示和解决。 ...

January 24, 2023 · 3 min · jiezi

关于python:oeasypython0054三引号原样显示字符串triplequoted

三引号回顾上次内容\ 首先是转义字符 能够 和别的字符 形成转义序列 \a是 ␇ (bell),\b 退回一格\t 程度制表符\v、\f LineFeed\\ 输入 \\" 输入 "\' 输入 '\xhh 通过 16 进制数值本义\nnn 通过 8 进制数值本义\ 还是 续行字符 放在 行尾能够让 下一行和本行 连成一行 有 什么办法 让字符串 原样输入吗?搜寻STRINGS的帮忙 三引号 援用的 triple-quotes能够 原样输入试炼先试试 回车符 去看看 三引号 的 帮忙手册查看参考 在 帮忙模式下 查找""" 在 三引号 援用中 换行符 和 引号 都会被 原样显示重温本义练习 如果 没有本义的话 会报错不知 字符串 何时完结 把 这些本义 利用起来 如果 下面 最初这句话 用三引号输入的话应该怎么写?不要翻页三引号输入 引号、回车的问题 都主动解决 然而反斜杠(\) 还是 须要本义三引号输入除了反斜杠 须要本义 之外 ...

January 19, 2023 · 1 min · jiezi

关于python:oeasypython0053-续行符linecontinuationpython行尾续行

续行符与三引号回顾上次内容上次还是转义序列类型英文符号\abell响铃\bbackspace退格\ttab程度制表符\vvertical tab垂直制表符换行不回车\\backslash反斜杠\"double quote双引号\'single quote单引号\xhh具体字符输入(hh)16 进制对应的ascii 字符\ooo具体字符输入(nnn)8 进制对应的ascii 字符光明森林曾经慢慢清晰 上图中提到的续行符 line continuation character 是哪个字符呢?神奇的-反斜杠\\是 转义字符 本义本义 转化含意python3 在 多行输入的时候 也有 特地的利用 结尾处有\ 下一行 须要 连在一起来执行尝试上面这种货色 在这里 反斜杠实现的是 续行的成果此处反斜杠 就是 "续行符"line continuation character具体试试 如同 的确能够 这有什么意义吗?编辑文件如果 某一行 特地长 超过了 80个字符就没有必要一行 写完 适当时候加上 续行符 也能失去 相应的成果 各个被加数 对齐看起来 也比拟好看字符串续行符 . 性情是长期连续的习惯(希腊谚语) 运行后果 到底应该如何了解continue呢?contain con 一起ten 拉伸 contain 一起拉伸意思是蕴含着continue一个挨一个 以不间断的间断形式连贯在一起 间断地 continent各大洲原本都是 手拉手连在一起的 所以叫大陆continuationline continuation character 让行也手拉手间断起来的符号 续行符尝试输入个题目(banner)续行符先换行 再续航 换行是\n续航是\ 把高低的行都连起来 能把cowsay输入的 字符画 ...

January 18, 2023 · 1 min · jiezi

关于python:K哥爬虫普法辛苦钱被中间商抽走八成还因此锒铛入狱

我国目前并未出台专门针对网络爬虫技术的法律标准,但在司法实际中,相干裁决已不足为奇,K 哥特设了“K哥爬虫普法”专栏,本栏目通过对实在案例的剖析,旨在进步宽广爬虫工程师的法律意识,通晓如何非法合规利用爬虫技术,警钟长鸣,做一个违法、护法、有准则的技术人员。案情介绍2019年8、9月期间,被告人袁海东、赖永豪通过“猪八戒”网络平台以人民币7500元的价格向苏州市相城区黄埭镇春申湖路电信营业厅理论经营者计某及员工付某(均另案处理)发售了一款名为“telecom.exe”的爬虫软件,该软件依据计某、付某的要求定制,具备依据输出的查问申请头与渠道ID,模仿生成网页申请包,冲破本来登录工号的权限,实现获取不同渠道ID权限内数据的性能。制作过程中,由被告人袁海东作为中间人,与计某、付某议价,理解定制要求,并将技术要求和细节转述给被告人赖永豪,由被告人赖永豪具体负责软件制作,制作实现后,由被告人赖永豪将涉案软件发送给被告人袁海东,由被告人袁海东交付给付某。被告人袁海东得款7500元,并将其中1500元调配给被告人赖永豪。 软件交付后,付某利用该软件从江苏电信营业云平台零碎中获取了苏州市大市范畴内70余万组的电信宽带工单信息。 软件应用应用受权账号登录 “bss.telecomjs.com” 通过订单查问零碎,进行一次订单查问,关上浏览器调试器截取申请头,启动 “telecom.exe”,抉择 “查问渠道”,抉择查问日期、地点、范畴,并输出截取的申请头与渠道ID “21000”,点击 “开始查问”,获取到数据,另存为 “渠道订单_21000.csv”。 供述状况证人计某的证言笔录,证实其为了疾速查问并保留快到期的宽带客户数据,由付某介绍,在“猪八戒”网络平台找到“天辰”(袁海东)制作软件,具体的软件性能由付某进行沟通,计某共计领取7500元软件制作费。 证人付某的证言笔录,2018年11月之后的客户,新零碎每个工号只能查本人渠道的客户,限度十分多。我从订单零碎进去,渠道后面有一个灰色的勾,我右键点击弹出来“查看元素”点击后,会跳进去网页代码,网页代码里能够改渠道。失常来讲,用某渠道员工的BSS零碎工号登录进去是看不全的,只能本渠道,就是本营业厅做的业务订单,看不到他人的订单,然而我用改代码的形式能够看到他人的订单,是改一个叫渠道ID的内容,理论就是改零碎代码的一个操作,而后再填工夫,就能拉进去别的渠道某工夫内所有订单的状况了。这些数据当初能看到,当前不肯定能看到,我和计某也讲了这件事。我说这个数据很多,要保留下来,当前用。我不会搞,我让计某把新零碎客户资料保留下来。 证人周某的证言笔录(身份为电信公司员工),电信营业厅普通员工的工号,权限是很低的,这种工号是营业厅给员工开的,登录时候须要员工刷脸验证,有明码也根本不必,失常都是刷脸登录,同一工号在同一时间只能在一个中央登录。 证人王某的证言笔录(身份为中国电信苏州分公司平安保卫部员工),2018年11月咱们进行了零碎更新,降级后,一般工号能够看到2018年11月之前办理宽带的工单信息,2018年11月之后的工单信息,一般工号只能看到本人受理的工单信息,看不到他人及其他代理商办理的工单信息。 被告人袁海东的供述笔录,供称计某自称是电信运营商,要求做一个复制粘贴宽带客户数据的软件,粘贴后汇总,软件就是要解密破解电信的这个网页零碎,而后获取相干代码或者数据,实现相应性能。赖永豪说数据库有加密,能够做,要价1500元,我和计某要价7500元。起初减少一个渠道查问的性能,填写不同的渠道,而后查问到不同渠道外面的客户信息复制下来。应用的时候登录账号密码,进入江苏电信的界面,关上赖永豪制作的软件,会弹出一个申请头,在外面轻易输出一个工号,就能够看到这个工号的数据。这个软件制作之前,计某他们能够手工操作,通过査看元素输出对方工号进数据库后再下载。 被告人赖永豪的供述笔录,供称我做了一个爬虫软件,能够从中国电信苏州市分公司BSS零碎上查问、复制保留数据信息。2019年8月底9月初,袁海东的客户提供了VPN和登录工号,我近程登录上之后,袁海东把客户的要求通知我,我来做软件。开始客户要我做一个复制粘贴宽带客户数据的软件,粘贴下来,汇总到EXCEL表格里,起初,我听袁海东讲,客户要减少一个查问渠道的选项,在渠道查问里,客户能够本人输出渠道,查问该渠道外面的数据。通过我这个软件,把网络申请复制到申请头,我的软件就和BSS零碎链接起来,在查问渠道选项框里输出不同的渠道,就能够查问到该渠道的信息,不须要手动操作。登录的账号就是一个渠道ID,通过任何一个账号登录下来后,在业务查问网页下,通过查看元素,批改源代码,而后填出想看的工号(就是渠道ID),能够看到任何渠道ID的数据,他们之前就晓得这个操作,我的软件就是省掉了他们的手工输出。如果不批改源代码只能看到登录时应用工号下的信息,其余渠道ID下的数据是没有权限看的。制作这个软件袁海东付给我1500元。 裁决状况被告人袁海东犯提供侵入计算机信息零碎程序罪,判处有期徒刑六个月,并处罚金人民币一万元(刑期从裁决执行之日起计算,裁决执行以前后行羁押的,羁押一日折抵刑期一日,其中2019年12月4日至2020年1月10日被羁押的38日折抵计入刑期,即自2020年11月26日起至2021年4月17日止;已缴纳的人民币一万元于裁决失效之日折抵罚金,并上缴国库);被告人赖永豪犯提供侵入计算机信息零碎程序罪,判处有期徒刑六个月,并处罚金人民币一万元(刑期从裁决执行之日起计算,裁决执行以前后行羁押的,羁押一日折抵刑期一日,其中2019年12月11日至2020年1月10日被羁押的31日折抵计入刑期,即自2020年11月26日起至2021年4月24日止;已缴纳的人民币一万元于裁决失效之日折抵罚金,并上缴国库);被告人袁海东退出的守法所得人民币六千元,予以没收,并上缴国库;责令被告人赖永豪退出守法所得人民币一千五百元,并予以没收,上缴国库;公安机关扣押的作案工具予以没收,由扣押机关依法处理。裁决文书https://wenshu.court.gov.cn/w... 案例剖析本案的用户行为超出了爬虫的界线:仅可采集用户失常拜访的公开数据。个别用某渠道员工的 BSS 零碎工号登录后是无奈查看超过工号权限的数据(只有本营业厅做的业务订单),然而被告人在零碎禁止扭转渠道ID的状况下,通过批改网页源代码中的渠道ID从而非法查看其余渠道的订单信息,形成非法越权。 依据《最高人民法院、最高人民检察院对于办理危害计算机信息系统安全刑事案件利用法律若干问题的解释》第二条第一款第(一)项规定,“具备避开或者冲破计算机信息系统安全保护措施,未经受权或者超过受权获取计算机信息零碎数据的性能的”,该当认定为刑法第二百八十五条第三款规定的“专门用于侵入、非法管制计算机信息零碎的程序、工具”,本案例是合乎的。 早在2013年,被告人袁海东、赖永豪就曾因雷同罪名被上海市公安局长宁分局立案侦查并移送公诉机关,尽管过后法院对他们作出绝对不起诉的决定,不过这次也因而被从重处罚,常在河边走哪有不湿鞋,切忌抱有侥幸心理,游走于灰色地带,究竟面临法律的制裁,对爬虫单应该有足够的意识,剖析其不守法的状况下再去接,切莫千里之堤;溃于蚁穴,得失相当。 这个案例令人眼前一亮的点是,“中间商”袁海东向甲方开价7500元,事成只给了程序员赖永豪1500元,抽成高达80%!赖永豪必定想不到单干多年的“老熟人”,靠他赚的盆满钵满,这也是值得所有程序员们留神的。

January 18, 2023 · 1 min · jiezi

关于python:oeasypython0052-raw格式字符串单引号双引号反引号-退格键

转义字符回顾上次内容最近玩的是\n、\r 之外的转义序列 \a是 ␇ (bell)\t是 程度制表符\v是 换行不回车通过 16 进制数值本义 \xhh把(hh)16 进制对应的 ascii 字符输入通过 8 进制数值本义 \ooo把(nnn)8 进制对应的 ascii 字符输入这次加了 本义输入 反斜杠自身 \\ 输入 \总是本义 还是挺麻烦的是否间接输入原样输入呢? 搜寻帮忙 找到raw stringraw r的含意是 raw原始原样 如果是有r就原样输入为什么raw就是原始原样呢?raw生的食物 没有烤过的血肉模糊那种 也指因为年老无知 而导致的粗鲁 rude因为缺乏经验 而导致的仁慈 crude袒露的肉 nake 在计算机领域呢?raw格局未经压缩的图片、视频 外面有更多的细节 能够进行调色 没有压抑字幕的原版视频 生肉原始的、无需进行本义的字符串 raw string如果没有r呢?本义没有r的话 该本义 还是要本义的 这里 提到了 反斜杠的示意办法 同时也提到了 引号 引号 也须要本义乱尝试我偏不本义 >>> 变成了 ...ctrl+c完结 想要输入引号(\") 必须得 应用反斜杠(\)进行本义 引号的输入引号其实有三种类型英文符号是否须要本义单引号single quotation mark'须要本义双引号double quotation mark"须要本义反引号backquote`不须要本义 如果我想要输入单双引号 也不必本义 有可能么?岔开应用单里有双 就能够 ...

January 17, 2023 · 1 min · jiezi

关于python:os模块的使用方法详解

os模块os模块负责程序与操作系统的交互,提供了拜访操作系统底层的接口;即os模块提供了十分丰盛的办法用来解决文件和目录。 应用的时候须要导入该模块:import os 罕用办法如下:办法名作用 遍历所有文件及文件夹 取得以后python程序运行门路 import osprint(os.getcwd()) # 输入以后代码所在模块的门路# /Users/running/PycharmProjects/chapter04/novel切换目录到chapter03我的项目下: os.chdir('/Users/running/PycharmProjects/chapter03')查看当前目录下的所有文件和文件夹,并判断是否是文件和文件夹 import osfiles = os.listdir()for file in files: print(file, os.path.isdir(file), os.path.isfile(file))输入后果: 或者应用: forfileinos.scandir(): print(file.name, file.path, file.is_dir())能够调用file.stat()获取更加具体的文件信息。如:    其中:st_size:文件的体积大小(单位:bytes),除以1024就是KBst_atime:文件的最近拜访工夫st_mtime:文件的最近批改工夫st_ctime:Windows下示意创立工夫 案例1: 1.键盘输入一个门路2.统计该门路下的文件和文件夹,以及别离的数量3.统计以后门路下蕴含文件名称中蕴含demo的文件数量,留神不辨别大小写 import ospath = input('输出要查问的门路:')os.chdir(path) file_list = []dir_list = []for file inos.scandir(): if file.is_dir(): dir_list.append(file.name) else: file_list.append(file.name)print("文件夹的总量是{},\n文件为别为{}".format(len(dir_list),dir_list))print('{}'.format('-'*30)) print("文件总量是{},\n文件为别为{}".format(len(file_list),file_list))print('{}'.format('-'*30)) python_list = []for name in file_list: if'demo'in name.lower(): python_list.append(name)print('含有python单词的文件数量有{}个,\n文件别离为{}'.format(len(python_list),python_list))如果要遍历一个目录下的所有子目录,外面指定的文件,咱们能够通过递归函数遍历每个目录进行查找或者应用os.walk(),递归实现代码如下: import os import sysfrom stat import *defwalktree(top, callback):for f in os.listdir(top): pathname = os.path.join(top, f) try: mode = os.stat(pathname, follow_symlinks=False).st_mode except: continueif S_ISDIR(mode): # directory, recurse into it walktree(pathname, callback) else: # file, whatever type, make the call back function callback(pathname) returndefprintfile(file): print('get to', file)if __name__ == '__main__': if (os.path.isabs(sys.argv[1]) and os.path.exists(sys.argv[1])): walktree(sys.argv[1], printfile)Python os模块的walk()函数,顾名思义,就是用来遍历目录树的,此函数能够很不便的遍历以输出的门路为root的所有子目录和其中的文件。walk函数是一个Python生成器(generator),调用形式是在一个for...in...循环中,walk生成器每次返回的是一个含有3个元素的tuple,别离是 (dirpath, dirnames, filenames) ...

January 17, 2023 · 2 min · jiezi

关于python:以图搜图如何生成向量

以图搜图的原理:将图片转成向量,而后通过欧式间隔等等比拟向量的间隔,获取两个图片的类似度 那最要害的一步:『将图片转成向量』,如何应用 python 实现呢? 能够应用 image2vector 装置形式很简略 pip install image2vector用起来就更简略了,你不必关怀任何深度学习的货色,只有指定 image 就能无脑生成图片的向量 from pathlib import Pathfrom typing import Listfrom iv import ResNet, l2# Initialize a residual neural networkresnet: ResNet = ResNet( weight_file='weight/gl18-tl-resnet50-gem-w-83fdc30.pth')# Generate a vector of specified images# The generated vector is a List[float] data structure,# the length of the list is 512, which means the vector is of 512 dimensionsvector_1: List[float] = resnet.gen_vector('example-1.jpg')vector_2: List[float] = resnet.gen_vector('example-2.jpg')# Compare the Euclidean distance of two vectorsdistance: float = l2(vector_1, vector_2)print('Euclidean Distance is ', distance)参考: ...

January 17, 2023 · 1 min · jiezi

关于python:Python之configparser模块详解和使用

1 configparser装置pip3 install configparser2 configparser简介用来读取配置文件的python包;个别做自动化测试的时候,会应用到这个模块,用来封装一些常量。比方数据库、邮件、用户名明码、我的项目常量等等;这个应用依据集体爱好和我的项目来确定,不肯定肯定要应用这个模块,也能够应用其它的办法做配置,比方py文件、xml、excel、yaml、json等等。configparser源码大概1360行左右,通读源码可无效理解该模块的应用。本文只做简略介绍罕用的办法。3 示意办法新建一个名为conf.py文件;写入如下数据,格局如下:[mysqldb]sql_host = 127.0.0.1sql_port = 3699sql_user = rootsql_pass = 123456[mailinfo]name = NoamaNelsonpasswd = 123456address = 123456@qq.com4 configparser具体应用4.1 对象初始化写入如下代码,把对象初始化。# -*- coding:utf-8 -*-# 作者:NoamaNelson# 日期:2021/11/19 # 文件名称:conf.py# 作用:configparser模块的应用# 分割:VX(NoamaNelson)# 博客:https://blog.csdn.net/NoamaNelsonimport configparserimport osclass Conf: def __init__(self): self.conf = configparser.ConfigParser() self.root_path = os.path.dirname(os.path.abspath(__file__)) self.f = os.path.join(self.root_path + "/config.conf") self.conf.read(self.f)4.2 获取所有的sections def read_sections(self): print(f"1、获取所有的sections:{self.conf.sections()}")if __name__ == "__main__": aa = Conf() aa.read_sections()后果为:D:\Python37\python.exe F:/python_study/conf.py1、获取所有的sections:['mysqldb', 'mailinfo']4.3 获取所有的sections对应的options def read_options(self, s1, s2): print(f"2、获取mysqldb所有的options:{self.conf.options(s1)}") print(f"3、获取mailinfo所有的options:{self.conf.options(s2)}")if __name__ == "__main__": aa = Conf() aa.read_sections() aa.read_options("mysqldb", "mailinfo")后果为:D:\Python37\python.exe F:/python_study/conf.py1、获取所有的sections:['mysqldb', 'mailinfo']2、获取mysqldb所有的options:['sql_host', 'sql_port', 'sql_user', 'sql_pass']3、获取mailinfo所有的options:['name', 'passwd', 'address']4.4 read办法和get办法,获取指定section下的option值read是读取配置文件,如 self.conf.read(self.f)是读取指定config.conf文件;get是获取具体的值; def read_conf(self, m, n): name = self.conf.get(m, n) # 获取指定section的option值 print(f"4、获取指定section:{m}下的option:{n}的值为{name}")if __name__ == "__main__": aa = Conf() aa.read_sections() aa.read_options("mysqldb", "mailinfo") aa.read_conf("mysqldb", "sql_host")后果为:D:\Python37\python.exe F:/python_study/conf.py1、获取所有的sections:['mysqldb', 'mailinfo']2、获取mysqldb所有的options:['sql_host', 'sql_port', 'sql_user', 'sql_pass']3、获取mailinfo所有的options:['name', 'passwd', 'address']4、获取指定section:mysqldb下的option:sql_host的值为127.0.0.14.5 items办法,获取指导section所用配置信息 def get_items(self, m, n): print(f"5、获取sectoion:{m}下的配置信息为:{self.conf.items(m)}") print(f"6、获取sectoion:{n}下的配置信息为:{self.conf.items(n)}")if __name__ == "__main__": aa = Conf() aa.read_sections() aa.read_options("mysqldb", "mailinfo") aa.read_conf("mysqldb", "sql_host") aa.get_items("mysqldb", "mailinfo")后果为:D:\Python37\python.exe F:/python_study/conf.py1、获取所有的sections:['mysqldb', 'mailinfo']2、获取mysqldb所有的options:['sql_host', 'sql_port', 'sql_user', 'sql_pass']3、获取mailinfo所有的options:['name', 'passwd', 'address']4、获取指定section:mysqldb下的option:sql_host的值为127.0.0.15、获取sectoion:mysqldb下的配置信息为:[('sql_host', '127.0.0.1'), ('sql_port', '3699'), ('sql_user', 'root'), ('sql_pass', '123456')]6、获取sectoion:mailinfo下的配置信息为:[('name', 'NoamaNelson'), ('passwd', '123456'), ('address', '123456@qq.com')]4.6 set和write办法,批改某个option的值如果option不存在则创立它; def set_option(self, m, n, s): self.conf.set(m, n, s) self.conf.write(open(self.f, "w")) print(f"7、设置setion:{m}下的option:{n}的值为:{s}")if __name__ == "__main__": aa = Conf() aa.read_sections() aa.read_options("mysqldb", "mailinfo") aa.read_conf("mysqldb", "sql_host") aa.get_items("mysqldb", "mailinfo") aa.set_option("mysqldb", "sql_name", "游客")后果为:D:\Python37\python.exe F:/python_study/conf.py1、获取所有的sections:['mysqldb', 'mailinfo']2、获取mysqldb所有的options:['sql_host', 'sql_port', 'sql_user', 'sql_pass']3、获取mailinfo所有的options:['name', 'passwd', 'address']4、获取指定section:mysqldb下的option:sql_host的值为127.0.0.15、获取sectoion:mysqldb下的配置信息为:[('sql_host', '127.0.0.1'), ('sql_port', '3699'), ('sql_user', 'root'), ('sql_pass', '123456')]6、获取sectoion:mailinfo下的配置信息为:[('name', 'NoamaNelson'), ('passwd', '123456'), ('address', '123456@qq.com')]7、设置setion:mysqldb下的option:sql_name的值为:游客因为之前的配置文件中没有sql_name,所以会新创建它,如果创立的内容存在,间接批改对应的值; 4.7 has_section和has_option办法has_section办法查看对应的section是否存在;has_option办法查看对应的option是否存在; def has_s_o(self, s, o): print(f"8、查看section:{s}是否存在:{self.conf.has_section(s)}") print(f"9、查看section:{s}下的option:{o}是否存在:{self.conf.has_option(s, o)}")if __name__ == "__main__": aa = Conf() aa.read_sections() aa.read_options("mysqldb", "mailinfo") aa.read_conf("mysqldb", "sql_host") aa.get_items("mysqldb", "mailinfo") aa.set_option("mysqldb", "sql_name", "游客") aa.has_s_o("mysqldb", "sql_name")后果为:D:\Python37\python.exe F:/python_study/conf.py1、获取所有的sections:['mysqldb', 'mailinfo']2、获取mysqldb所有的options:['sql_host', 'sql_port', 'sql_user', 'sql_pass', 'sql_name']3、获取mailinfo所有的options:['name', 'passwd', 'address']4、获取指定section:mysqldb下的option:sql_host的值为127.0.0.15、获取sectoion:mysqldb下的配置信息为:[('sql_host', '127.0.0.1'), ('sql_port', '3699'), ('sql_user', 'root'), ('sql_pass', '123456'), ('sql_name', '游客')]6、获取sectoion:mailinfo下的配置信息为:[('name', 'NoamaNelson'), ('passwd', '123456'), ('address', '123456@qq.com')]7、设置setion:mysqldb下的option:sql_name的值为:游客8、查看section:mysqldb是否存在:True9、查看section:mysqldb下的option:sql_name是否存在:True4.8 add_section办法,增加section和optionadd_section:增加section;增加前: def add_s_o(self, s, o, v): if not self.conf.has_section(s): self.conf.add_section(s) print(f"10、增加新的section为{s}") else: print(f"10、增加新的section为{s}曾经存在,无需增加!") if not self.conf.has_option(s, o): self.conf.set(s, o, v) print(f"11、要增加的option为{o}, 值为{v}") else: print(f"11、要增加的option为{o}, 值为{v},曾经存在,无需增加!") self.conf.write(open(self.f, "w"))if __name__ == "__main__": aa = Conf() aa.read_sections() aa.read_options("mysqldb", "mailinfo") aa.read_conf("mysqldb", "sql_host") aa.get_items("mysqldb", "mailinfo") aa.set_option("mysqldb", "sql_name", "游客") aa.has_s_o("mysqldb", "sql_name") aa.add_s_o("login", "name", "root")增加后:D:\Python37\python.exe F:/python_study/conf.py1、获取所有的sections:['mysqldb', 'mailinfo']2、获取mysqldb所有的options:['sql_host', 'sql_port', 'sql_user', 'sql_pass', 'sql_name']3、获取mailinfo所有的options:['name', 'passwd', 'address']4、获取指定section:mysqldb下的option:sql_host的值为127.0.0.15、获取sectoion:mysqldb下的配置信息为:[('sql_host', '127.0.0.1'), ('sql_port', '3699'), ('sql_user', 'root'), ('sql_pass', '123456'), ('sql_name', '游客')]6、获取sectoion:mailinfo下的配置信息为:[('name', 'NoamaNelson'), ('passwd', '123456'), ('address', '123456@qq.com')]7、设置setion:mysqldb下的option:sql_name的值为:游客8、查看section:mysqldb是否存在:True9、查看section:mysqldb下的option:sql_name是否存在:True10、增加新的section为login11、要增加的option为name, 值为root ...

January 17, 2023 · 3 min · jiezi

关于python:oeasypython0051-转义escape字符character单引号双引号反引号-退格键

转义字符回顾上次内容上次钻研的是进制转化10进制能够转化为其余模式 binocthex其余进制也能够转化为10进制 int能够设置base来决定转为多少进制回顾一下 咱们为什么会有八进制?因为须要用八进制输入转义字符 \ooo 把(ooo)8进制对应的ascii字符输入就如同 \xhh 把(hh)16进制对应的ascii字符输入比方输入\n、\r等那我想只输入\这个字符能够吗?\ 叫什么字符来着?转义字符\ 是 转义字符 本义本义 转化含意escape character能够将前面的字符本义原来字符是 \ 这个\是一个转义字符\n是一个转义序列 将n进行本义转为换行符 也能够间接本义输入 8进制数 "\ooo""\012"16进制数 "\xhh""\x0a"\ 反斜杠 backslash 是转义字符如果 想要输入的字符 就是反斜杠\自身 那应该 怎么办?去试试尝试 这反斜杠(\\)无奈输入去搜一下!搜寻后果 具体方法是什么呢?具体方法答案就是用两个反斜杠 \\ 第一个反斜杠是 转义字符\第二个反斜杠是 被本义的字符也就是说转义序列\\ 对应着ascii码表中的\自身这样就能够输入\了输入一个反斜杠两个反斜杠 就行了 在 输入的时候 成了 一个反斜杠转义字符的输入 如果 我要输入 两个\ 应该如何 呢?多个\ 2个变1个4个变2个 能不能不本义 间接就原样输入呢?总结最近玩了\n、\r 之外的转义序列 \a是 ␇ (bell)\t是 程度制表符\v是 换行不回车通过 16 进制数值本义 \xhh把(hh)16 进制对应的 ascii 字符输入通过 8 进制数值本义 \ooo把(ooo)8 进制对应的 ascii 字符输入这次加了 本义输入 反斜杠自身 \\ 输入 \总是本义 ...

January 16, 2023 · 1 min · jiezi

关于python:如何使用-resnet-生成图片向量

有什么 python 的包能够间接生成图片的向量吗?用于以图搜图,比拟图片的类似度? 有什么封装好的 python 的包,能够间接生成图片的向量吗?有什么封装好的 python 的包,能够开箱即用,间接生成图片的向量吗?有什么封装好的 python 的包,能够通过 resnet,残差神经网络开箱即用,间接生成图片的向量吗? 当然有了,看这个:https://github.com/ponponon/i... from pathlib import Pathfrom typing import Listfrom iv import ResNet, l2# Initialize a residual neural networkresnet: ResNet = ResNet( weight_file='weight/gl18-tl-resnet50-gem-w-83fdc30.pth')# Generate a vector of specified images# The generated vector is a List[float] data structure,# the length of the list is 512, which means the vector is of 512 dimensionsvector_1: List[float] = resnet.gen_vector('example-1.jpg')vector_2: List[float] = resnet.gen_vector('example-2.jpg')# Compare the Euclidean distance of two vectorsdistance: float = l2(vector_1, vector_2)print('Euclidean Distance is ', distance)非常简单,开箱即用 ...

January 16, 2023 · 1 min · jiezi

关于python:关于-变址图像indexed-image-的一些总结

最近在搞一个图片算法,须要对图片做统一化的解决 具体见 一通道的图片都是灰色的吗?然而遇到了上面的问题: Palette images with Transparency expressed in bytes should be converted to RGBA images所以考察了一些对于 indexed image 的材料(相干材料很扩散) 参考了上面的材料:变址图像Single channel png displayed with colorsIndexed ImagesMenu of the other Photo and Flash pages here 子问题答复: indexed image 应该转成 GRB 还是 RGBA?indexed image 反对全副的图片格式吗?比方 jpg、png、tif、gif 等等如果应用 python 判断一个单通道的图片是『灰度图』还是 『indexed image』 ?

January 16, 2023 · 1 min · jiezi

关于python:模糊哈希fuzzy-hash对比文件相似度

比照两个文件类似度,python中可通过difflib.SequenceMatcher/ssdeep/python_mmdt/tlsh实现,在大量须要比照,且文件较大时,须要更高的效率,能够思考含糊哈希(fuzzy hash),如ssdeep/python_mmdt 测试过程发现: difflib办法,读取文件后,能够实现匹配度输入ssdeep/mmdt/tlsh办法能够实现,实现提前含糊哈希值,验证时,只读取一次,实现比照,从而优化比照工夫,及内存/cpu耗费tlsh测试时,值越小,类似度越高,在比照小文件时,很不现实在比照小文件时,三种办法相差不大,在比照大文件(案例中81MB),difflib办法慢的难以承受在理论环境中,倡议应用mmdt办法,因为ssdeep在二进制比照中差异较大,失去参考价值,具体还有哪些文件类型存在此问题有待考量,测试环境:OS:ubuntu20.04python:3.8.10py-tlsh==4.7.2python-mmdt==0.3.1ssdeep==3.4 # -*- coding: utf-8 -*-import ssdeepimport timefrom python_mmdt.mmdt.mmdt import MMDTfrom difflib import SequenceMatcherdef difflib_test(file1,file2): start_time = time.time() with open(file1,'rb') as f: s1 = f.read() with open(file2,'rb') as f: s2 = f.read() match_obj = SequenceMatcher(None,s1,s2) print("difflib match:",match_obj.ratio()) end_time = time.time() print('difflib_test cost :',end_time-start_time)def mmdt_test(file1,file2): start_time = time.time() mmdt=MMDT() r1 = mmdt.mmdt_hash(file1) print(r1) r2 = mmdt.mmdt_hash_streaming(file2) print(r2) # sim1 = mmdt.mmdt_compare(file1, file2) # print("mmdt match:",sim1) sim2 = mmdt.mmdt_compare_hash(r1, r2) print("mmdt match:",sim2) end_time = time.time() print('mmdt_test cost :',end_time-start_time)def ssdeep_test(file1,file2): start_time = time.time() sig1=ssdeep.hash_from_file(file1) sig2=ssdeep.hash_from_file(file2) print(sig1) print(sig2) print("ssdeep match:",ssdeep.compare(sig1,sig2)) end_time = time.time() print('ssdeep_test cost :',end_time-start_time)if __name__ == '__main__': start_time = time.time() file1='/root/test/fstab' file2='/root/test/fstab2' # file1 = '/root/test/initrd.img-5.4.0-125-generic' # file2 = '/root/test/initrd.img-5.4.0-135-generic' mmdt_test(file1,file2) ssdeep_test(file1,file2) difflib_test(file1,file2) end_time = time.time() print('总执行工夫:',end_time-start_time)上面给出比照小文件/大文件成果: ...

January 16, 2023 · 1 min · jiezi

关于python:oeasypython0048取整intfloat浮点型cast扮演tab制表键制表符

转化为10进制回顾上次内容上次 把其余进制 转化回 十进制 用的是 int 函数int 来自于 integer 同源词 还有 integrateentire意思都是残缺的残缺的 和 零散的 绝对能够把 零散的小数 转化为 残缺的整数吗?取整能够 把一个浮点型的小数 取整 取整 可能会造成 运算后果的 不同 3.3 是 一个浮点型 的 小数 当初 把他当做 一个整数这个过程叫做castcastcast原意是投掷 cast a spell 施法 投一个咒语cast a vote 投票cast 铸造 把铁水投入到磨具中 plaster cast 铸造石膏 投影cast a shadow 投上一层暗影 表演成 手通过 cast 成为鹿人表演成其余的角色演员表 一部戏的整体演员 数据类型的转化也是一种表演cast咱们 让3.3 表演(cast)了 3这样一个角色 甚至能够让 表演 3这个角色 字符串还能够 让字符串"3" 表演 整数3 这个角色 但无奈让 字符串"3.3" 表演 整数3 这个角色 ...

January 14, 2023 · 1 min · jiezi

关于python:python中ospath常用属性和部分使用方法

1 os.path 模块罕用的属性和办法<caption> os.path 模块罕用的属性和办法 </caption> 办法 阐明 os.path.abspath(path) 返回 path 的绝对路径。 os.path.basename(path) 获取 path 门路的根本名称,即 path 开端到最初一个斜杠的地位之间的字符串。 os.path.commonprefix(list) 返回 list(多个门路)中,所有 path 共有的最长的门路。 os.path.dirname(path) 返回 path 门路中的目录局部。 os.path.exists(path) 判断 path 对应的文件是否存在,如果存在,返回 True;反之,返回 False。和 lexists() 的区别在于,exists()会主动判断生效的文件链接(相似 Windows 零碎中文件的快捷方式),而 lexists() 却不会。 os.path.lexists(path) 判断门路是否存在,如果存在,则返回 True;反之,返回 False。 os.path.expanduser(path) 把 path 中蕴含的 "~" 和 "~user" 转换成用户目录。 os.path.expandvars(path) 依据环境变量的值替换 path 中蕴含的 "$name" 和 "${name}"。 os.path.getatime(path) 返回 path 所指文件的最近拜访工夫(浮点型秒数)。 os.path.getmtime(path) 返回文件的最近批改工夫(单位为秒)。 os.path.getctime(path) 返回文件的创立工夫(单位为秒,自 1970 年 1 月 1 日起(又称 Unix 工夫))。 os.path.getsize(path) 返回文件大小,如果文件不存在就返回谬误。 os.path.isabs(path) 判断是否为绝对路径。 os.path.isfile(path) 判断门路是否为文件。 os.path.isdir(path) 判断门路是否为目录。 os.path.islink(path) 判断门路是否为链接文件(相似 Windows 零碎中的快捷方式)。 os.path.ismount(path) 判断门路是否为挂载点。 os.path.join(path1[, path2[, ...]]) 把目录和文件名合成一个门路。 os.path.normcase(path) 转换 path 的大小写和斜杠。 os.path.normpath(path) 标准 path 字符串模式。 os.path.realpath(path) 返回 path 的实在门路。 os.path.relpath(path[, start]) 从 start 开始计算相对路径。 os.path.samefile(path1, path2) 判断目录或文件是否雷同。 os.path.sameopenfile(fp1, fp2) 判断 fp1 和 fp2 是否指向同一文件。 os.path.samestat(stat1, stat2) 判断 stat1 和 stat2 是否指向同一个文件。 os.path.split(path) 把门路宰割成 dirname 和 basename,返回一个元组。 os.path.splitdrive(path) 个别用在 windows 下,返回驱动器名和门路组成的元组。 os.path.splitext(path) 宰割门路,返回路径名和文件扩展名的元组。 os.path.splitunc(path) 把门路宰割为加载点与文件。 os.path.walk(path, visit, arg) 遍历path,进入每个目录都调用 visit 函数,visit 函数必须有 3 个参数(arg, dirname, names),dirname 示意当前目录的目录名,names 代表当前目录下的所有文件名,args 则为 walk 的第三个参数。 os.path.supports_unicode_filenames 设置是否能够将任意 Unicode 字符串用作文件名。2 简略示例在一个工程或者我的项目中用到的会多一点,比方须要失去某个文件或者配置文件的门路等。这里示例为:C:\Users\Administrator\Desktop\test_os_path.py# -*- coding:utf-8 -*-# 作者:NoamaNelson# 日期:2021/7/10 18:23# 文件名称:test_os_path.py# 作用:os.path应用import osclass StudyOS: def os_path(self): os_path = os.path.abspath(__file__) print(f"1、以后执行文件的门路为:{os_path}") def os_path_d(self): os_path = os.path.dirname(os.path.abspath(__file__)) print(f"2、以后执行文件的目录门路为:{os_path}") def os_path_dd(self): os_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) print(f"3、以后执行文件的目录门路的目录门路为:{os_path}") def os_path_b(self): os_path = os.path.basename(__file__) print(f"4、以后执行文件的名称为:{os_path}") def os_path_e(self): os_path = os.path.exists(__file__) print(f"5、以后执行文件是否存在:{os_path}") if __name__ == "__main__": mpath = StudyOS() mpath.os_path() mpath.os_path_d() mpath.os_path_dd() mpath.os_path_b() mpath.os_path_e()输入为: ...

January 14, 2023 · 2 min · jiezi

关于python:oeasypython0045转化为10进制数intintegrateintegerentire整数

转化为10进制回顾上次内容上这次总结了四种进制函数名对应单词进制类型数字事例前缀bin()binary20b11000010boct()octal80o1410ohex()hexadecimal160x610x?decimal1097无十进制数 能够转化 为 其余进制 的 字符串状态那反过来 其余进制状态的字符串 能够转化回 10进制吗?转回 10进制能够用 int 函数 这个 int 什么来历?int 函数help(int) int 来自于integer 整数能够 把字符串 转化为整数吗?int("011")的确能够 将其余进制状态的字符串 转化为整数 然而要加上base=0这样的参数 base 能够 设置为2么?base=2base 根底这里指的是基数基数为2 就是 二进制的数base=2 就是 用二进制的形式 了解字符串 基数base 能够 不是常见的2、8、10、16吗?非凡 基数只有设置好 base就能够 如何了解 函数int 所对应的 integer这个词呢?integer(整型)integer 意思是整的 和零散相同 integer in 没有teger *tag-touch接触过interger 是残缺的 相似的单词还有 integralintegralintegral [ntrl] 残缺的; 不可或缺的; 必须的; 作为组成部分的; 齐备的;integral calculus 积分运算integrality 完整性;齐全;圆满;integrant 形成整体的; 因素;组成部分;integrate 整合集成电路芯片 ICC Integrated Circuit Chip把分立件集成到一块电路板上 integrate 又能够派生有一系列单词integratereintegrate 重返; 重建integration ...

January 13, 2023 · 1 min · jiezi

关于python:基于Python+uiautomation的windowsGUI自动化测试概述

1 前言始终应用Python做自动化测试,近期遇到了要对桌面端软件即windowsGUI进行自动化测试。Python的GUI自动化测试工具有很多,然而都有不同的侧重点。本次会具体阐明为啥抉择uiautomation来做测试。 2 PythonGUI工具2.1 罕用的PythonGUI编程工具详情参考:https://blog.csdn.net/NoamaNelson/article/details/113678356 工具官网简介wxPythonhttps://www.wxpython.org/wxPython 是 Python 语言的一套优良的 GUI 图形库,容许 Python 程序员很不便的创立残缺的、功能键全的 GUI 用户界面Kivyhttps://kivy.org/#homevy是一个开源工具包可能让应用雷同源代码创立的程序能跨平台运行。它次要关注创新型用户界面开发,如:多点触摸应用程序。Kivy还提供一个多点触摸鼠标模拟器。以后反对的平台包含:Linux、Windows、Mac OS X和AndroidFlexxhttps://flexx.readthedocs.io/...Flexx 是一个纯 Python 工具包,用来创立图形化界面应用程序。其应用 Web 技术进行界面的渲染。你能够用 Flexx 来创立桌面利用,同时也能够导出一个利用到独立的 HTML 文档。因为应用纯 Python 开发,所以 Flexx 是跨平台的。PyQthttps://www.riverbankcomputin...PyQt是Qt库的Python版本。PyQt3反对Qt1到Qt3。 PyQt4反对Qt4。它的首次公布也是在1998年,然而过后它叫 PyKDE,因为开始的时候SIP和PyQt没有离开。PyQt是用SIP写的。PyQt 提供 GPL版和商业版Tkinterhttps://docs.python.org/zh-cn...Tkinter(也叫Tk接口)是Tk图形用户界面工具包规范的Python接口。Tk是一个轻量级的跨平台图形用户界面(GUI)开发工具。Tk和Tkinter能够运行在大多数的Unix平台、Windows、和Macintosh零碎Pywin32https://pypi.org/project/pywi...Windows Pywin32容许你像VC一样的模式来应用PYTHON开发win32利用PyGTKhttps://iowiki.com/pygtk/pygt...PyGTK让你用Python轻松创立具备图形用户界面的程序.底层的GTK+提供了各式的可视元素和性能,如果须要,你能开发在GNOME桌面零碎运行的性能残缺的软件pyui4win域名停更pyui4win是一个开源的采纳自绘技术的界面库。反对C++和python,用它能够很容易实现QQ和360安全卫士这样的壮丽界面。而且,pyui4win有所见即所得界面设计器,让C++开发人员和python开发人员间接用2.2 罕用PythonGUI自动化测试工具具体比照参考:https://blog.csdn.net/m0_37602827/article/details/108308991 工具官网简介pywinautohttps://pypi.org/project/pywi...次要应用到 Application 类,用于应用程序治理(关上与敞开利用等)、窗口治理(最小化、最大化、敞开窗口)Pywin32https://pypi.org/project/pywi...蕴含 win32gui、win32api、win32con 3个子模块,用于窗口治理(定位窗口、显示和敞开窗口、获取窗口地位等)pyautoguihttps://pyautogui.readthedocs...屏幕管制(截屏等)、鼠标管制(挪动鼠标、单击、双击、右击、拖拽等)、键盘管制(编辑、按键等)2.3 阐明通过前边的介绍,咱们次要是用例进行自动化测试的,所有pythonGUi编程的一些工具就用不到了。而罕用的那三种pythonGUI自动化测试工具,有反对的平台无限,所以通过一番折腾,看到大神应用uiautomation,通过验证该工具很不错,用起来也不便。 3 uiautomation简介3.1 作者博客https://www.cnblogs.com/Yinkaisheng/p/3444132.html 3.2 uiautomation信息获取博客:https://www.cnblogs.com/Yinkaisheng/p/3444132.htmlgithub:https://github.com/yinkaisheng/Python-UIAutomation-for-Windows/blob/master/readme_cn.md3.3 大体内容uiautomation是作者业余时间开发的供本人应用的一个python模块;所以装置的时候间接:pip install uiautomationUIAutomation实现的自动化反对微软提供的各种界面开发框架,如Win32, MFC, Windows Forms, WPF, Metro App, IE;另外Qt, Firefox, Chrome实现了UI Automation Provider,也反对UIAutomation;作者用Python和C++对UIAutomation做了一层封装,不便我本人的应用,能够疾速开发自动化脚本;UIAutomation反对平台包含Windows XP(SP3),Windows Vista, Windows 7, Windows 8、8.1、10;4 uiautomation应用办法4.1 罕用办法1、WindowContrl(searchDepth,ClassName,SubName) # 查找窗口中的程序,如果有中文则需用Unicode;可用window.Exists(maxSearchSeconds)来判断此窗口是否存在;2、EditControl(searchFromControl) # 查找编辑地位,找到后可用DoubleClick()来扭转电脑的focus;edit.SetValue(“string”)输出值;3、Win32API.SendKeys(“string”) # 如果已在编辑地位,则可用此办法来输出值,{Ctrl}为ctrl键,其余相似;{@ 8}格局可输出8个@,对于数字也可实现此性能,但对于字母不能…;4、MenuItemControl(searchFromControl,Name) # 查找菜单按钮;5、ComboBoxControl(searchFromControl,AutomationI) # 查找下拉框,而后在此基础上用Select(“name”)办法来抉择须要的选项;6、BottonControl(searchFromControl,Name,SubName) # 查找按钮;7、automation.FindControl(firefoxWindow, lambda c:(isinstance(c, automation.EditControl) or isinstance(c, automation.ComboBoxControl)) and c.Name == 'Enter your search term') # 按条件搜寻handle4.2 句柄罕用操作Click() # 点击;RighClik() # 右键点击;SendKeys() # 发送字符;SetValue() # 传值,个别对EditControl用;4.3 windows程序罕用操作subprocess.Popen(‘Name’) # 用过程关上程序;window.Close() # 敞开窗口;window.SetActive() # 应用;window.SetTopMost() # 设置为顶层window.ShowWindow(uiautomation.ShowWindow.Maximize) # 窗口最大化window.CaptureToImage(‘Notepad.png’) # 截图uiautomation.Win32API.PressKey(uiautomation.Keys.VK_CONTROL) # 按住Ctrl键uiautomation.Win32API.ReleaseKey(uiautomation.Keys.VK_CONTROL) # 开释Ctrl键automation.GetConsoleWindow() # return console window that runs python,关上控制台automation.Logger.ColorfulWriteLine(’\nI will open <Color=Green>Notepad and <Color=Yellow>automate it. Please wait for a while.’) # 控制台传值(黑白字体),一般传值用WriteLine;automation.ShowDesktop() # 显示桌面;4.4 句柄的抓取间接运行automation模块枚举窗口时,反对下列参数(从doc窗口运行automation.py程序 ): ...

January 13, 2023 · 2 min · jiezi

关于python:Python字典和集合初窥

1 字典字典和列表相似,同样是可变序列,不过与列表不同,字典是无序的。字典的次要特色: 次要特色 解释 通过键而不是通过索引来读取元素 字典类型有时也称为关联数组或者散列表(hash)。它是通过键将一系列的值分割起来的,这样就能够通过键从字典中获取指定项,但不能通过索引来获取。 字典是任意数据类型的无序汇合 和列表、元组不同,通常会将索引值 0 对应的元素称为第一个元素,而字典中的元素是无序的。 字典是可变的,并且能够任意嵌套 字典能够在原处增长或者缩短(无需生成一个正本),并且它反对任意深度的嵌套,即字典存储的值也能够是列表或其它的字典。 字典中的键必须惟一 字典中,不反对同一个键呈现屡次,否则只会保留最初一个键值对。 字典中的键必须不可变 字典中每个键值对的键是不可变的,只能应用数字、字符串或者元组,不能应用列表。 1.1 字典的创立和删除字典的每个元素都蕴含“键”和“值”'“键”和“值”之间应用“ : ”号(冒号)隔开所有元素放在一个大{}中语法:mydict = {"key1": "value1", "key2": "value2", "key3": "value3", ..., "keyn":"valuen"}阐明: ①mydict :字典名称 ②key1-keyn:元素的键,惟一的,不可变,能够是字符串、数字、元组等 ③value1-valuen:元素的值,任意数据,不惟一。# -*- coding:utf-8 -*-# 创立字典student_info = {"name": "susan", "age": 18, "number": 123456, "date": 20201229}print(student_info)# 创立空字典my_dict = {}my_dict1 = dict()print(my_dict)print(my_dict1)后果: {'name': 'susan', 'age': 18, 'number': 123456, 'date': 20201229}{}{}# -*- coding:utf-8 -*-# 1、通过映射函数创立字典# mydict = dict(zip(list1, list2))# zip()是将多个列表或元组对应地位的元素组合为元组,返回蕴含这些内容的zip对象,可应用list、tuple将zip对象转换为列表和元组list1 = {"name", "age", "number", "date"}list2 = {"susan", 18, 12345678, 20201229}mydict = dict(zip(list1, list2))print(mydict)# 2、通过给定的“关键字参数”创立字典# my_dict = dict(key1=value1, key2=valye2, ...)my_dict = dict(姓名="susan", 年龄=20, 学号=12345678, 日期=20201229)print(my_dict)# 3、应用dict对象的fromkeys()办法创立值为空的字典# my_dict1 = dict.fromkeys(mylist)mylist = ["姓名", "年龄", "学号", "日期"]my_dict1 = dict.fromkeys(mylist)print(my_dict1)# 4、应用曾经存在的列表和元组创立字典my_tuple = ("姓名", "年龄", "学号", "日期")my_list2 = ["susan", 18, 12345678, 20201229]my_dict2 = {my_tuple:my_list2}print(my_dict2)后果: ...

January 13, 2023 · 3 min · jiezi

关于python:从基础掌握Python的列表和元组

1 序列序列是一块可寄存多个值的间断内存空间,这些值按肯定顺序排列,可通过每个值所在位置的编号(称为索引)拜访它们。Python序列构造次要有列表、元组、汇合、字典和字符串;1.1 索引序列中,每个元素都有属于本人的编号(索引)。从起始元素开始,索引值从 0 开始递增。也能够为正数即从右到左计数;也能够为正数即从右到左计数;name = ["zhangsan", "lisi", "wangwu"]print(name[0])print(name[2])print(name[-1])后果: zhangsanwangwuwangwu1.2 切片语法:name[start : end : step]name:示意序列名称;start:切片开始地位,默认为0end:切片截止地位,默认为序列的长度step:切片步长,默认为1name = ["火影", "鸣人", "佐助", "小樱"]num = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]print(name[0:2])print(name[0:2:1])print(num[0:9:2])print(name[:])print(name)后果: ['火影', '鸣人']['火影', '鸣人'][1, 3, 5, 7, 9]['火影', '鸣人', '佐助', '小樱']['火影', '鸣人', '佐助', '小樱']1.3 序列相加两个序列类型必须雷同相加行将两个序列进行连贯应用 “ + ” 即可num_str = ["1", "2", "3", "4", "5"]num = [1, 2, 3, 4, 5]name_str = ["路飞", "索洛", "乔巴", "山治", "娜美"]num_new = num + num_strprint(num_new)name_str_new = name_str + num_strprint(name_str_new)后果: ...

January 13, 2023 · 4 min · jiezi

关于python:oeasypython0045四种进制binaryoctaldecimalhexadecimal

四种进制回顾上次内容上次钻研了 通过 八进制数值 本义 \ooo把(ooo)8进制对应的ascii字符输入转义序列 \n、\t 是 转义序列\xhh 也是 转义序列\ooo 还是 转义序列 当初 总共有 几种进制 了呢?先数一下 树数树树 就是这么多棵树 用八进制的形式 数树八进制八根手指头 (13)8进制棵 这是用 八根手指头 数的 如果换成 十根手指头呢?10进制用十根手指头数树 (11)10进制棵 到底多少棵树?哪个才对呢? (13)8进制棵(11)10进制棵数树在不同进制下 有不同的数值都是正确的 不同的进制 只是表现形式 不同而已不会影响 树的数量实质 不变表现形式树 就是这么多棵 树 示意模式 不同能够将数字 示意为 二进制八进制十进制十六进制为什么会有 各种进制模式 呢?10进制、2进制、16进制10进制 是因为人的生理构造 2进制 电灯、开关等电器有两种状态那为什么有16进制? 难道说是因为有十六根手指?16进制16进制 并不是因为 谁 有十六根手指 而是因为 能够用 两个16进制数字 来形容字节状态 那为什么 会有八进制呢?谁有 八根手指吗?八进制现实生活中的鸡 一只脚 就有 四只脚趾大拇指在 最初面个别走兽 每只脚都是 四只脚趾如果他们 有进制的话是八进制 除了鸭子 鸭子天生就不适宜数数 以上都为玩笑话...输入字符八进制 不便输入字符 用纯数字的形式\ooo ...

January 12, 2023 · 1 min · jiezi

关于python:Azure-python-代码报错AADSTS500011-问题解决方法

error:明天 python sdk 登录到Azure 时常遇到”azure.core.exceptions.ClientAuthenticationError: Authentication failed: AADSTS500011 The resource principal named https://management.azure.com was not found“这个谬误。 替换 https://management.azure.com 为国内地址即 可management.chinacloudapi.cn参照如下即可解决compute_client = ComputeManagementClient( credential=credential, subscription_id=Subscription_Id, base_url='https://management.chinacloudapi.cn', credential_scopes=["https://management.chinacloudapi.cn/.default"])起因:

January 12, 2023 · 1 min · jiezi

关于python:如何使用-Pandas-清洗的二手房数据并存储文件

一、实战场景如何应用 Pandas 荡涤的二手房数据并存储文件 二、知识点python 根底语法 python 文件读写 pandas 数据荡涤 三、菜鸟实战荡涤前的文件 读取源文件 def do_clean_data(self): # 执行荡涤 clean_data_raw_file_path = self.fileManger.get_data_file_path(self.clean_data_raw_file) if not os.path.isfile(clean_data_raw_file_path): # 确认文件存在 self.logger.error("须要荡涤的文件不存在") print("须要荡涤的文件不存在") return False # 存储荡涤数据数组, 先把文件头部存储 new_row_arr = [] # 从荡涤文件读取须要荡涤的数据 raw_df = pd.read_csv(clean_data_raw_file_path, encoding=self.encoding) for idx in tqdm.trange(len(raw_df.values)): row = raw_df.values[idx] if self.check_row_is_valid(row): # 查看 row 的合法性 new_row = self.clean_row(row) new_row_arr.append(new_row) # 保留文件 self.save_to_clean_file(new_row_arr)对二手房数据进行荡涤 from base_cleaner import BaseDataCleanerimport timeimport platformclass Tao365Cleaner(BaseDataCleaner): # 逐行读取文件,进行数据荡涤 clean_data_raw_file = "tao365_detail.csv" # 要执行数据荡涤的文件 clean_data_result_file = 'tao365_clean.csv' # 数据荡涤的后果文件 clean_data_result_file_head = ['题目', '价格', '每平方价格', '小区', '地址', '屋宇户型', '建筑面积', '所在楼层', '屋宇朝向', '修建年代', '建成年份', '原始屋宇户型'] # 数据荡涤的后果文件的头部信息 def check_row_is_valid(self, raw_row): # 查看以后行是否无效 area = '区' in raw_row[4] if area == False: return False year = '年' in raw_row[9] if year == False: return False return True def clean_row(self, raw_row): # 执行单行荡涤 # self.logger.info("以后荡涤数据: ", raw_row) # print(raw_row) # 题目 title = raw_row[0] # 价格 price = self.get_price(raw_row[1]) # 每平方价格 avg_price_per_square_meter = self.get_avg_price_per_square_meter(raw_row[2]) # 小区 housing = self.get_community(raw_row[3]) # 地址 area = self.get_area(raw_row[4]) # 屋宇户型 house_type = self.get_room_count(raw_row[5]) house_type_2 = raw_row[5] # 建筑面积 acreage = self.get_area_size(raw_row[6]) # 所在楼层 level = self.get_floor(raw_row[7]) # 屋宇朝向 direction = raw_row[8] # 年代 year = self.get_year(raw_row[9]) # 建成年份 time = self.get_house_age(year) # 数据转换 new_row = [title, price, avg_price_per_square_meter, housing, area, house_type, acreage, level, direction, year, time, house_type_2] return new_row def get_price(self, row): # 售价 price = row.replace('万', '') return int(float(price)) def get_avg_price_per_square_meter(self, row): # 每平方米均价 avg_price_per_square_meter = row.replace('元/m²', '') return avg_price_per_square_meter def get_area(self, row): # 获取属于哪个区 area = row[:row.index('区')] return area + '区' def get_community(self, row): # 获取属于哪个小区 return row def get_room_count(self, row): # 获取房型是几室 room_count = row[:row.index('室')] return room_count def get_area_size(self, row): # 获取面积 area_size = row.replace('㎡', '') return area_size def get_floor(self, row): # 获取所属楼层 floor = row[row.index('/'):] return floor.replace('/', '').replace('层', '') def get_year(self, row): # 获取修建年代 return row.replace('年', '') def get_house_age(self, row): # 获取屋宇年龄修建年代 localtime = time.localtime(time.time()) year = int(localtime[0]) - int(row) return year def test(self): # 测试 raw_row = ['娥眉新村 4层 110平米', '460.4万', '70769元/m²', '北极西村', '玄武区玄武门北极西村21号', '4室1厅2卫', '65㎡', '高楼层/3层', '南北', '2020年'] print(raw_row) new_row = self.clean_row(raw_row) print(new_row)if __name__ == '__main__': print("数据荡涤开始") raw_row = ['娥眉新村 4层 110平米', '460.4万', '70769元/m²', '北极西村', '玄武区玄武门北极西村21号', '4室1厅2卫', '65㎡', '高楼层/3层', '南北', '2020年'] cleaner = Tao365Cleaner() # cleaner.test() cleaner.do_clean_data() print("数据荡涤实现") print("python 版本", platform.python_version())荡涤实现后保留到文件 ...

January 12, 2023 · 2 min · jiezi

关于python:python-中-json-序列化汇总

在 Python 中,能够应用 json 模块中的 dumps 函数将一个字典转换为 JSON 字符串。 示例代码 import jsondata = { "name": "John Smith", "age": 30, "city": "New York"}json_data = json.dumps(data)print(json_data)输入后果 {"name": "John Smith", "age": 30, "city": "New York"} 在 Python 中,字典的键必须是字符串类型,如果应用了其余类型的键,dumps 函数会抛出 TypeError 异样。 如果在调用 json.dumps 函数时提醒“TypeError: Object of type xxx is not JSON serializable”,示意传入的对象中蕴含了不能被序列化为 JSON 类型的对象。 这通常产生在传入的对象中蕴含了 Python 内置类型之外的自定义对象,比方函数、模块等。 如代码 import jsondef greet(name): return "Hello, " + namedata = { "name": "John Smith", "greet": greet}json_data = json.dumps(data)在下面的代码中,data 字典中的 greet 键对应的值是一个函数,不能被序列化为 JSON 类型。所以会抛出“TypeError: Object of type function is not JSON serializable”的异样。 ...

January 12, 2023 · 1 min · jiezi

关于python:python使用Crypto库实现加密解密

一:crypto库装置pycrypto,pycryptodome是crypto第三方库,pycrypto曾经进行更新三年了,所以不倡议装置这个库;pycryptodome是pycrypto的延长版本,用法和pycrypto 是截然不同的;所以只须要装置pycryptodome就能够了 pip install pycryptodome二:python应用crypto1:crypto的加密解密组件des.py#!/usr/bin/env python# -*- coding: utf-8 -*-from Crypto.Cipher import DESfrom binascii import b2a_hex, a2b_hexclass MyDESCrypt: #本人实现的DES加密类 def __init__(self, key = ''): #密钥长度必须为64位,也就是8个字节 if key is not '': self.key = key.encode('utf-8') else: self.key = '12345678'.encode('utf-8') self.mode = DES.MODE_CBC # 加密函数,如果text有余16位就用空格补足为16位, # 如果大于16过后不是16的倍数,那就补足为16的倍数。 def encrypt(self,text): try: text = text.encode('utf-8') cryptor = DES.new(self.key, self.mode, self.key) # 这里密钥key 长度必须为16(DES-128), # 24(DES-192),或者32 (DES-256)Bytes 长度 # 目前DES-128 足够目前应用 length = 16 #lenth能够设置为8的倍数 count = len(text) if count < length: add = (length - count) # \0 backspace # text = text + ('\0' * add) text = text + ('\0' * add).encode('utf-8') elif count > length: add = (length - (count % length)) # text = text + ('\0' * add) text = text + ('\0' * add).encode('utf-8') self.ciphertext = cryptor.encrypt(text) # 因为DES加密时候失去的字符串不肯定是ascii字符集的,输入到终端或者保留时候可能存在问题 # 所以这里对立把加密后的字符串转化为16进制字符串 return b2a_hex(self.ciphertext) except: return "" # 解密后,去掉补足的空格用strip() 去掉 def decrypt(self, text): try: cryptor = DES.new(self.key, self.mode, self.key) plain_text = cryptor.decrypt(a2b_hex(text)) # return plain_text.rstrip('\0') return bytes.decode(plain_text).rstrip('\0') except: return ""2:crypto组件应用from . import desmsg = "password is 961223"key = "12345678" #key值可传可不传des1 = des.MyDESCrypt()#加密cipherTxt = des1.encrypt(msg) #返回值为bytes型print(cipherTxt)#解密decTxt = des1.decrypt(cipherTxt); #返回值为str型print(decTxt)

January 11, 2023 · 1 min · jiezi

关于python:Django作为接口时跨域问题解决

一:装置django-cors-headerspip install django-cors-headers二:配置settings.py# Application definitionINSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'corsheaders',#减少这行]MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'corsheaders.middleware.CorsMiddleware',#减少这行 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware',正文这行 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware',]#跨域减少疏忽CORS_ALLOW_CREDENTIALS = TrueCORS_ORIGIN_ALLOW_ALL = TrueCORS_ORIGIN_WHITELIST = ( '*')CORS_ALLOW_METHODS = ( 'DELETE', 'GET', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'VIEW',)CORS_ALLOW_HEADERS = ( 'XMLHttpRequest', 'X_FILENAME', 'accept-encoding', 'authorization', 'content-type', 'dnt', 'origin', 'user-agent', 'x-csrftoken', 'x-requested-with', 'Pragma',)

January 11, 2023 · 1 min · jiezi

关于python:使用nginxuwsgi部署Django项目

一:装置nginx1:装置编译工具及库文件yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel2:装置PCREwget https://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gztar zxvf pcre-8.35.tar.gzcd pcre-8.35./configure --prefix=/usr/local/pcremake && make install3:装置nginxcd ~wget https://nginx.org/download/nginx-1.5.6.tar.gztar -zxf nginx-1.5.6.tar.gzcd nginx-1.5.6./configure --prefix=/usr/local/nginx \--with-http_stub_status_module \--with-http_gzip_static_modulemake && make install4判断nginx是否装置胜利/usr/local/nginx/sbin/nginx -v二:装置uwsgi1:装置uwsgipip install uwsgi(pip3的话应用:pip3 install uwsgi)2:判断uwsgi是否装置胜利uwsgi --version三:Nginx+uwsgi部署Django我的项目1:uwsgi配置vim test.initest.ini文件中内容如下: # uwsig应用配置文件启动[uwsgi]socket = 127.0.0.1:9090master = true # 启用主过程vhost = true #多站模式#启动uwsgi的用户名和用户组uid=rootgid=root# 指定动态文件static-map=/static=/data/www/test/staticno-site = true #多站模式时不设置入口模块和文件workers = 2 #子过程数reload-mercy = 10vacuum = true #退出、重启时清理文件max-requests = 1000limit-as = 512buffer-size = 30000pidfile = /data/www/script/test.pid #pid文件,用于上面的脚本启动、进行该过程daemonize = /data/www/script/test.log #日志文件pythonpath = /usr/local/lib/python3.6/site-packages #Python环境地址2:nginx配置server { listen 80; server_name local.test.com; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:9090; #必须和uwsgi中的设置统一 uwsgi_param UWSGI_SCRIPT test.wsgi; #入口文件,即wsgi.py绝对于我的项目根目录的地位,“.”相当于一层目录 uwsgi_param UWSGI_CHDIR /data/www/test;#我的项目根目录 index index.html index.htm; client_max_body_size 35m; }}3:启动服务killall -9 nginx #进行nginxkillall -9 uwsgi #进行uwsgiuwsgi --ini /data/www/script/test.ini #启动uwsgi脚本/usr/local/nginx/sbin/nginx #启动nginx4:判断是否配置胜利在浏览器拜访local.test.com 如果拜访异样可能是防火墙问题 ...

January 11, 2023 · 1 min · jiezi

关于python:pythonrequestsexcelunittestddt接口自动化数据驱动并生成html报告优化版

本文章内容是基于上海-悠悠的版本,进行了优化,减少了局部内容,具体请查阅下文。@TOC 1、原文链接python+requests+excel+unittest+ddt接口自动化数据驱动并生成html报告 2、批改前后框架区别批改前:批改后: 3、次要批改内容减少:token关联(token获取和保留)减少:cookie关联(cookie获取和保留)减少:发送邮件(应用SMTP)批改:HTML报告模板中的款式和ddt用例的题目减少:logo日志### 4、具体批改内容阐明 #### 4.1、减少token关联 ##### 4.1.1、token获取get_token.py import jsonimport requestsfrom common.operation_json import OperetionJsonclass OperationHeader: def __init__(self, response): # self.response = json.loads(response) self.response = response def get_response_token(self): ''' 获取登录返回的token ''' token = {"data":{"token":self.response['data']['token']}} #token = {"token": self.response['data']['token']} return token def write_token(self): op_json = OperetionJson() op_json.write_data(self.get_response_token()) def get_response_msg(self): reponse_msg = {"msg":self.response['msg']} #print("reponse_msg:", reponse_msg) return reponse_msg4.1.2、token保留operation_json.py#coding:utf-8import jsonclass OperetionJson: def __init__(self,file_path=None): if file_path == None: self.file_path = '../case/cookie.json' else: self.file_path = file_path self.data = self.read_data() #读取json文件 def read_data(self): with open(self.file_path, 'r', encoding='utf-8') as fp: data1 = fp.read() if len(data1) > 0: data = json.loads(data1) else: data = {} return data #依据关键字获取数据 def get_data(self,id): print(type(self.data)) return self.data[id] #写json def write_data(self,data): with open('../case/token.json','w') as fp: fp.truncate() # 先清空之前的数据,再写入,这样每次登录的token都是不一样的 fp.write(json.dumps(data))4.1.3、token的读取base_api.py在原代码中退出token的读取,即把token退出到heasers中 ...

January 11, 2023 · 3 min · jiezi

关于python:Python-json中一直搞不清的loadloadsdumpdumpseval

做接口测试的时候,有时候须要对字符串、json串进行一些转换,可是总是得破费一些工夫,实质来说还是有可能是这几个办法的应用没有弄清楚。 @TOC 1、json.loads()源码: def loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw): """Deserialize ``s`` (a ``str``, ``bytes`` or ``bytearray`` instance containing a JSON document) to a Python object. ``object_hook`` is an optional function that will be called with the result of any object literal decode (a ``dict``). The return value of ``object_hook`` will be used instead of the ``dict``. This feature can be used to implement custom decoders (e.g. JSON-RPC class hinting). ``object_pairs_hook`` is an optional function that will be called with the result of any object literal decoded with an ordered list of pairs. The return value of ``object_pairs_hook`` will be used instead of the ``dict``. This feature can be used to implement custom decoders. If ``object_hook`` is also defined, the ``object_pairs_hook`` takes priority. ``parse_float``, if specified, will be called with the string of every JSON float to be decoded. By default this is equivalent to float(num_str). This can be used to use another datatype or parser for JSON floats (e.g. decimal.Decimal). ``parse_int``, if specified, will be called with the string of every JSON int to be decoded. By default this is equivalent to int(num_str). This can be used to use another datatype or parser for JSON integers (e.g. float). ``parse_constant``, if specified, will be called with one of the following strings: -Infinity, Infinity, NaN. This can be used to raise an exception if invalid JSON numbers are encountered. To use a custom ``JSONDecoder`` subclass, specify it with the ``cls`` kwarg; otherwise ``JSONDecoder`` is used. The ``encoding`` argument is ignored and deprecated. """作用: ...

January 11, 2023 · 6 min · jiezi

关于python:Python写入csv出现空白行如何解决

本人平时其实也很少用到csv,明天有个非凡需要,也就不得不用了。然而呈现了空白行。 改前代码 with open(zentao_file, 'w', encoding='utf8') as f: writer = csv.writer(f) writer.writerows(zentao_testcase_rows) logging.info('Convert XMind file(%s) to a zentao csv file(%s) successfully!', xmind_file, zentao_file) return zentao_file景象 问题剖析1、查看关上mode的源码看看2、剖析其实大略意思就是:w是以文本形式关上文件,wb是二进制形式关上文件,以文本形式关上文件时,fwrite函数每碰到一个0x0A时,就在它的后面退出0x0D.其它内容不做增加操作。所以换成wb3、运行后果:这是逗我呢,如下4、再剖析:看上边的意思应该是要去掉encoding,那就去掉吧,后果是还是报错,其实原则上是曾经OK了,只是我的代码两头做了一些格局转换可能导致问题,那要批改大量代码,算了,再看看其余的办法 改后代码通过查阅材料,只须要在关上的的最初加上newline=''就能够了,试试吧 with open(zentao_file, 'w', encoding='utf8', newline='') as f: writer = csv.writer(f) writer.writerows(zentao_testcase_rows) logging.info('Convert XMind file(%s) to a zentao csv file(%s) successfully!', xmind_file, zentao_file) return zentao_file好了,空白行没有了,哈哈

January 11, 2023 · 1 min · jiezi

关于python:UnittestPython接口自动化测试如何进行token关联

业务背景有些业务在做接口自动化的时候,接口头须要传入token参数,那么如何做呢?下边是整顿的内容,当然也借鉴了网友的一些材料。 1、先封装对json格局的数据存储,次要是用来保留和读取获取到的token值operation_json.py#coding:utf-8import jsonclass OperetionJson: def __init__(self,file_path=None): if file_path == None: self.file_path = '../case/user.json' # 获取的token须要保留的中央 else: self.file_path = file_path self.data = self.read_data() #读取json文件 def read_data(self): with open(self.file_path, 'r', encoding='utf-8') as fp: data1 = fp.read() if len(data1) > 0: data = json.loads(data1) else: data = {} return data #依据关键字获取数据 def get_data(self,id): print(type(self.data)) return self.data[id] #写json def write_data(self,data): with open('../case/token.json','w') as fp: fp.truncate() # 先清空之前的数据,再写入,这样每次登录的token都是不一样的 fp.write(json.dumps(data))if __name__ == '__main__': opjson = OperetionJson() #print(opjson.get_data('shop')) data = { "user":"zhang", "passwd":123456 } opjson.write_data(data)2、封装如何获取token脚本get_token.pyimport jsonimport requestsfrom common.operation_json import OperetionJsonclass OperationHeader: def __init__(self, response): self.response = json.loads(response) def get_response_token(self): ''' 获取登录返回的token ''' token = {"data":{"token":self.response['data']['token']}} #token = {"token": self.response['data']['token']} return token # 把数据写入文件 def write_token(self): op_json = OperetionJson() op_json.write_data(self.get_response_token()) def get_response_msg(self): reponse_msg = {"msg":self.response['msg']} #print("reponse_msg:", reponse_msg) return reponse_msgif __name__ == '__main__': # 一个登录接口数据,仅供参考 url = "http://192.168.1.117/api/user/login" data = { "username": "zhang", "password": "123456", "deviceId": 0 } res = requests.post(url,data).json() res1 = json.dumps(res) print(type(res1)) op = OperationHeader(res1) print(op.get_response_msg())3、在用例治理里边进行调用局部代码:test_interface.pyclass Test_api(unittest.TestCase): @classmethod def setUpClass(cls): # 登录获取token cls.s = requests.session() # 创立会话 url = "http://192.168.1.102/api/user/login" headers = {"content-type":"application/json","Connection":"keep-alive"} data = {"username":"zhang","password":"123456","deviceId":0} res = requests.post(url=url, json=data, headers=headers).json() res1 = json.dumps(res) #print(type(res1)) op = OperationHeader(res1) op.write_token() writeexcel.copy_excel(testxlsx, reportxlsx) # 复制xlsx

January 11, 2023 · 1 min · jiezi

关于python:oeasypython0043八进制octoctaloctoberoctave

八进制(oct)回顾上次内容什么是 本义? 本义本义 转化含意\ 是 转义字符\n、\r是 转义序列还有什么 转义序列 吗? \a是 响铃\b 退格键\t 程度制表符 tab键\v、\f 实现喂纸不回车通过 16进制数值 本义 \xhh输入 (hh)16进制对应的ascii字符如果咱们不输出x 会产生什么呢? 为什么会输入 S 呢?查问文档 查问主题 STRINGS查问后果示意办法 \xhh 是 16进制 示意办法\ooo 是 8进制 示意办法 去试试从 16进制 到 8进制 16进制表示法 没有问题那 8进制 呢?有没有 求八进制值的函数 呢? 就像 hex 、 binoct函数手册 oct 就是 求八进制值的函数 返回的 是 八进制模式的 字符串具体示意 的确能够 用 3位 八进制数 示意字符\141123 为什么 对应 S 呢?查问帮忙S 的序号 是8383 对应的 八进制数 是 0o123 - 0 代表这是个 数字- o 代表 oct八进制 ...

January 10, 2023 · 1 min · jiezi

关于python:python自动更新chromediver驱动与chrome匹配

问题做了一个剖析数据生成图片的小工具,隔一段时间就会截图失败,因为chrome自动更新的版本,工具中的chromedirver与之曾经不匹配了。 解决因为使用者不是一个人且非专业人士,手动解决不可取,自动更新比拟靠谱,思路很简略:1、查问以后chrome版本2、查问以后chromedriver版本3、比拟两者是否统一,不统一则更新chromedirver驱动 代码与更新性能相干的包(从一堆代码中摘取进去的,可能有漏的,缺哪个本人装置就好) import osfrom init.Logger import log import re # 正则import winreg # windows注册表import zipfile # 压缩解压import requests #下载chromedirver的镜像地址base_url = 'http://npm.taobao.org/mirrors/chromedriver/'# 匹配前3位版本号的正则表达式version_re = re.compile(r'^[1-9]\d*\.\d*.\d*') # 通过注册表查问chrome版本def getChromeVersion(): try: key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, 'Software\\Google\\Chrome\\BLBeacon') value, t = winreg.QueryValueEx(key, 'version') return version_re.findall(value)[0] # 返回前3位版本号 except WindowsError as e: # 没有装置chrome浏览器 return "1.1.1" # 查问Chromedriver版本def getChromeDriverVersion(): outstd2 = os.popen('chromedriver --version').read() try: version = outstd2.split(' ')[1] version = ".".join(version.split(".")[:-1]) return version except Exception as e: return "0.0.0" # 查看chromedirver用不必更新def checkChromeDriverUpdate(): chrome_version = getChromeVersion() log.info(f'以后chrome版本: {chrome_version}') driver_version = getChromeDriverVersion() log.info(f'以后chromedriver版本: {driver_version}') if chrome_version == driver_version: log.info("版本兼容,无需更新.") return log.info("chromedriver版本与chrome浏览器不兼容,更新中>>>") try: getLatestChromeDriver(chrome_version) log.info("chromedriver更新胜利!") except requests.exceptions.Timeout: log.info("chromedriver下载失败,请查看网络后重试!") except Exception as e: log.info(f"chromedriver未知起因更新失败: {e}") # 获取该chrome版本的最新driver版本号def getLatestChromeDriver(version): url = f"{base_url}LATEST_RELEASE_{version}" latest_version = requests.get(url).text print(f"与以后chrome匹配的最新chromedriver版本为: {latest_version}") # 下载chromedriver print("开始下载chromedriver...") download_url = f"{base_url}{latest_version}/chromedriver_win32.zip" file = requests.get(download_url) with open("chromedriver.zip", 'wb') as zip_file: # 保留文件到脚本所在目录 zip_file.write(file.content) print("下载实现.") # 解压 f = zipfile.ZipFile("chromedriver.zip", 'r') for file in f.namelist(): f.extract(file) print("解压实现.")后果:兼容不兼容 ...

January 10, 2023 · 1 min · jiezi

关于python:Unittest接口测试生成报告和日志方法

HTML报告间接把HTMLTestRunner.py放入工程目录即可报告脚本封装#HTNL格局报告 now = datetime.datetime.now().strftime('%Y-%m-%d_%H_%M_%S') htmlreport = reportpath + "/" + now + r"result.html" print("测试报告生成地址:%s"% htmlreport) fp = open(htmlreport, "wb") runner = HTMLTestRunner.HTMLTestRunner(stream=fp, verbosity=2, title="xxxx接口自动化测试报告", description="用例执行状况") runner.run(case) # case为所有的测试用例 fp.close()LOG日志应用Python自带的logging间接援用即可import logginglog等级<span class="td-span"><span>级别</span></span><span class="td-span"><span>何时应用</span></span><span class="td-span"><span>DEBUG</span></span><span class="td-span"><span>详细信息,典型地调试问题时会感兴趣。 具体的debug信息。</span></span><span class="td-span"><span>INFO</span></span><span class="td-span"><span>证实事件按预期工作。 要害事件。</span></span><span class="td-span"><span>WARNING</span></span><span class="td-span"><span>表明产生了一些意外,或者不久的未来会产生问题(如‘磁盘满了’)。软件还是在失常工作。</span></span><span class="td-span"><span>ERROR</span></span><span class="td-span"><span>因为更重大的问题,软件已不能执行一些性能了。 个别谬误音讯。</span></span><span class="td-span"><span>CRITICAL</span></span><span class="td-span"><span>严重错误,表明软件已不能持续运行了。</span></span><span class="td-span"><span>NOTICE</span></span><span class="td-span"><span>不是谬误,然而可能须要解决。一般然而重要的事件。</span></span><span class="td-span"><span>ALERT</span></span><span class="td-span"><span>须要立刻修复,例如零碎数据库损坏。</span></span><span class="td-span"><span>EMERGENCY</span></span><span class="td-span"><span>紧急情况,零碎不可用(例如零碎解体),个别会告诉所有用户。</span></span>logging.basicConfig()函数蕴含参数阐明<span class="td-span"><span>参数名称                </span></span><span class="td-span"><span>形容</span></span><span class="td-span"><span>filename</span></span><span class="td-span"><span>指定日志输入指标文件的文件名(能够写文件名也能够写文件的残缺的绝对路径,写文件名日志放执行文件目录下,写残缺门路依照残缺门路生成日志文件),指定该设置项后日志信念就不会被输入到控制台了</span></span><span class="td-span"><span>filemode</span></span><span class="td-span"><span>指定日志文件的关上模式,默认为'a'。须要留神的是,该选项要在filename指定时才无效</span></span><span class="td-span"><span>format</span></span><span class="td-span"><span>指定日志格局字符串,即指定日志输入时所蕴含的字段信息以及它们的程序。logging模块定义的格局字段上面会列出。</span></span><span class="td-span"><span>datefmt</span></span><span class="td-span"><span>指定日期/工夫格局。须要留神的是,该选项要在format中蕴含工夫字段%(asctime)s时才无效</span></span><span class="td-span"><span>level</span></span><span class="td-span"><span>指定日志器的日志级别</span></span><span class="td-span"><span>stream</span></span><span class="td-span"><span>指定日志输入指标stream,如sys.stdout、sys.stderr以及网络stream。须要阐明的是,stream和filename不能同时提供,否则会引发 <span>ValueError<span>异样</span></span></span></span><span class="td-span"><span>style</span></span><span class="td-span"><span>Python 3.2中新增加的配置项。指定format格局字符串的格调,可取值为'%'、'{'和'$',默认为'%'</span></span><span class="td-span"><span>handlers</span></span><span class="td-span"><span>Python 3.3中新增加的配置项。该选项如果被指定,它应该是一个创立了多个Handler的可迭代对象,这些handler将会被增加到root logger。须要阐明的是:filename、stream和handlers这三个配置项只能有一个存在,不能同时呈现2个或3个,否则会引发ValueError异样。</span></span>logging模块中定义好的能够用于format格局字符串阐明 <span class="td-span"><span>字段/属性名称</span></span><span class="td-span"><span>应用格局</span></span><span class="td-span"><span>形容</span></span><span class="td-span"><span>asctime</span></span><span class="td-span"><span>%(asctime)s</span></span><span class="td-span"><span>将日志的工夫结构成可读的模式,默认状况下是‘2016-02-08 12:00:00,123’准确到毫秒</span></span><span class="td-span"><span>name</span></span><span class="td-span"><span>%(name)s</span></span><span class="td-span"><span>所应用的日志器名称,默认是'root',因为默认应用的是 rootLogger</span></span><span class="td-span"><span>filename</span></span><span class="td-span"><span>%(filename)s</span></span><span class="td-span"><span>调用日志输入函数的模块的文件名; pathname的文件名局部,蕴含文件后缀</span></span><span class="td-span"><span>funcName</span></span><span class="td-span"><span>%(funcName)s</span></span><span class="td-span"><span>由哪个function收回的log, 调用日志输入函数的函数名</span></span><span class="td-span"><span>levelname</span></span><span class="td-span"><span>%(levelname)s</span></span><span class="td-span"><span>日志的最终等级(被filter批改后的)</span></span><span class="td-span"><span>message</span></span><span class="td-span"><span>%(message)s</span></span><span class="td-span"><span>日志信息, 日志记录的文本内容</span></span><span class="td-span"><span>lineno</span></span><span class="td-span"><span>%(lineno)d</span></span><span class="td-span"><span>以后日志的行号, 调用日志输入函数的语句所在的代码行</span></span><span class="td-span"><span>levelno</span></span><span class="td-span"><span>%(levelno)s</span></span><span class="td-span"><span>该日志记录的数字模式的日志级别(10, 20, 30, 40, 50)</span></span><span class="td-span"><span>pathname</span></span><span class="td-span"><span>%(pathname)s</span></span><span class="td-span"><span>残缺门路 ,调用日志输入函数的模块的残缺路径名,可能没有</span></span><span class="td-span"><span>process</span></span><span class="td-span"><span>%(process)s</span></span><span class="td-span"><span>以后过程, 过程ID。可能没有</span></span><span class="td-span"><span>processName</span></span><span class="td-span"><span>%(processName)s</span></span><span class="td-span"><span>过程名称,Python 3.1新增</span></span><span class="td-span"><span>thread</span></span><span class="td-span"><span>%(thread)s</span></span><span class="td-span"><span>以后线程, 线程ID。可能没有</span></span><span class="td-span"><span>threadName</span></span><span class="td-span"><span>%(thread)s</span></span><span class="td-span"><span>线程名称</span></span><span class="td-span"><span>module</span></span><span class="td-span"><span>%(module)s</span></span><span class="td-span"><span>调用日志输入函数的模块名, filename的名称局部,不蕴含后缀即不蕴含文件后缀的文件名</span></span><span class="td-span"><span>created</span></span><span class="td-span"><span>%(created)f</span></span><span class="td-span"><span>以后工夫,用UNIX规范的示意工夫的浮点数示意; 日志事件产生的工夫--工夫戳,就是过后调用time.time()函数返回的值</span></span><span class="td-span"><span>relativeCreated</span></span><span class="td-span"><span>%(relativeCreated)d</span></span><span class="td-span"><span>输入日志信息时的,自Logger创立以 来的毫秒数; 日志事件产生的工夫绝对于logging模块加载工夫的绝对毫秒数</span></span><span class="td-span"><span>msecs</span></span><span class="td-span"><span>%(msecs)d</span></span><span class="td-span"><span>日志事件产生事件的毫秒局部。logging.basicConfig()中用了参数datefmt,将会去掉asctime中产生的毫秒局部,能够用这个加上</span></span>生成log脚本封装#LOG日志记录 logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename=log_path + '/' + now + r"result.log", filemode='w') logger = logging.getLogger() logger.info(case)Unittest函数入口集成报告和日志# coding=utf-8import unittestimport time,datetimefrom common import HTMLTestRunnerfrom common.send_mail import sendmainimport osimport loggingnow_path = os.path.dirname(os.path.realpath(__file__)) # 获取以后门路report_path = os.path.join(now_path , "../report") # HTML报告存储门路log_path = os.path.join(now_path , "../log") # LOG日志存储门路if not os.path.exists(report_path): os.mkdir(report_path)case_path = os.path.join(now_path , "../case") # 测试用例门路def load_case(casepath=case_path, rule="test*.py"): '''加载所有的测试用例''' discover = unittest.defaultTestLoader.discover(casepath, pattern=rule,) # 定义discover办法的参数 return discoverdef run_case(test_case, reportpath=report_path): '''执行所有的用例, 并把后果写入测试报告''' #HTNL格局报告 now = datetime.datetime.now().strftime('%Y-%m-%d_%H_%M_%S') report = reportpath + "/" + now + r"result.html" print("测试报告生成地址:%s"% report) fp = open(report, "wb") runner = HTMLTestRunner.HTMLTestRunner(stream=fp, verbosity=2, title="xxxx接口自动化测试报告", description="用例执行状况") #LOG日志记录 logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename=log_path + '/' + now + r"result.log", filemode='w') logger = logging.getLogger() logger.info(test_case) # 调用load_case函数返回值 runner.run(test_case) fp.close() time.sleep(2) sendmain(report, mail_to=['yyyyyy@qq.com']) print("发送测试报告邮件OK")if __name__ == "__main__": my_cases = load_case() run_case(my_cases)

January 10, 2023 · 2 min · jiezi

关于python:Python设置显示屏分辨率

工具装置次要调用win32库实现分辨率获取和读写,须要装置pywin32示例中是从execl列表中读取须要设置的分辨率,须要装置xlrd用到的execl分辨率列表如下: pip install pywin32pip install xlrd残缺脚本import win32api,win32con,time,xlrd"""Author:NoamaNelsonDate:2019-11-26Discription:Python sets the resolution of Windows computer graphics card and obtains the resolution"""book1 = xlrd.open_workbook('常见分辨率.xlsx') # 关上表格q = book1.sheet_by_index(0) # 应用索引的形式获取sheet1工作簿i = 0while(i<=5): print("第%d次设置"%i) mwidth = str(q.cell_value(i+1,0)) # 获取单元格中的值 nwidth = mwidth.split(".")[0] # 获取的值为float,转换成字符串而后进行宰割取整 WidthSet = int(nwidth) # 从表格中获取的分辨率宽的值 #print(WidthSet) mhigth = str(q.cell_value(i+1,1)) # 获取单元格中的值 nhigth = mhigth.split(".")[0] # 获取的值为float,转换成字符串而后进行宰割取整 HeightSet = int(nhigth) # 从表格中获取的分辨率宽的值 #print(HeightSet) ResoLutionSet = win32api.EnumDisplaySettings(None, 0) # 调用win32api接口,获取显示设施信息 ResoLutionSet.PelsHeight = HeightSet # 设置分辨率高 ResoLutionSet.PelsWidth = WidthSet # 设置分辨率宽 print("设置的分辨率宽: %d, 设置的分辨率高: %d, 即设置的分辨率为:%d x %d" % (WidthSet, HeightSet, WidthSet, HeightSet)) ResoLutionSet.BitsPerPel = 32 # 显示设施的色彩分辨率 ResoLutionSet.DisplayFixedOutput = 2 # 设置分辨率后拉伸画面,否则切换到小分辨率时,屏幕只在两头一小块 if (win32api.ChangeDisplaySettings(ResoLutionSet, 0)) == 0: # DISP_CHANGE_SUCCESSFUL win32api.ChangeDisplaySettings(ResoLutionSet, 0) # 设置失效 else: win32api.ChangeDisplaySettings(None, 0) # 复原默认 screenNum = win32api.GetSystemMetrics(win32con.SM_CMONITORS) print("显示设施的总数量为: %d" % screenNum) aScreenWidth = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN) aScreenHeight = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN) print("以后屏幕总的分辨率为:%d × %d " % (aScreenWidth, aScreenHeight)) WidthGet = win32api.GetSystemMetrics(win32con.SM_CXSCREEN) # 取得屏幕分辨率X轴 HeightGet = win32api.GetSystemMetrics(win32con.SM_CYSCREEN) # 取得屏幕分辨率Y轴 print ("获取的分辨率宽: %d, 获取的分辨率高: %d, 即获取的分辨率为:%d x %d" % (WidthGet, HeightGet, WidthGet, HeightGet)) time.sleep(3) i += 1输入的后果 ...

January 10, 2023 · 1 min · jiezi

关于python:使用大恒USB工业相机PythonSDK进行逐帧率图片采集

明天应用到了大恒的USB工业相机,须要逐帧率采集图片,并保留在本地。以下是采集过程。 1、装置python的PIL图像处理库装置办法,点击此处:Win7 64位下Python装置PIL图像处理库 2、须要装置摄像机驱动1.、进入大恒官网官网地址,点击此处:大恒图像官网 2、点击注册,填写信息注册胜利后,点击下载核心,找到本人应用的摄像头,以及对应的零碎,进行驱动下载安装即可 3、间接在驱动装置门路下,找到Python SDK,而后间接在对应的目录下写脚本即可。 4、对局部罕用参数进行封装 3、实现的脚本如下import gxipy as gxfrom PIL import Imageimport datetime"""Author:NoamaNelsonDate:2019-11-21Discription:Secondary development of pythonsdk of Daheng camera."""def main(): Width_set = 640 # 设置分辨率宽 Height_set = 480 # 设置分辨率高 framerate_set = 80 # 设置帧率 num = 500 # 采集帧率次数(为调试用,可把后边的图像采集设置成while循环,进行无限度循环采集) #打印 print("") print("###############################################################") print(" 间断获取彩色图像并显示获取的图像.") print("###############################################################") print("") print("摄像机初始化......") print("") #创立设施 device_manager = gx.DeviceManager() # 创立设施对象 dev_num, dev_info_list = device_manager.update_device_list() #枚举设施,即枚举所有可用的设施 if dev_num is 0: print("Number of enumerated devices is 0") return else: print("") print("**********************************************************") print("创立设施胜利,设施号为:%d" % dev_num) #通过设施序列号关上一个设施 cam = device_manager.open_device_by_sn(dev_info_list[0].get("sn")) #如果是黑白相机 if cam.PixelColorFilter.is_implemented() is False: # is_implemented判断枚举型属性参数是否已实现 print("该示例不反对黑白相机.") cam.close_device() return else: print("") print("**********************************************************") print("关上黑白摄像机胜利,SN号为:%s" % dev_info_list[0].get("sn")) #设置宽和高 cam.Width.set(Width_set) cam.Height.set(Height_set) #设置间断采集 #cam.TriggerMode.set(gx.GxSwitchEntry.OFF) # 设置触发模式 cam.AcquisitionFrameRateMode.set(gx.GxSwitchEntry.ON) #设置帧率 cam.AcquisitionFrameRate.set(framerate_set) print("") print("**********************************************************") print("用户设置的帧率为:%d fps"%framerate_set) framerate_get = cam.CurrentAcquisitionFrameRate.get() #获取以后采集的帧率 print("以后采集的帧率为:%d fps"%framerate_get) #开始数据采集 print("") print("**********************************************************") print("开始数据采集......") print("") cam.stream_on() #采集图像 for i in range(num): raw_image = cam.data_stream[0].get_image() # 关上第0通道数据流 if raw_image is None: print("获取黑白原始图像失败.") continue rgb_image = raw_image.convert("RGB") # 从黑白原始图像获取RGB图像 if rgb_image is None: continue #rgb_image.image_improvement(color_correction_param, contrast_lut, gamma_lut) # 实现图像增强 numpy_image = rgb_image.get_numpy_array() # 从RGB图像数据创立numpy数组 if numpy_image is None: continue img = Image.fromarray(numpy_image, 'RGB') # 展现获取的图像 #img.show() mtime = datetime.datetime.now().strftime('%Y-%m-%d_%H_%M_%S') img.save(r"D:\image\\" + str(i) + str("-") + mtime + ".jpg") # 保留图片到本地 print("Frame ID: %d Height: %d Width: %d framerate_set:%dfps framerate_get:%dfps" % (raw_image.get_frame_id(), raw_image.get_height(), raw_image.get_width(), framerate_set, framerate_get)) # 打印采集的图像的高度、宽度、帧ID、用户设置的帧率、以后采集到的帧率 #进行采集 print("") print("**********************************************************") print("摄像机曾经进行采集") cam.stream_off() #敞开设施 print("") print("**********************************************************") print("零碎提醒您:设施曾经敞开!") cam.close_device()if __name__ == "__main__": main()4、运行后果 ...

January 10, 2023 · 2 min · jiezi

关于python:学习笔记Python获取磁盘文件夹大小信息附邮件发送二

【学习笔记】Python获取磁盘、文件夹大小信息(一)中曾经形容了怎么获取文件的大小,磁盘的大小。本次笔记减少邮件服务,这样能够更好的把握磁盘的运行状态。 发送邮件def sendmail(sub, con): msg = email.mime.multipart.MIMEMultipart() msg['from'] = "xxx.com" # 发邮件的邮箱地址 msg['to'] = "yyy.com" # 收邮件的邮箱地址 msg['subject'] = sub # 邮件题目 content = con # 邮件内容 txt = email.mime.text.MIMEText(content) msg.attach(txt) smtp = smtplib.SMTP() smtp.connect('smtp.126.com') #应用的邮件服务 smtp.login('xxx.com', 'zzz') # 登录发邮件的邮箱账号和明码 smtp.sendmail(msg['from'], msg['to'],str(msg)) # 发邮件格局 smtp.quit() sendmail("以后磁盘的运行状态", str(ddddd), encoding='GBK' ) # str(ddddd)须要发送的内容获取D:\image的大小,而后此文件夹会不停的写入文件,当D盘残余空间小于5GB时,给出正告信息,并把正告信息写入log文件中,而后把log中的内容读取进去放入邮件注释,发送邮件"""Author:NoamaNelsonDate:2019-11-19Discription:Get the size of D:\\image, and then this folder will keep writing files. When the remaining space of D disk is less than 5GB, a warning message will be given"""import osimport os.pathimport smtplibimport email.mime.multipartimport email.mime.textimport sendmailimport psutilimport collectionsdef get_size(path): list1 = [] fileList = os.listdir(path) # 获取path目录下所有文件 for filename in fileList: pathTmp = os.path.join(path,filename) # 获取path与filename组合后的门路 if os.path.isdir(pathTmp): # 判断是否为目录 get_size(pathTmp) # 是目录就持续递归查找 elif os.path.isfile(pathTmp): # 判断是否为文件 filesize = os.path.getsize(pathTmp) # 如果是文件,则获取相应文件的大小 #print('目录中的子文件大小:%d字节' % filesize) list1.append(filesize) # 将文件的大小增加到列表 print('%s 目录中的文件总大小:%d 字节' % (path, sum(list1))) print('%s 目录中的文件总大小: %.4f MB' % (path, (sum(list1)/1024/1024))) print('%s 目录中的文件总大小: %.4f GB' % (path, (sum(list1)/1024/1024/1024))) return sum(list1) def get_disk_info(): disk_used = {} for id in psutil.disk_partitions(): if 'cdrom' in id.opts or id.fstype == '': continue disk_name = id.device.split(':') s = disk_name[0] disk_info = psutil.disk_usage(id.device) #print(disk_info) disk_used[s + '盘使用率:'] = '{}%'.format(disk_info.percent) disk_used[s + '残余空间:'] = '{}GB'.format(disk_info.free // 1024 // 1024 // 1024) print("sdsds:%s"%disk_used) return disk_useddef sendmail(sub, con): msg = email.mime.multipart.MIMEMultipart() msg['from'] = "xxx.com" # 发邮件的邮箱地址 msg['to'] = "yyy.com" # 收邮件的邮箱地址 msg['subject'] = sub # 邮件题目 content = con # 邮件内容 txt = email.mime.text.MIMEText(content) msg.attach(txt) smtp = smtplib.SMTP() smtp.connect('smtp.126.com') #应用的邮件服务 smtp.login('xxx.com', 'zzz') # 登录发邮件的邮箱账号和明码 smtp.sendmail(msg['from'], msg['to'],str(msg)) # 发邮件格局 smtp.quit()if __name__ == "__main__": #path= input("输出门路:").strip() #指定文件门路 log_name = 'result.log' with open(log_name, 'w') as f: path = r"D:\\image" disk_used1 = get_disk_info() for k, v in disk_used1.items(): f.write('{}{}。\n'.format(k, v)) list2 = get_size(path) f.write('%s 目录中的文件总大小:%d 字节\n' % (path, list2)) f.write('%s 目录中的文件总大小: %.4f MB\n' % (path, (list2/1024/1024))) f.write('%s 目录中的文件总大小: %.4f GB\n' % (path, (list2/1024/1024/1024))) disk_used2 = disk_used1['D残余空间:'] disk_used3 = int(disk_used2.split('G')[0]) #intlist2 = intlist1/1024/1024/1024 if disk_used3 > 20: print("D残余空间:%s"%disk_used1['D残余空间:']) f.write("D残余空间:%s"%disk_used1['D残余空间:']) elif disk_used3 <= 20: print("D盘残余空间为%dGB,倡议进行数据存储"%disk_used3) f.write("D盘残余空间为%dGB,倡议进行数据存储"%disk_used3) with open(log_name, 'rb') as logfile: sendmail("磁盘以后存储状态", str(logfile.read(), encoding='GBK'))收到的邮件成果 ...

January 10, 2023 · 2 min · jiezi

关于python:学习笔记Python获取磁盘文件夹大小信息一

做某我的项目时,须要获取文件夹大小,磁盘的存储信息。通过学习整顿了下,仅供参考。 获取某个目录的大小def get_size(path): list1 = [] fileList = os.listdir(path) # 获取path目录下所有文件 for filename in fileList: pathTmp = os.path.join(path,filename) # 获取path与filename组合后的门路 if os.path.isdir(pathTmp): # 判断是否为目录 get_size(pathTmp) # 是目录就持续递归查找 elif os.path.isfile(pathTmp): # 判断是否为文件 filesize = os.path.getsize(pathTmp) # 如果是文件,则获取相应文件的大小 #print('目录中的子文件大小:%d字节' % filesize) list1.append(filesize) # 将文件的大小增加到列表 print('%s 目录中的文件总大小:%d 字节' % (path, sum(list1))) print('%s 目录中的文件总大小: %.4f MB' % (path, (sum(list1)/1024/1024))) print('%s 目录中的文件总大小: %.4f GB' % (path, (sum(list1)/1024/1024/1024))) path = "D:\\image"get_size(path)获取所有磁盘信息def get_disk_info(): disk_used = {} for id in psutil.disk_partitions(): if 'cdrom' in id.opts or id.fstype == '': continue disk_name = id.device.split(':') s = disk_name[0] disk_info = psutil.disk_usage(id.device) #print(disk_info) disk_used[s + '盘使用率:'] = '{}%'.format(disk_info.percent) disk_used[s + '残余空间:'] = '{}GB'.format(disk_info.free // 1024 // 1024 // 1024) print("sdsds:%s"%disk_used) get_disk_info()实例:获取D:\image的大小,而后此文件夹会不停的写入文件,当D盘残余空间小于5GB时,给出正告信息"""Author:NoamaNelsonDate:2019-11-19Discription:Get the size of D:\\image, and then this folder will keep writing files. When the remaining space of D disk is less than 5GB, a warning message will be given"""import osimport os.pathimport smtplibimport email.mime.multipartimport email.mime.textimport sendmailimport psutilimport collectionsdef get_size(path): list1 = [] fileList = os.listdir(path) # 获取path目录下所有文件 for filename in fileList: pathTmp = os.path.join(path,filename) # 获取path与filename组合后的门路 if os.path.isdir(pathTmp): # 判断是否为目录 get_size(pathTmp) # 是目录就持续递归查找 elif os.path.isfile(pathTmp): # 判断是否为文件 filesize = os.path.getsize(pathTmp) # 如果是文件,则获取相应文件的大小 #print('目录中的子文件大小:%d字节' % filesize) list1.append(filesize) # 将文件的大小增加到列表 print('%s 目录中的文件总大小:%d 字节' % (path, sum(list1))) print('%s 目录中的文件总大小: %.4f MB' % (path, (sum(list1)/1024/1024))) print('%s 目录中的文件总大小: %.4f GB' % (path, (sum(list1)/1024/1024/1024))) return sum(list1) def get_disk_info(): disk_used = {} for id in psutil.disk_partitions(): if 'cdrom' in id.opts or id.fstype == '': continue disk_name = id.device.split(':') s = disk_name[0] disk_info = psutil.disk_usage(id.device) #print(disk_info) disk_used[s + '盘使用率:'] = '{}%'.format(disk_info.percent) disk_used[s + '残余空间:'] = '{}GB'.format(disk_info.free // 1024 // 1024 // 1024) print("sdsds:%s"%disk_used) return disk_usedif __name__ == "__main__": #path= input("请输出门路:").strip() #指定文件门路 path = r"D:\\image" #intlist1 = get_size(path) get_size(path) disk_used1 = get_disk_info() disk_used2 = disk_used1['D残余空间:'] disk_used3 = int(disk_used2.split('G')[0]) #intlist2 = intlist1/1024/1024/1024 if disk_used3 > 5: print("D残余空间:%s"%disk_used1['D残余空间:']) elif disk_used3 <= 5: mtxt = "D盘残余空间为%dGB,倡议进行数据存储"%disk_used3 print(mtxt)

January 10, 2023 · 2 min · jiezi

关于python:PythonOpencv读取高帧率USB摄像头问题

前几次应用Python+Opencv,对网络摄像头,USB摄像头进行数据采集,根本流程曾经跑通,没什么大问题。最近我的项目中应用了一款120fps/s的USB摄像头,然而调试好代码运行后,问题来了。 遇到的问题120fps,每次只能读取30多张图片或者最多也在40张以下。基本达不到要求。 开始应用的代码增加链接形容 # -*- coding: cp936 -*-"""Author:NoamaNelsonDate:2019-11-19Discription:Read Camaro picture and save """import cv2,os,timeimport numpy as npclass CamaroCap(object): """ 关上视频流 """ def __init__(self): self.cap = cv2.VideoCapture(0) """ 图片信息打印 """ def get_image_info(self,image): print(type(image)) print(image.shape) print(image.size) print(image.dtype) pixel_data = np.array(image) print(pixel_data) """ 逐帧读取数据并保留图片到本地制订地位 """ def Camaro_image(self): i = 0 while(True): ret,frame = self.cap.read() #ret:True或者False,代表有没有读取到图片;frame:示意截取到一帧的图片 if ret == False: break self.get_image_info(frame) # print("打印图片信息") 留神:调试的时候能够关上,如果是始终运行程序,倡议把这行代码正文掉,防止影响内存占用 cv2.imshow('capture',frame) # 展现图片 cv2.imwrite(r"D:\image\\"+ str(i) + ".jpg",frame) # 保留图片 i = i + 1 if cv2.waitKey(1) & 0xFF == ord('q'): # breakif __name__ == '__main__': outmasages = CamaroCap() outmasages.Camaro_image() # 调用摄像头 outmasages.cap.release() # 开释对象和销毁窗口 cv2.destroyAllWindows() 问题剖析笔者发现,每次在摄像头的控制软件上调参数,比方分辨率设置800600,然而运行代码后仍然是640480,why?why?该摄像头在640*480分辨率下,反对120fps,笔者在代码中限度了下帧率为60fps,但还是每秒只能获取30多张图片,这又是Why?why?self.cap.set(cv2.CAP_PROP_FPS, 60)开始求助网络,从网上搜了很多,终于是看到了心愿原来以上问题在于,博主链接剖析论断笔者应用的USB相机,同样反对视频编码格局为YUY2/MJPG,然而Opencv默认读取的是YUY2,而笔者在摄像头控制软件上查看了下,YUY2格局的各种分辨率下的帧率最大才40帧,那么这就对了,就晓得为啥始终是30-40张图片了。那么就须要在脚本中批改格局为MJPG,从以上博主的链接中能够看到:<div class="table-box"><table align="center" border="1" cellpadding="1" cellspacing="1"><thead><tr><th scope="col" style="text-align:center;vertical-align:middle;">参数</th> ...

January 10, 2023 · 2 min · jiezi

关于python:PythonOpencv解析一段视频并逐帧保存到本地

实现原理应用Python+Opencv,把视频流间接按帧率解析成图片,并保留到本地 特点能够做到忽视视频的长短,视频的帧率。多长就解析多长,多少帧率就解析多少帧率,视频解析完间接退出,防止影响内存或者Opencv窗口卡死 实现的成果针对一个本地视频:①时长:从1.02-4.22,共计3.21s②图片:每秒60张,视频解析进去共计3*60+21=201张图片,如下: 脚本# -*- coding: cp936 -*-"""Author:NoamaNelsonDate:2019-11-15Discription:Reading video swtich to picture and save """import cv2,os,timeimport numpy as npclass CamaroCap(object): """ 关上视频流 """ def __init__(self): self.cap = cv2.VideoCapture("./MVI_1637.MOV") # 视频门路,间接把脚本和视频放在同一个目录下最好,也能够指定对应的视频门路 """ 图片信息打印 """ def get_image_info(self,image): print(type(image)) print(image.shape) print(image.size) print(image.dtype) pixel_data = np.array(image) print(pixel_data) """ 逐帧读取数据并保留图片到本地制订地位 """ def Camaro_image(self): i = 0 while(True): ret,frame = self.cap.read() #ret:True或者False,代表有没有读取到图片;frame:示意截取到一帧的图片 if ret == False: break self.get_image_info(frame) # print("打印图片信息") 留神:调试的时候能够关上,如果是始终运行程序,倡议把这行代码正文掉,防止影响内存占用 cv2.imshow('capture',frame) # 展现图片 cv2.imwrite(r"D:\image\\"+ str(i) + ".jpg",frame) # 保留图片 i = i + 1 if cv2.waitKey(1) & 0xFF == ord('q'): break if __name__ == '__main__': outmasages = CamaroCap() outmasages.Camaro_image() # 调用摄像头 outmasages.cap.release() # 开释对象和销毁窗口 cv2.destroyAllWindows()

January 10, 2023 · 1 min · jiezi

关于python:Python读execl之xlrd库函数详解三行列相关

筹备工作:筹备工作和所用资料和《Python读execl之xlrd库函数详解一:工作簿相干》统一。 ## 库函数: 行、列相干row_len(self, rowx) #返回该列的无效单元格长度#-*- encoding:utf-8 -*-import xlrd,jsondef openexec(): book1 = xlrd.open_workbook('datalist.xlsx') # 关上表格 a = book1.sheet_by_name(u"附件2《公费家属体检名单统计表》") # 应用sheet名称获取工作簿 print(a.row_len(15)) #返回第15列的无效单元格长度 openexec()输入后果为:16,如图:row(self, rowx) #返回由该行中所有的单元格对象组成的列表 print(str(a.row(3).decode("unicode-escape"))输入后果为:[number:1.0, text:u'0054', text:u'张1', text:u'12451', text:u'体系54', text:u'部门54', text:u'岗位54', text:u'赵1', text:u'配偶父母', number:176.0, text:u'已婚', text:u'12465', number:199054.0, number:59.0, text:u'女', text:u'女']get_rows(self) #返回遍历每一行的生成器 print(a.get_rows())输入后果为:<generator object <genexpr> at 0x0000000002EB6120>row_types(self, rowx, start_colx=0, end_colx=None) #返回由该行中所有单元格的数据类型组成的列表 print(a.row_types(5))输入后果为:array('B', [2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 1])row_values(self, rowx, start_colx=0, end_colx=None) #返回由该行中所有单元格的数据组成的列表 print(str(a.row_values(5)).decode("unicode-escape")) #须要进行格局转换输入后果为:[3.0, u'0056', u'张3', u'12453', u'体系56', u'部门56', u'岗位56', u'赵3', u'配偶父母', 178.0, u'已婚', u'12467', 199056.0, 66.0, u'女', u'女']row_slice(self, rowx, start_colx=0, end_colx=None) #返回由该行中所有单元格的对象组成的列表** ...

January 9, 2023 · 4 min · jiezi

关于python:Python读execl之xlrd库函数详解二单元格相关

Python读execl次要用到xlrd库,用到次要函数详解如下: 筹备工作:筹备工作和所用资料和《Python读execl之xlrd库函数详解一:工作簿相干》统一。 ## 库函数: 单元格相干cell(self, rowx, colx) #获取单元格对象(附带单元格属性,比方单元格格局)#-*- encoding:utf-8 -*-import xlrd,jsondef openexec(): book1 = xlrd.open_workbook('datalist.xlsx') # 关上表格 q = book1.sheet_by_index(1) # 应用索引的形式获取sheet2工作簿 print(q.cell(4,3)) # 打印sheet2中单元格(4,3)的值,其实为(0,0) openexec()输入后果为:text:u'12452' 备注:从表头2中能够看出(4,3)即为5行4列的值为12452,格局为文本cell_value(self, rowx, colx) #获取单元格的值(不附带格局,只是单纯的获取值,比拟罕用) w = book1.sheet_by_index(1) # 应用索引的形式获取sheet2工作簿 print(q.cell_value(2,2))输入后果为:姓名cell_type(self, rowx, colx) #获取单元格数据类型 e = book1.sheet_by_index(1) # 应用索引的形式获取sheet2工作簿 print(q.cell_type(2,2))输入后果为:1,其中各数值对应如下: <table border="1" cellpadding="7"> <tr> <th>Type symbol</th> <th>Type number</th> <th>Python value</th> </tr> <tr> <td>XL_CELL_EMPTY</td> <td align="center">0</td> <td>empty string ''</td> </tr> <tr> <td>XL_CELL_TEXT</td> <td align="center">1</td> <td>a Unicode string</td> </tr> <tr> <td>XL_CELL_NUMBER</td> <td align="center">2</td> <td>float</td> </tr> <tr> <td>XL_CELL_DATE</td> <td align="center">3</td> <td>float</td> </tr> <tr> <td>XL_CELL_BOOLEAN</td> <td align="center">4</td> <td>int; 1 means TRUE, 0 means FALSE</td> </tr> <tr> <td>XL_CELL_ERROR</td> <td align="center">5</td> <td>int representing internal Excel codes; for a text representation, refer to the supplied dictionary error_text_from_code</td> </tr> <tr> <td>XL_CELL_BLANK</td> <td align="center">6</td> <td>empty string ''. Note: this type will appear only when open_workbook(..., formatting_info=True) is used.</td> </tr> </table>cell_xf_index(self, rowx, colx) #单元格数据区域大小(待讲究,钻研时发现,单元格中数据的长度和区域一样的话,返回的cell_xf_index值也是一样的) r = book1.sheet_by_index(1) # 应用索引的形式获取sheet2工作簿 print(r.cell_xf_index(4,3))输入后果为:后果出错,XLRDError: Feature requires open_workbook(..., formatting_info=True)剖析:依据出错信息,咱们应该在关上文件的时候,应该应用 formatting_info=True,批改代码如下:def openexec(): book1 = xlrd.open_workbook('datalist.xlsx',formatting_info=True) # 关上表格,formatting_info参数取值为True时(为了节俭内存,该参数默认为False),就会读取各种格局的信息。 r = book1.sheet_by_index(1) # 应用索引的形式获取sheet2工作簿 print(r.cell_xf_index(4,3)) openexec()输入后果为:后果还是出错,raise NotImplementedError("formatting_info=True not yet implemented")剖析:把文件格式改为datalist.xls关上OK,然而格局如果为datalist.xlsx,就会出错,所以咱们须要把文件保留为datalist.xls,如下:整顿后的代码如下: ...

January 9, 2023 · 1 min · jiezi

关于python:Python读execl之xlrd库函数详解一工作簿相关

Python读execl次要用到xlrd库,用到次要函数详解如下: 筹备工作:装置xlrd库:pip install xlrd待读取的execl文件,本文应用如下: 文件名:datalist.xlsx 文件内容:(里边的数据只是示例,非实在数据,切勿计较) ## 库函数:工作簿相干**open_workbook(filename=None, logfile=sys.stdout, verbosity=0, use_mmap=USE_MMAP, file_contents=None, encoding_override=None, formatting_info=False, on_demand=False, ragged_rows=False) #关上工作表**#-*- encoding:utf-8 -*-import xlrd,jsondef openexec(): book1 = xlrd.open_workbook('datalist.xlsx') print(book1)openexec()后果输入:<xlrd.book.Book object at 0x0000000002F10358>,阐明文件关上OKsheet_names(self) #获取所有的sheet名称 w = json.dumps(book1.sheet_names(),encoding='utf-8',ensure_ascii=False) # 防止输入中文乱码 print(book1.name)后果输入:["附件1《员工家属体检名单统计表》", "附件2《公费家属体检名单统计表》", "附件3《其余信息》"]那么w[2:18] = 附件1《员工家属体检名单统计表》sheet_by_index(self, sheetx) #通过下表获取所有的sheet名称 q = book1.sheet_by_index(1).name #获取下表为1的sheet名称 print(q)后果输入:附件2《公费家属体检名单统计表》sheet_by_name(self, sheet_name) #间接通过sheet的名称来锁定某个sheet e = book1.sheet_by_name(u"附件2《公费家属体检名单统计表》").name print(e)后果输入:附件2《公费家属体检名单统计表》sheet_loaded(self, sheet_name_or_index) #判断对应的sheet是否加载胜利 r = book1.sheet_loaded(2) print(r)后果输入:Trueunload_sheet(self, sheet_name_or_index) #勾销加载 t = book1.sheet_loaded(2) print(t)后果输入:Nonerelease_resources(self) #资源开释 y = book1.release_resources() print(y)后果输入:None

January 9, 2023 · 1 min · jiezi

关于python:Python读写txt文本示例说明

txt读写相对来说比较简单写,以下通过一个简略的示例来感触下读写的成果。 1、实现的需要①写入:给文件名为“1.txt”的文本中,写入(800,600)-(2048,2048)之间的总计1809801行数据,数据取值必须两两组合,遍历所有的值。比方(800,600),(800,601)......(800,2048)...(801,600)...(801,2048)等等。效果图如下: [外链图片转存失败,源站可能有防盗链机制,倡议将图片保留下来间接上传②读取:每次读取一行数据,并把该行中的数据宰割后,独自打印进去。如下: 2、实现过程①实现第一个需要,即1809801行数据的写入,代码如下:import rem = []f = open(".\1.txt", "w")for i in range(800,2048): # i的值为800-2048 for j in range(600,2048): # j的值为600-2048 p = i,j # 循环取的i,j值给p,例如循环第一遍时p=(800,600) m.append(p) # 把每次失去的p的值存入列表,并且在都在列表开端追加,这样就会把所有取到的值存入了列表m"""上边的代码执行完后,m = [(800,600),(800,601),(800,602)......(2048,2048)]""" for n in range(len(m)): q = (str(m[n])+'\n') # 把失去的m列表转换成字符串,此时q如果写入txt时,就是把m列表包含“()”也会写进去 w = q.split("(")[1] # 咱们要把q中的字符串“()”去掉,先去掉“(” r = w.split(")")[0] # 再去掉“)” f.write(r+'\n') # 此时换行写入txt时就是需要中的成果了f.close() # 敞开文件② 实现第二个需要,即读取这1809801行数据,并把该行中的数据宰割后,独自打印,如下:i=0num = 1809801while(1): if i < num: with open('./1.txt', 'r') as data_file: lines = data_file.readlines() # 获取所有行 data1 = int(lines[i].split(",")[0]) # 把第i行的“,”右边的数据给data1,如第一行中800,600中的800给data1 data2 = int(lines[i].split(",")[1]) # 把第i行的“,”右边的数据给data2,如第一行中800,600中的600给data2 print(data1) print(data2) i+=1 # 循环打印,就失去需要中的成果了3、我的项目中的实例以上需要,能够对应一个我的项目中的理论状况,比方让给某个设施设置分辨率,次要限度如下:1、分辨率宽的取值为:800-20482、分辨率高的取值为:600-20483、也就是说,分辨率要从(800@600)取值到(2048@2048) ...

January 9, 2023 · 1 min · jiezi

关于python:Python-如何使用-BeautifulSoup-实现解析二手房详情页信息并存储文件

一、实战场景Python 如何应用 BeautifulSoup 实现解析二手房详情页信息并存储文件 二、知识点Python 根底语法Python 文件读写BeautifulSoup 解析网页requests 发送网络申请三、菜鸟实战详情页数据采集import os.pathimport platformfrom base_spider import BaseSpiderfrom bs4 import BeautifulSoupimport pandas as pdfrom tqdm import tqdm # 进度条库class Tao365DetailSpider(BaseSpider): # 采集365淘房二手房信息 list_data_file = 'tao365_list.csv' # 采集数据保留的文件 detail_data_file = 'tao365_detail.csv' # 采集数据保留的文件 url_items = [] # 采集链接数组, 取自列表文件中的每一行 detail_df = [] # 已采集的信息 def __init__(self): # 初始化日志 self.init_log() # 从列表文件读取期待采集的链接 list_file_path = self.fileManger.get_data_file_path(self.list_data_file) list_df = pd.read_csv(list_file_path, encoding=self.encoding) self.url_items = list_df.values # 初始化待采集链接数组 detail_file_path = self.fileManger.get_data_file_path(self.detail_data_file) if os.path.isfile(detail_file_path): # 从详情文件读取已采集的信息 self.data_file_exist = True detail_df = pd.read_csv(detail_file_path, encoding=self.encoding) self.detail_df = detail_df def check_url_crawled(self, url): # 查看以后链接是否被抓取过 if len(self.detail_df) == 0: # 如果没有详情文件,则未抓取 return False if url in self.detail_df.iloc[:, 1].values: # 如果 url 在详情文件第一列中有,则示意已抓取过 self.logger.warning("url 已抓取过 %s", url) return True # 默认为未抓取 return False def parse_page(self, content, url): # 利用BeautifulSoup规范库,解析页面信息 soup = BeautifulSoup(content, 'lxml') # 初始化数组 datalist = [] if soup.find("p", attrs={'class': 'line1'}): # 题目 title = soup.find("p", attrs={'class': 'line1'}).text # 价格 priceSplit = soup.find('span', attrs={'class': 'f48 pre bold'}).text.strip() priceArr = priceSplit.split(' ') price = priceArr[0] + "万" # 每平方价格 squarePrice = soup.find('div', class_='headinfo').find('p').text.strip() # 小区 housing = soup.find('div', attrs={'class': 'infoDetail__item long'}).find('a', class_='line1').text area = soup.find('div', attrs={'class': 'infoDetail__item long line1'}).text areaArr = area.split(' ') # 地址 areaStr = '' for area in areaArr: area = area.replace('\n', '') area = area.replace('地址:', '') if area.replace('\n', '') != '地址:': if len(area) > 0: areaStr = areaStr + (area.replace('\n', '')) ul = soup.find("ul", attrs={'class': 'detail__mainCotetn__infoBar'}) lis = ul.find_all("li") # 屋宇户型 house_type = lis[0].text.replace('屋宇户型:', '').replace('\n', '').strip() # 建筑面积 acreage = lis[1].text.replace('建筑面积:', '').replace('\n', '').strip() # 所在楼层 level = lis[2].text.replace('所在楼层:', '').replace('楼层征询', '').replace('\n', '').strip() # 屋宇朝向 direction = lis[3].text.replace('屋宇朝向:', '').replace('\n', '').strip() # 修建年代 year = lis[5].text.replace('修建年代:', '').replace('\n', '').strip() datalist.append([title, price, squarePrice, housing, areaStr, house_type, acreage, level, direction, year]) return datalist def crawl_data(self): # 采集数据 for url_item in tqdm(self.url_items): url = url_item[1] if self.check_url_crawled(url): continue self.logger.debug("以后采集页面信息: %s", url) # 发送申请, 获取数据 page_content = self.get_content_from_url(url) # 解析数据 page_data = self.parse_page(page_content, url) if len(page_data) == 0: # 未获取到数据, 则持续剖析下一个 continue # 保留数据到文件 cols = ['题目', '价格', '每平方价格', '小区', '地址', '屋宇户型', '建筑面积', '所在楼层', '屋宇朝向', '修建年代'] self.save_to_detail_file(page_data, cols) # 避免反爬, 随机休眠一段时间 self.sleep_random() def run(self): self.logger.debug("采集开始") self.crawl_data() self.logger.debug("采集完结")if __name__ == '__main__': print("采集365淘房二手房信息详情") spider = Tao365DetailSpider() spider.run() print("python 版本", platform.python_version())存储采集数据到文件def save_to_file(self, data, cols): # 保留到文件 file_path = self.fileManger.get_data_file_path(self.list_data_file) # 初始化数据 frame = pd.DataFrame(data) if not self.data_file_exist: # 第一次写入带上列表头,原文件清空 frame.columns = cols frame.to_csv(file_path, encoding=self.encoding, index=None) self.data_file_exist = True # 写入后更新数据文件状态 else: # 后续不写如列表头,追加写入 frame.to_csv(file_path, mode="a", encoding=self.encoding, index=None, header=0) self.logger.debug("文件保留实现")运行后果运行截图 ...

January 9, 2023 · 2 min · jiezi

关于python:Django基础

一:创立我的项目应用django-admin命令构建我的项目 django-admin startproject HelloWorld如上应用django构建了一个HelloWorld我的项目 二:我的项目构造咱们能够看到HelloWorld我的项目构造如下 |-- HelloWorld| |-- __init__.py| |-- settings.py| |-- urls.py| `-- wsgi.py`-- manage.py目录构造阐明: HelloWorld: 我的项目的容器。manage.py: 一个实用的命令行工具,可让你以各种形式与该 Django 我的项目进行交互。HelloWorld/__init__.py: 一个空文件,通知 Python 该目录是一个 Python 包。HelloWorld/settings.py: 该 Django 我的项目的设置/配置。HelloWorld/urls.py: 该 Django 我的项目的 URL 申明; 一份由 Django 驱动的网站"目录"。HelloWorld/wsgi.py: 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的我的项目。三:我的项目启动应用如下命令启动我的项目服务 python manage.py runserver 0.0.0.0:8000在浏览器拜访localhost:8000 留神:在浏览器上拜访报400谬误时是因为django我的项目没有开启运行拜访批改HelloWorld/setting.py将 ALLOWED_HOSTS=[]批改成 ALLOWED_HOSTS=['*'] //*示意任意地址四:URL配置在HelloWorld目录下新建一个test.py文件 import osfrom django.https import HttpResponsedef test(request): return HttpResponse("Hello world ! ")将urls.py中的信息替换成 from django.urls import pathfrom . import testurlpatterns = [ path('', test.test),]这时候咱们在浏览器拜访localhost:8000时就会定位到咱们创立的test.py文件中的test办法 ...

January 9, 2023 · 1 min · jiezi

关于python:使用PythonOpencv从摄像头逐帧读取图片保存在本地

明天测试的时候,遇到了一个问题,测试需要是,须要把摄像头拍摄的实时视频逐帧率保留下来。通过查阅材料以及网友帮忙,目前曾经实现。记录下来心愿能够帮忙有须要的敌人。 1、思路应用Python+Opencv,从摄像头的实时视频流中逐帧读取图片,保留到本地 2、工具装置Python装置Opencv3、分类目前测试的过程中遇到了三种类型的摄像头数据读取,别离是: USB一般摄像机:间接应用Python+Opencv,进行数据采集self.cap = cv2.VideoCapture(0);0是本地摄像头USB工业摄像头:应用厂家自带的SDK进行二次开发,例如某厂家的SDK如下:网络摄像头:从RTSP流中读取数据,读取办法,以大华一般网络摄像头为例: 4、示例# -*- coding: cp936 -*-"""Author:xxxxxxDate:2019-09-23Discription:Read Camaro picture and save """import cv2,os,timeimport numpy as npfrom multiprocessing import Processimport threadclass CamaroCap(object): #关上摄像头 def __init__(self): #self.cap = cv2.VideoCapture(0) self.cap = cv2.VideoCapture("rtsp://admin:admin123@172.16.9.23/cam/realmonitor?channel=1&subtype=0")#获取网络摄像机 """ self.cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')) self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480); """ #图片信息打印 def get_image_info(self,image): print(type(image)) print(image.shape) print(image.size) print(image.dtype) pixel_data = np.array(image) print(pixel_data) #逐帧读取数据并保留图片到本地制订地位 def Camaro_image(self): i = 0 while(1): """ ret:True或者False,代表有没有读取到图片 frame:示意截取到一帧的图片 """ ret,frame = self.cap.read() ret,frame = self.cap.read() #print("打印图片信息") #self.get_image_info(frame) # 展现图片 cv2.imshow('capture',frame) #保留图片 cv2.imwrite(r"D:\image\\"+ str(i) + ".jpg",frame) i = i + 1 if cv2.waitKey(1) & 0xFF == ord('q'): breakif __name__ == '__main__': outmasages = CamaroCap() #调用摄像头 outmasages.Camaro_image() #开释对象和销毁窗口 outmasages.cap.release() cv2.destroyAllWindows()

January 9, 2023 · 1 min · jiezi

关于python:oeasypython0041-转义字符转义序列escape序列sequence

转义序列回顾上次内容上次回顾了5bit-Baudot博多码的来历从 莫尔斯码 到 博多码 原来 人 来 收发电报当初 机器 来 收发电报输出形式 从 电键改成 键盘输入形式 从 纸带变成 打印纸张起初 电传打字机ASR-33成为 初代 经典终端除了 \n 和 \r 之外 还有什么 非凡字符 吗?搜寻 ASCII找到 ascii的定义 还有 好多 相似于\n、\r的 特殊字符入手试试 总结一下 各种 转义字符本义总结\a 响铃 ␇ (bell)电传打字机 回车前 都会预警响铛 防止 回车过程中 误打字符能够 手动发送编码 敲一下 这个铃铛起初 是让 蜂鸣器 鸣叫当初 终端 或者 服务器 个别没有 蜂鸣器\b BackSpace退回一格\t table程度制表符Horizontal Tab成果是空四个格\v、\f 成果就是 纯喂纸 不回车光明森林再看 ascii码表 光明森林 如同也没有 那么神秘 了曾经 有些局部 展现进去 了 ...

January 9, 2023 · 2 min · jiezi

关于python:Django安装

一:windows下装置Django1:pip装置Djangopip install Django==2.12:git装置(将下载下来的django放到python安装包同一根目录下)git clone https://github.com/django/django.gitpython setup.py install3:配置环境变量将XXXX\python\Lib\site-packages\django和XXXX\python\Scripts增加到零碎环境变量中,而后咱们就能够应用Django的命令新建工程 django-admin startproject XXX(项目名称)4:查看Django是否装置胜利>>> import django>>> django.get_version()留神:因为Django是外国源,你在装置的过程中可能会失败,你能够应用以下办法还原下载安装pip install -i https://pypi.douban.com/simple django二:linux下装置Django1:yum装置Django(1):装置setuptoolsyum install python-setuptools(2):装置Djangoeasy_install django2:pip装置Djangopip install Django如果 pip < 1.4,装置办法如下: pip install https://www.djangoproject.com/download/1.11a1/tarball/3:源码装置Django(1):下载源码包源码包地址:https://www.djangoproject.com/download/ (2):django装置tar xzvf Django-X.Y.tar.gz # 解压下载包cd Django-X.Y # 进入 Django 目录python setup.py install # 执行装置命令4:查看Django是否装置胜利>>> import django>>> django.get_version()三:装置Django后异样解决 python manage.py runserver 0.0.0.0:8000启动Django后报错如下 ModuleNotFoundError: No module named '_sqlite3'报错起因未装置sqlite 模块; 解决方案装置sqlite-develyum install sqlite-devel从新编译pythoncd /usr/local/python3.6.4./configure --with-sslmakemake install

January 9, 2023 · 1 min · jiezi

关于python:oeasypython0041teletype历史博多码shiftcapslock字符数字切换gear

teletypewriter 历史回顾上次内容上次见到了一个真的机械打字机 感触到了蒸汽朋克的时代背景上上次辨别了一些概念 terminal终端,电脑连线最终的端点TeleTYpewriter,电传打印机,终端硬件shell,终端硬件根底上的软件壳子Console 控制台,间接连贯主机的控制面板换行和回车是两回事 换行 对应字节0x0A Line-Feed 的意思是程度不动、垂直向上喂纸所以是feed回车 对应字节0x0D Carriage-Return意思是让上图可挪动的打印头 如同可挪动的四轮马车 Carriage)垂直不动、程度 回到纸张左侧所以是Return对于换行和回车,不同层面的了解 电传打字机:两件事,常常一起干,但也能够别离干不同操作系统 unix-like:大家一起简化这个成\n,就各自为政就都好了mac:为了防止麻烦,我和unix-like统一windows:原来我用户多,定什么规矩我说了算,当初我还是随大流吧python 解释器 首先我感觉unix-like做得对不论在什么零碎、什么架构上我把这个事对立光说不练假把式我能看看电传打字机吗?那这0x0A、0x0D谁规定的来自于什么呢?发明人0x0A、0x0D 这两个字符 来自于 一套编码博多码(Baudot code) 为什么 叫做 博多码(Baudot code)呢? 因为 创造这个的人 叫波多 Jean-Maurice-Émile Baudot从农民到电报操作员再到法国电报工程师他收到Hughes的启发 可见于oeasy 电路 25 话创造了 用一条线路 传输多个bit位独特的按键和编码这是 最早 发报电键 的样子 5-bit红色的 有用彩色的 是分隔符 能够传输25种信号 具体怎么 调配编码 呢?Baudot 编码博多 设计了 编码的办法 起初 他就 申请了法国专利 再起初 申请了英国专利明天所用 的 波特 这个单位 就是 来源于他 然而 这种编码 只有字母 没有 数字怎么发 带数目的电报 呢?挂档把字符 分类 成两组 ...

January 8, 2023 · 2 min · jiezi

关于python:oeasypython0040换行与回车的不同通用换行符universalnewlines

换行回车回顾上次内容辨别概念 terminal终端 主机网络中 最终的 端点TeleTYpewriter 电传打印机终端硬件shell 终端硬件根底上的 软件壳子Console 控制台 主机旁边 的 控制面板存储文件 的 时候 我 在文件里 打了回车\n零碎 将0x0a存入字节 进文件换行 主动就有 回车性能 了吗?回顾一下 被疏忽的 \r\r\r 也是一个 ascii字符 \是 转义字符\r是 转义序列什么是 本义 呢? 本义本义 转化含意把原来 两个字符 : \和r转化为 \r 这样一个字符没错! \r 是 1个ascii字符 那么 \r 这一个字符 对应字节 是多少 呢?字节状态\r 对应的字节是 0x0d 这个0x0d 如同 在安徒生童话中 呈现过安徒生童话在 文本观看 模式下 主动 回车换行 在 字节观看 模式下 0a0a后面是0d 先0a换行 (line-feed)再0d回车 (carriage-return) 貌似 总是 成对呈现的为什么 呢?换行 和 回车换行 ...

January 7, 2023 · 2 min · jiezi

关于python:python安装

一:在windows下装置python1:登录python官网下载安装包https://www.python.org/downlo... 2:装置python将下载下来的python安装包失常装置即可,只须要留神:记得勾选 Add Python 3.8 to PATH。这里是让他装置的时候主动帮你增加环境变量,省得还要去本人增加环境变量装置后,如果你没有勾选Add Python 3.8 to PATH的话须要本人增加环境变量右击计算机->属性->高级零碎设置->环境变量->批改零碎变量path,增加Python装置地址 3:判断python是否装置胜利在命令行输出python --version呈现如下景象阐明装置胜利 二:在linux下装置python1:下载python关上WEB浏览器拜访 https://www.python.org/downlo...将实用于 Linux 的源码压缩包下载下来。 2:装置pythontar -zxvf Python-3.6.4.tgzcd Python-3.6.4./configure --with-sslmake && make install如果显示没有装置胜利可能是没有设置环境变量 export PATH="$PATH:/usr/local/bin/python" ,按下"Enter"。留神:在执行./configure时可能会报以下谬误:checking build system type... x86_64-pc-linux-gnuchecking host system type... x86_64-pc-linux-gnuchecking for python3.6... nochecking for python3... nochecking for python... pythonchecking for --enable-universalsdk... nochecking for --with-universal-archs... nochecking MACHDEP... linuxchecking for --without-gcc... nochecking for --with-icc... nochecking for gcc... nochecking for cc... nochecking for cl.exe... noconfigure: error: in `/root/Python-3.6.4':configure: error: no acceptable C compiler found in $PATHSee `config.log' for more details解决办法: ...

January 7, 2023 · 1 min · jiezi

关于python:python操作数据库

Python3 应用pymysql 连贯数据库,并实现简略的增删改查,Python3以下版本应用MySQLdb是用于链接Mysql数据库 一:PyMySQL 装置1:应用pip装置pymysqlpip install pymysql2:应用git装置pymysqlgit clone https://github.com/PyMySQL/PyMySQLcd PyMySQL/python3 setup.py install3:应用curl装置指定版本的pymysql# X.X 为 PyMySQL 的版本号curl -L https://github.com/PyMySQL/PyMySQL/tarball/pymysql-X.X | tar xzcd PyMySQL*python setup.py install# 当初你能够删除 PyMySQL* 目录装置的过程中可能会呈现"ImportError: No module named setuptools"的谬误提醒,意思是你没有装置setuptools,你能够拜访https://pypi.python.org/pypi/... 找到各个系统的装置办法。 Linux 零碎装置实例: wget https://bootstrap.pypa.io/ez_setup.pypython3 ez_setup.py二:MySQLdb装置装置MySQLdb,请拜访 https://sourceforge.net/proje... ,(Linux平台能够拜访:https://pypi.python.org/pypi/...)从这里可抉择适宜您的平台的安装包,分为预编译的二进制文件和源代码安装包。 如果您抉择二进制文件发行版本的话,装置过程根本装置提醒即可实现。如果从源代码进行装置的话,则须要切换到MySQLdb发行版本的顶级目录,并键入下列命令: gunzip MySQL-python-1.2.2.tar.gztar -xvf MySQL-python-1.2.2.tarcd MySQL-python-1.2.2python setup.py buildpython setup.py install三:数据库操作以下为应用pymysql连贯数据库形式(应用MySQLdb的话将pymysql换成MySQLdb) 1:查问数据• fetchone(): 该办法获取下一个查问后果集。后果集是一个对象• fetchall():接管全副的返回后果行.• rowcount: 这是一个只读属性,并返回执行execute()办法后影响的行数。 import pymysql # 关上数据库连贯db = pymysql.connect("localhost","testuser","test123","TESTDB" ) # localhost:数据库地址 testuser:数据库账号 test123:数据库明码 TESTDB:数据库名称 应用MySQLdb加charset='utf8' # 应用 cursor() 办法创立一个游标对象 cursorcursor = db.cursor() # 应用 execute() 办法执行 SQL 查问 cursor.execute("SELECT VERSION()") # 应用 fetchone() 办法获取单条数据 fetchall()查问多条数据.data = cursor.fetchone() print ("Database version : %s " % data) # 敞开数据库连贯db.close()2:创立数据库表import pymysql # 关上数据库连贯db = pymysql.connect("localhost","testuser","test123","TESTDB" ) # 应用 cursor() 办法创立一个游标对象 cursorcursor = db.cursor() # 应用 execute() 办法执行 SQL,如果表存在则删除cursor.execute("DROP TABLE IF EXISTS EMPLOYEE") # 应用预处理语句创立表sql = """CREATE TABLE EMPLOYEE ( FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), AGE INT, SEX CHAR(1), INCOME FLOAT )""" cursor.execute(sql) # 敞开数据库连贯db.close()3:插入数据import pymysql # 关上数据库连贯db = pymysql.connect("localhost","testuser","test123","TESTDB" ) # 应用cursor()办法获取操作游标 cursor = db.cursor() # SQL 插入语句sql = """INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""try: # 执行sql语句 cursor.execute(sql) # 提交到数据库执行 db.commit()except: # 如果产生谬误则回滚 db.rollback() # 敞开数据库连贯db.close()4:更新数据import pymysql # 关上数据库连贯db = pymysql.connect("localhost","testuser","test123","TESTDB" ) # 应用cursor()办法获取操作游标 cursor = db.cursor() # SQL 更新语句sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')try: # 执行SQL语句 cursor.execute(sql) # 提交到数据库执行 db.commit()except: # 产生谬误时回滚 db.rollback() # 敞开数据库连贯db.close()5:删除数据import pymysql # 关上数据库连贯db = pymysql.connect("localhost","testuser","test123","TESTDB" ) # 应用cursor()办法获取操作游标 cursor = db.cursor() # SQL 删除语句sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)try: # 执行SQL语句 cursor.execute(sql) # 提交批改 db.commit()except: # 产生谬误时回滚 db.rollback() # 敞开连贯db.close()四:执行事务事务机制能够确保数据一致性。 ...

January 7, 2023 · 2 min · jiezi

关于python:python迭代器和生成器

迭代器迭代是Python最弱小的性能之一,是拜访汇合元素的一种形式。迭代器是一个能够记住遍历的地位的对象。迭代器对象从汇合的第一个元素开始拜访,直到所有的元素被拜访完完结。迭代器只能往前不会后退。迭代器有两个根本的办法:iter() 和 next()。字符串,列表或元组对象都可用于创立迭代器: 实例: list = [1,2,3,4,5]it = iter(list) # 创立迭代器对象print (next(it))# 输入迭代器的下一个元素print (next(it))输入后果为: 12迭代器对象能够应用惯例for语句进行遍历: #!/usr/bin/python3 list=[1,2,3,4]it = iter(list) # 创立迭代器对象for x in it: print (x, end=" ") 执行以上程序,输入后果如下: 1 2 3 4 也能够应用 next() 函数: #!/usr/bin/python3 import sys # 引入 sys 模块 list=[1,2,3,4]it = iter(list) # 创立迭代器对象 while True: try: print (next(it)) except StopIteration: sys.exit()执行以上程序,输入后果如下: 1234生成器在 Python 中,应用了 yield 的函数被称为生成器(generator)。跟一般函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简略点了解生成器就是一个迭代器。在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保留以后所有的运行信息,返回 yield 的值, 并在下一次执行 next() 办法时从以后地位持续运行。调用一个生成器函数,返回的是一个迭代器对象。 以下实例应用 yield 实现斐波那契数列: ...

January 7, 2023 · 1 min · jiezi

关于python:python运算符

Python语言反对以下类型的运算符• 算术运算符• 比拟(关系)运算符• 赋值运算符• 逻辑运算符• 位运算符• 成员运算符• 身份运算符• 运算符优先级 算术运算符运算符形容实例+加 - 两个对象相加a + b 输入后果 31-减 - 失去正数或是一个数减去另一个数a - b 输入后果 -11*乘 - 两个数相乘或是返回一个被反复若干次的字符串a * b 输入后果 210/除 - x 除以 yb / a 输入后果 2.1%取模 - 返回除法的余数b % a 输入后果 1**幂 - 返回x的y次幂a**b 为10的21次方//取整除 - 返回商的整数局部9//2 输入后果 4 , 9.0//2.0 输入后果 4.0实例 a = 21b = 10c = 0 c = a + bprint ("1 - c 的值为:", c) c = a - bprint ("2 - c 的值为:", c) c = a * bprint ("3 - c 的值为:", c) c = a / bprint ("4 - c 的值为:", c) c = a % bprint ("5 - c 的值为:", c) # 批改变量 a 、b 、ca = 2b = 3c = a**b print ("6 - c 的值为:", c) a = 10b = 5c = a//b print ("7 - c 的值为:", c)输入后果如下 ...

January 7, 2023 · 4 min · jiezi

关于python:python的基本数据类型

python的规范数据类型python中有六个规范的数据类型 • Number(数字)• String(字符串)• List(列表)• Tuple(元组)• Set(汇合)• Dictionary(字典) python的六个规范数据类型分为不可变数据和可变数据两种 • 不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);• 可变数据(3 个):List(列表)、Dictionary(字典)、Set(汇合)。 (1)判断对象的数据类型办法有两个,别离为type()和isinstance() >>> a, b, c, d = 20, 5.5, True, 4+3j>>> print(type(a), type(b), type(c), type(d))<class 'int'> <class 'float'> <class 'bool'> <class 'complex'>>>>a = 111>>> isinstance(a, int)True>>>type()和isinstance区别就是: • type()不会认为子类是一种父类类型。• isinstance()会认为子类是一种父类类型。 留神:在 Python2 中是没有布尔型的,它用数字 0 示意 False,用 1 示意 True。到 Python3 中,把 True 和 False 定义成关键字了,但它们的值还是 1 和 0,它们能够和数字相加。(2)del语句(删除曾经定义的变量) del语法: del var1[,var2[,var3[....,varN]]]]Number(数字)蕴含:int(整型)、float(浮点型)、bool(布尔型)、complex(复数) 数值运算 >>>5 + 4 # 加法9>>> 4.3 - 2 # 减法2.3>>> 3 * 7 # 乘法21>>> 2 / 4 # 除法,失去一个浮点数0.5>>> 2 // 4 # 除法,失去一个整数0>>> 17 % 3 # 取余 2>>> 2 ** 5 # 乘方32留神:• 1、Python能够同时为多个变量赋值,如a, b = 1, 2。• 2、一个变量能够通过赋值指向不同类型的对象。• 3、数值的除法蕴含两个运算符:/ 返回一个浮点数,// 返回一个整数。• 4、在混合计算时,Python会把整型转换成为浮点数。 ...

January 7, 2023 · 3 min · jiezi

关于python:Python-进程数线程数调参指引

过程数当单过程cpu 耗费靠近80%时, 代表达到单过程解决的下限;业务上尽量保障单过程cpu <75%, 以应答突发状况; 多过程的长处和弊病长处: 进步业务零碎的解决能力充分利用多核CPU弊病: 过程越多,占用资源越多,内存(疏忽), redis,mysql 连接数会乘数级别增高过程间通信效率不如过程内通信的效率;如何评估过程数量? a. 评估单过程的解决能力 评估时,保障单过程CPU 占用率70%,此时的业务解决能力就是咱们的一个标尺,比方单过程能解决30个路口;业务上,如果应用多线程,通过适合的调整多线程数量,解决IO操作问题,晋升单过程CPU 使用率; 线程数不宜过多,否则都是线程切换开销,如果线程超过50个(集体主观),应该重点关注是否影响性能;线程调整过程中, 每次应该适量调整,进行察看;业务上,如果应用协程,因为协程数量减少,根本不会影响性能(协程的劣势就在于此),协程数量可随便配置,通过观察CPU 使用率,失去一个主观的评估;b. 过程数量的计算 通过单过程的业务解决能力,依据业务大小,可计算出过程数量线程数(协程同理) 因为单过程只能利用一个CPU, 因而线程数的调整,旨在解决IO 密集(网络IO)问题;如何优化线程数量; a. 根本条件: * 每秒须要解决的解决的业务数为 a 条, 假如业务数是平均产生 * 业务函数解决时长(蕴含IO) 为 X s * 业务容许的解决延时为 Y s (Y > X)b. 横向并发优化: * 将业务函数运行在等价的多线程里; * 思考业务不积压,不思考延时,多线程数n = a * (1/X) = a * X * 思考业务不积压,延时符合要求,状况简单,临时没有碰到此种状况,且次要是争对业务非平均产生的状况,比方一一分钟一次产生N 条业务数;c. 纵向并发优化: * 因非凡起因,业务函数无奈横向并发优化(保障时序性), 可进行纵向优化; * 将业务函数拆分多个前后依赖的小函数,将小函数运行在多线程里; * 最终业务函数的解决时长(蕴含IO)由 X 缩减为 max(X1, X2,...)

January 6, 2023 · 1 min · jiezi

关于python:oeasypython0037终端terminal电传打字机ttyshell控制台console发展历史

换行回车回顾上次内容换行 和 回车 是两回事 换行 对应字节0x0ALine-Feed 程度 不动垂直 向上喂纸所以是 feed回车 对应字节0x0DCarriage-Return 垂直 不动程度 回到纸张左侧可挪动的打印头 运输字符 的 安装 (Carriage)回到 行首所以是 Returntty、terminal、shell、console 如同 都叫 终端有什么 不一样 吗?辨别 几个概念Console 控制台 能够 了解为 主机(MainFrame) 的 控制面板从底层 监控 硬件状态 有 显示寄存器状态 的 指示灯有 间接操作寄存器 的 开关而且 控制台与主机 间接物理连贯无奈 近程操作terminal终端 主机网络中 最终的端点个别 是 电传打字机(tty)之类的 硬件 过后的 大风行设施 是 Teletype Model 33Xterm 全称是 X Window terminalterminal 下面运行着的 才是shellterminal 这个单词 来自于什么呢? term (学期)终端和学期 又 有什么关系 呢?termterm term 作为时间段 ...

January 5, 2023 · 2 min · jiezi

关于python:验证码逆向专栏某验四代滑块验证码逆向分析

申明本文章中所有内容仅供学习交换,抓包内容、敏感网址、数据接口均已做脱敏解决,严禁用于商业用途和非法用处,否则由此产生的所有结果均与作者无关,若有侵权,请分割我立刻删除! 本文章未经许可禁止转载,禁止任何批改后二次流传,擅自应用本文解说的技术而导致的任何意外,作者均不负责,若有侵权,请在公众号【K哥爬虫】分割作者立刻删除! 逆向指标指标:某验四代滑块验证码,w 参数逆向主页:aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v加密算法:RSA、AES通信流程 验证码流程剖析进入网页后,关上开发者人员工具进行抓包,点击滑动拼图验证,此时还未点击按钮开始验证,抓到了一个名为 load?captcha_id=xxx 的包,Query String Parameters 蕴含了一些参数: captcha_id:验证码 id,固定值,由 adaptive-captcha-demo.js 文件生成,后文剖析;challenge:动态变化,由 gtc4.js 文件生成,后文剖析;client_type:示意 web 端;risk_type:验证码类型,例如滑块为 slide,无感为 ai;lang:语言;callback:geetest_ + 工夫戳,次要作用是避免缓存。响应预览中返回的要害内容如下,相较于三代,底图未做混同: bg:背景图片地址;captcha_type:验证码类型;gct_path:gct4 文件门路;lot_number:后续生成 pow_msg、w 的要害参数;payload:后续 verify 申请接口须要的参数;datetime:ISO 8601扩大格局的日期,后续生成 pow_msg 的要害参数;process_token:后续 verify 申请接口须要的参数;slice:滑块图片地址。点击按钮开始验证,弹出滑块验证码,滑动滑块,抓包到 verify?captcha_id=xxx,Query String Parameters 同样蕴含了一些参数: captcha_id:与 load 接口申请头中的 captcha_id 统一;client_type:示意 web 端;lot_number:load 接口返回的;risk_type:与 load 接口中的统一,示意验证码类型;payload:load 接口返回的;process_token:load 接口返回的;w:加密参数,由轨迹、滑动工夫、滑动间隔、userresponse、device_id、pow_msg 等参数加密失去;callback:geetest_ + 工夫戳,次要作用是避免缓存。响应预览中返回的内容如下,result 值为 fail 即校验失败,success 为校验通过,通过后携带 seccode 下的参数进行后续业务申请: 逆向剖析captcha_id 参数全局搜寻 captcha_id,跟进到 gt4.js 文件中: ...

January 5, 2023 · 2 min · jiezi

关于python:12月更新-Visual-Studio-Code-Python

咱们很快乐地发表,2022年12月公布的实用于 Visual Studio Code Python 和 Jupyter 扩大现已推出! 此版本包含以下改良: Pylance 主动缩进 预览:浏览器中运行与调试 Python社区提供新扩大:Ruff如果您有趣味,能够在咱们的更新日志中查看 Python、Jupyter 和 Pylance 扩大的残缺改良列表。 Pylance 主动缩进VS Code 的 Pylance 扩大通过更深刻地了解 Python 改良主动缩进性能!此性能使您能够更多地关注代码的逻辑,而不是格式化。在 VS Code Insiders 中应用 Python 扩大的预公布版本来尝试这个性能!您能够通过验证用户 settings.json 文件中是否增加以下设置来判断它是否启用(View > Command Palette and run “Preferences: Open User Settings (JSON)”): "[python]": { "editor.formatOnType": true, },在接下来的几个月里,咱们将默认启用此设置。如果您有任何问题或反馈,请在 Pylance GitHub 存储库中通知咱们。  预览:浏览器中的 Python您当初能够尝试在浏览器中的 vscode.dev 中运行和调试 Python 代码!  有一个新的 VS 代码扩大,容许您尝试应用 WebAssembly 作为执行引擎在 Web 中运行 Python 代码。请留神,此扩大用于试验和钻研目标,以理解应用 WebAssembly 在 Web 中运行 Python 代码,不应将其用于生产 Python 开发,因为这存在重大限度。 ...

January 5, 2023 · 1 min · jiezi

关于python:oeasypython0037电传打字机打印头printheadcarriage词源

换行回车回顾上次内容上次咱们 diy了 本人的小动物还能够 让小动物 变色、报时还能够 说些话这很亚文化 很酷炫的亚文化不是吗?回顾一下 最开始 钻研报时 的 时候回到 本行行头 的 办法print("\r"+ascii_time)\r 与 \n 不同从含意上 来看 \n - LF - LineFeed - 换行\r - CR - CarriageReturn - 回车换行 和 回车 具体 有什么不同吗?换行回车说到 换行回车 呢... 就得 回到 回车换行 的 年代看看 那时候 的 终端设备 也就是 TTY TTY Tele-TYpewriter 电传打字机 tele的意思是近程的 电报 telegram望远镜 telescope电视机 televisiontypewriter type是打字writer是写字的人合在一起就是打字机特指 电传打字机TTY早年间 TTY 以电报终端 的 形式 存在 起初 股票电报机 大规模利用大西洋上面 铺设起了 海底光缆甚至 能够收发 无线电报 ...

January 4, 2023 · 2 min · jiezi

关于python:K哥爬虫普法大数据风控第一案从魔蝎科技案件判决看爬虫技术刑事边界

我国目前并未出台专门针对网络爬虫技术的法律标准,但在司法实际中,相干裁决已不足为奇,K 哥特设了“K哥爬虫普法”专栏,本栏目通过对实在案例的剖析,旨在进步宽广爬虫工程师的法律意识,通晓如何非法合规利用爬虫技术,警钟长鸣,做一个违法、护法、有准则的技术人员。案情介绍据魔蝎科技官网(现已无奈关上)介绍,魔蝎科技成立于2016年,是国内当先的大数据智能风控服务供应商,其将人工智能、大数据、区块链、云计算等前沿技术,深度利用于反欺诈、智能决策、信用剖析等多个金融风险治理服务畛域,对外提供危险剖析、反欺诈、多维度用户画像、授信评分等多维度风险管理服务。曾为上千家金融机构、网贷平台等提供大数据风控服务,曾系金融科技行业头部企业。 2019年之前,魔蝎公司等大数据风控公司一度横蛮成长,其经营模式通常为通过网络爬虫技术获取数据信息,而后对数据进行剖析应用,用于为上游提供大数据风控服务。 2019年9月6日,据爆料,杭州西湖分局集结200余名警力,对涉嫌进犯公民个人信息的魔蝎科技进行对立抓捕。抓获涉案人员120余名,冻结资金2300余万元,勘验固定服务器1000余台,扣押电脑100多台,手机200余部。 从事金融科技行业多年的资深人士走漏,被查起因很可能与违规应用爬虫数据以及暴力催收无关。 网络爬虫本来是指平台依照肯定规定,主动从互联网上提取网络信息的程序或脚本。但近年来,因为一些爬虫技术被利用于“套路贷”的暴力催收上,而被推向风口浪尖。 据金融科技领域人士称,彼时现金贷行业风行一个“风控奇招”——用一款被称为"同业爬虫"的产品,间接将其余现金贷平台的放款额和风控数据扒进去,相当于别家代为做了风控。 比方魔蝎科技员工介绍,只需提供其余现金贷平台的用户名和明码,"同业爬虫"就能够爬取用户的根本信息、银行卡信息、职业、联系人、贷款记录、理财信息等,成功率在85%以上。 曾有大数据公司的相干负责人示意,“咱们自身不生产数据,也不交易数据。所有的数据都是由客户受权,咱们收的只是技术服务费用。” 但在征信行业从业者看来,用户受权并非就为爬虫业务披上了非法的外衣,适度爬取和不明应用信息的景象仍非常广泛。一些第三方数据公司会把爬取的信息存储或缓存下来,再对外提供数据服务,就曾经守法了;如果波及到交易数据,更是触犯刑法。 法院审理查明,魔蝎科技会将其开发的前端插件嵌入网贷平台APP中。网贷平台用户应用网贷平台的App借款时,须要在魔蝎科技提供的前端插件上输出其通信运营商、社保、公积金、淘宝京东、学信网、征信核心等网站的账号、明码。 通过用户受权后,魔蝎科技的爬虫程序即代替用户进入其个人账户,利用各类爬虫技术,爬取(复制)上述企、事业单位网站上贷款用户自己账户内的通话记录、社保、公积金等各类数据,并按与用户的约定提供给网贷平台用于判断用户的资信状况,并从网贷平台获取每笔0.1元至0.3元不等的费用。 只管魔蝎科技在和集体贷款用户签订的《数据采集服务协定》中明确告知,“不会保留用户账号密码,仅在用户每次独自受权的状况下采集信息”,但其仍在服务器上采纳技术手段长期保留用户各类账号和明码。截至2019年9月案发时,以明文模式非法保留的集体贷款用户各类账号和明码条数多达2000万余条。 依据两高《对于办理进犯公民个人信息刑事案件适用法律若干问题的解释》,非法获取、发售或者提供行踪轨迹信息、通信内容、征信信息、财产信息50条以上即可入罪。 裁决状况魔蝎科技以其余办法非法获取公民个人信息,情节特地重大,其行为已形成进犯公民个人信息罪,判处罚金人民币三千万元;被告人周某某犯进犯公民个人信息罪,判处有期徒刑三年,缓刑四年,并处罚金人民币50万元;被告人袁某犯进犯公民个人信息罪,判处有期徒刑三年,缓刑三年,并处罚金人民币30万元;扣押于公安机关的作案工具电脑等予以没收,原告单位杭州魔蝎数据科技有限公司退缴至本院的守法所得款人民币三千万元予以没收,并上缴国库。案例剖析魔蝎科技的入罪起因,是在数据收集环节未经社保、公积金、运营商等平台受权爬取个人信息,同时未经用户受权的状况下非法长期保留用户各类账号和明码在本人租用的阿里云服务器上,还为套路贷零碎平台提供危险管制及催收撑持服务,还将非法获取的公民个人信息发售给其余多个套路贷犯罪团伙,为其提供风控服务和催收反对,非法牟利,爬虫本无罪,罪在用处。 魔蝎科技根据《数据采集服务协定》获取贷款用户的账号密码,在未经被爬取方批准的状况下,利用爬虫技术手段,采取“模仿登陆”形式,获取服务器中所存储贷款用户数据的行为,可能形成未经受权进入被爬取方的计算机信息零碎,从而触犯"非法获取计算机信息零碎罪"或"进犯公民个人信息罪",不过在本案中法院对此未做出否定性评估。 近年来魔蝎科技、新颜科技、公信宝、聚信立、天翼征信、同盾科技等多家头部大数据风控公司,相继被查,均因涉嫌进犯公民个人信息罪被刑事立案,相干公司高管被采取刑事强制措施,多家出名公司都曾经被动或被动地进行了相干爬虫业务,前事不忘;后事之师,企业该当扫视本身爬虫相干业务的商业模式存在的守法可能,关系到用户集体敏感信息,一旦被盗取或滥用,很可能流入非法金融借贷团伙手中,极易引发黑灰产危险。 对于进犯公民个人信息罪的罚金数额,《最高人民法院、最高人民检察院对于办理进犯公民个人信息刑事案件适用法律若干问题的解释》第十二条明确规定,“个别在守法所得的一倍以上五倍以下” ,从上述裁决状况中能够看到,魔蝎科技被追缴的守法所得为三千万元,同时还被判处等同数额的罚金,这意味着,公司一旦触犯此罪名,所退赔的守法所得和罚金的总额,至多为守法产品营业支出的两倍,上述多家互联网公司、大数据公司,因为对本身数据处理的商业模式违法性意识谬误,触犯法律红线而最终无奈经营,与公民个人信息相干,肯定要做好合法性及危险评估,切忌抱有侥幸心理!

January 4, 2023 · 1 min · jiezi

关于python:oeasypython0037字符画艺术asciiview自制小动物imagickasciiart

牛说(cowsay)回顾上次内容咱们狂飙了一路 从用shell 间接执行 python程序到用shell 循环执行 python程序循环体中 把 python的 输入后果 用管道 交给了 figlet把 figlet的 输入后果 用管道 交给了 cowsay把 cowsay的 输入后果 用管道 交给了 lolcat最初 提权 间接运行 shell程序这一路真的好远啊! python3 是脚本解释器shell 也是脚本解释器其实咱们是 在shell中 利用 python3的 输入后果用shell 把 python和figlet等程序 粘了起来不过这一路 真的好绕 要是能在 py文件里 间接调用 shell中的命令 就好了那个时候 python 就成了胶水的主体 实现粘合的工作兴许有一天能够做到能够本人 diy一个小动物 来报时吗?ascii_art这是一门十分年老的亚文化 搜寻asciiart 有很多有意思的asciiart 能够下载 是否将图片 转化为asciiart 呢?筹备图片在本机下载图片 之后上传到蓝桥云 留神 上传的图片 在Code文件夹中 cd Code 能够 进入Code文件夹最好抉择png格局 胜利概率会进步筹备环境 aview ️sudo apt updatesudo apt install aviewsudo apt install imagemagick下载字符画软件 ...

January 3, 2023 · 1 min · jiezi

关于python:2023-新年好顺便记-Flask-的-Bad-request-错误

2023除夕,新年快乐呀! 无论过来几年过得有多糟心,心愿新的一年所有都失常起来,大家都能赚到钱。 前一段很忙,很久没好好输入了,想写的内容,倒是攒了好多篇题目。大半夜的,偷懒记个小问题吧: 如果你用 Flask 实现过 restful 的接口,可能常常会遇到发送 POST 申请的时候,返回 400 BAD REQUEST 的状况,这时候即便能够调试,也看不到更多的错误信息了,因为还没执行到本人的业务代码呢。这十有八九是因为 POST 申请体重,json 数据格式不对造成的——Flask 对 json 的格局要求异样严格,比方上面这段: { "name": "Mike", "code": "BQ548", "age": 18,}用任何 json validator 查看都是没有问题的,但 Flask 肯定会返回 BAD REQUEST,就是因为最初多了一个逗号! 用惯了 python 和 JavaScript 的同学,还要留神字段名肯定要引号括起来,而且必须是双引号。

January 1, 2023 · 1 min · jiezi

关于python:oeasypython0036牛说cowsay小动物说话asciiartfigletlolcat管道

牛说(cowsay)回顾上次内容上次咱们钻研了shell脚本的编程并且在shell中实现了 循环语句提早命令清屏命令python命令figlet命令 还能整点什么呢?还想要让小动物报时cowsay首先要装置 cowsaysudo apt install cowsay装完之后 cow 就能够 say 了吗? 怎么say呢?利用管道利用管道(pipe)来say 如何与报时函数整合呢?整合这如何和咱们的报时程序整合呢?#!usr/bin/python3import timeprint(time.asctime())一步一步来 figlet的后果再通过管道送cowsay 管道原理 而后尝试循环起来把 cowsay 整合进来把figlet的输入后果再送到cowsay -f moose -n 其实就是一步步通过管道流淌的过程for a in {1..10}do clear python3 show_time.py | figlet |cowsay -f moose -n sleep 1sdone看起来有点简单 -f moose 应用驼鹿-n 保留转义字符\n防止屏幕凌乱 这的确有点亚文化能够来点更亚的文化吗?黑白成果#装置黑白程序sudo apt install lolcat#试验echo oeasy | lolcat这样就能够输入黑白成果了 这个能够! 真的很亚☺能够再把报时整合进来吗?整合报时 有的时候会因为宽度问题感觉很乱我想把工夫简化为时分秒整合工夫整合进入原来的loop.sh循环中 清屏后输入这个成果再延时for a in {1..100}do clear python3 sleep.py | figlet | cowsay -f moose -n | lolcat sleep 1sdone输入工夫太长 ...

December 31, 2022 · 1 min · jiezi

关于python:python-等待进程池结束

import jsonimport multiprocessingimport settingsfrom nameko.standalone.rpc import ClusterRpcProxyfrom nameko.standalone.events import event_dispatcherfrom nameko.constants import NON_PERSISTENT, PERSISTENTconfig = { 'AMQP_URI': f'amqp://{settings.RABBITMQ_CONFIG.username}:' f'{settings.RABBITMQ_CONFIG.password}@{settings.RABBITMQ_CONFIG.host}:' f'{settings.RABBITMQ_CONFIG.port}/{settings.RABBITMQ_CONFIG.vhost}'}dispatch = event_dispatcher( config, delivery_mode=NON_PERSISTENT, use_confirms=False)def run(): data = { 'name': 'jike', 'age': 18, 'score': { 'math': 100, 'science': 99.5, 'english': 59 } } for _ in range(10000000): dispatch( 'worker_service', 'to_rubbish', json.dumps(data) )if __name__ == "__main__": pool = multiprocessing.Pool(processes=8) for i in range(100000): pool.apply_async(run) pool.close() pool.join()很简略,就是先 pool.close(),再 pool.join()

December 30, 2022 · 1 min · jiezi

关于python:oeasypython0035-整合shell编程循环延迟清屏

整合shell编程回顾上次内容用\r 能够让输入地位回到行首原位刷新工夫如果想要的是大字符成果 须要应用 figlet但同时还心愿能刷新 这可能吗?建设脚本咱们得相熟一下shell先新建一个test.sh vi test.shpython3 show_time.pypython3 show_time.pypython3 show_time.py看起来就是把这个内容输入了 3 次 能够执行么?尝试执行留神执行细节 在vim的失常状态用:w|!sh %执行 :w 保留| 并且执行!sh % 用外部命令sh执行这个test.sh 留神这里应用的内部程序不是python而是shsh 就像 python3 是外部命令名% 代指test.sh 就像以前的sleep.py是文件名 的确输入了三次工夫但我还想把字变大怎么办呢?figlet变大show_time.py 的输入字符串 间接通过 管道| 给到 figlet其中 show_time.py程序 只负责输入工夫输入的后果 通过管道|给 figletfiglet 负责变大 如果想要输入三个变大之后的工夫应该如何呢?三次输入批改test.sh vi test.sh编写以下文件python3 show_time.py | figletpython3 show_time.py | figletpython3 show_time.py | figlet尝试运行 运行后果 的确变大了 而且输入了三次当初须要不只输入三次 而是有限屡次一直刷新应该怎么办呢?尝试循环有限屡次必定须要循环!原来放在 python文件 中的的循环和定时性能 当初都须要放在 sh脚本 文件里由 shell 来管制提早的节奏那问题来了 sh脚本文件 如何进行循环?搜寻一下! 尝试依据这个批改shell循环在shell中 新编辑一个loop.shvi loop.sh输出以下内容for a in {1..10}do echo $adone尝试运行此文件保留并运行 ...

December 29, 2022 · 1 min · jiezi