-
Python基础语法基本数据类型数字型–int、float、bool、complex非数字型–列表、元组、字典、字符串列表(同数组,有序)1.定义:一个变量存储多个相同类型(也可以存储不同数据类型)的数据Eg. name_list=[“zhangsan”,”lisi”,”wangwu”]2.索引:数据在列表中的位置编号,又称下标,索引值从0开始。3.方法:列表可以使用某些方法。(列表常用操作)name_list=[]name_list.方法名修改------直接赋值修改增加------Name_list.extend() //追加列表(数组)Name_list.insert(index,string) //插入字符串到相应位置Name_list.append() //追加字符串删除------Name_list.remove() //删除指定数据Name_list.clear() //情况列表Name_list.pop() //出栈,默认把列表中最后一个数据删除,也可指定索引删除关键字—del—将一个变量从内存中删除del name_list[1]计数------Name_list.count() //统计括号内的内容出现的次数len(name_list)//统计列表数据个数排序------Name_list.sort() //默认升序排序,将参数改为reverse=True,则降序Name_list.reverse() //默认逆序反转4.列表的循环遍历(迭代)顺序地从列表中依次获得数据for 变量名 in 列表名Print(“%s”%变量名)元组1.特点元组与列表相似,不同:元组元素使用(),列表使用【】,且元组的元素不能修改。2.方法Name_list.index() 统计括号内的内容的索引Name_list.count() 统计括号内的内容出现的次数3.列表与元组的转换tuple(列表)list(元组)字典1.特点{ }包含数据元素,使用键值对,键唯一。使用场景:定义商品。(无序的数据集合,输出字典时通常跟定义时的顺序不同)Eg. Xiaoming_dic{“name”:”小明”,“age”:12,}2.字典中取值Xiaoming_dic[“name”]3.方法(同列表)合并字典: xiaoming_dic.update(另一个字典名) //若合并的字典中有已经存在的键值对,则原有的键值对将被覆盖。4.遍历For k xiaoming_dic:Print(“%s-%s”%(k,xiaoming_dic[k]))字符串1.定义单引号或者双引号都可,但常用双引号公共方法2.方法(同列表、字典的方法)常用方法: isspace()//判断是否只有键盘空白字符 Isdecimal()//判断单纯数字 Isdigit()//可判断一部分编码或者包含的罗马数字(unicode) Isnumeric()//只要包含数字,中文还是英文都能判断出 startswith()//判断是否以制定字符串开始 endswith()//判断是否以指定字符串结束 find()//找相应字符串索引,同index,但无字符串不会报错,而是返回-1 replace()//后面的字符串替换前面的字符串1234567891011文本对齐center(10,” “)//居中ljust()//左对齐rjust()//右对齐去除空白字符lstrip()//去左rstrip()//去右拆分与连接split()//将含有键盘字符的一串字符拆分成列表join()//将列表的中每一小组前或后插入规定的字符3.切片(适用于字符串、列表、元组)字符串【开始索引:结束索引:步长】顺序索引:0开始倒序索引:-1结束切片可以采用倒序顺序复用。公共方法1.Python内置函数注:字典不能比较大小2.切片3.成员运算符(字典只能判断key)inEg. ”a” in “abcd” Truenot inEg. “a” not in “abcd” False货物分享~关注加收藏不迷路哦!
-
本文主要介绍使用Python调用ADB命令实现实时监控logcat关键字的功能采用多进程,可同时监控多个设备,监控多个关键字。 需要配置ADB环境,具体配置就不多介绍,随便搜一下一大把,直接上代码通过一个全局变量控制开启和关闭监控功能, INSTRUCTION 用于根据指令获取对应的方法名import os, threading, datetime# 获取当前文件所在目录,拼接出LOG路径LOG_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "log")# 配置需要监控的关键字KEYWORDS = ["ANR ", "NullPointerException", "CRASH", "Force Closed"]# 控制开启和关闭STOP_LOGCAT = True# 指令对应具体操作INSTRUCTION = {"1": "filter_keywords","2": "stop_filter_keywords","3": "exit"}def filter_keywords():global STOP_LOGCATSTOP_LOGCAT = Falsedevices = get_devices() # 先获取所有连接的设备print("开始监控关键字")for device in devices:t = threading.Thread(target=filter_keyword, args=(device,))t.start()def stop_filter_keywords():global STOP_LOGCATif STOP_LOGCAT:print("没有正在执行的任务\n")else:STOP_LOGCAT = Trueprint("正在停止关键字监控\n")监控关键字主函数,def filter_keyword(device):print("设备%s关键字监控已开启" % str(device))sub = logcat(device)with sub:for line in sub.stdout: # 子进程会持续输出日志,对子进程对象.stdout进行循环读取for key in KEYWORDS:if line.decode("utf-8").find(key) != -1: # stdout输出为字节类型,需要转码message = "设备:%s 检测到:%s\n" % (device, key)# 设备:192.168.56.104:5555 检测到:ANRpath = get_log_path("bugreport") # 根据时间创建文件夹bugreport(device, path)# 拉取完整日志压缩包到创建的文件夹内send_message(message) # 这里可以换成自己要做的事情,比如发送邮件或钉钉通知if STOP_LOGCAT:breakprint("设备%s关键字监控已停止" % str(device))sub.kill() 通过 subprocess.Popen 创建进程执行命令,持续输出日志到 stdout# logcat持续输出日志def logcat(device):command = "adb -s " + str(device) + " logcat -v time"sub = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)return sub获取所有已连接设备的方法,执行"adb devices"后输出如下,通过对命令执行拿到的字符串切割获取所有设备号以列表方式存储# 获取所有devicedef get_devices():command = "adb devices"res = os.popen(command).read()devices = []res = res.split("\n")for i in res:if i.endswith("device"):devices.append(i.split('\t')[0])return devices# 打包下载所有日志到当前目录def bugreport(device, path):os.chdir(path)# bugreport会下载日志到当前文件夹,所以需要先切换到已经创建的目录command = "adb -s " + str(device) + " bugreport"subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=-1)print("设备:%s 日志路径:%s" % (str(device), path))以 当前文件所在目录/年/月/日 格式获取日志路径,如果不存在自动创建# 获取日志存放路径,如果不存在则按日期创建def get_log_path(tag):year = datetime.datetime.now().strftime('%Y')month = datetime.datetime.now().strftime('%m')day = datetime.datetime.now().strftime('%d')path = os.path.join(LOG_PATH, tag, year, month, day)if not os.path.exists(path):os.makedirs(path)return path main函数,循环接收指令,根据接收的指令拿到方法名,并通过eval()方法执行。def main():while True:print("-" * 100)print("1:开启关键字监控\n2:停止关键字监控\n3:退出")print("-" * 100)instruction = str(input("\n\n请输入要进行的操作号:\n"))print("-" * 100)while instruction not in INSTRUCTION.keys():instruction = str(input("\n\n输入无效,请重新输入:"))if int(instruction) == 9:exit() # TODO 退出前需要判断是否有正在执行的monkey任务和关键字监控任务eval(INSTRUCTION[str(instruction)] + "()")if __name__ == '__main__':main()代码分段之后有点凌乱,看不明白可以把代码复制到一个文件里捋一下就明白了这里只写了开启日志监控和关闭的方法,中间有些处理可以根据自己需要实现,比如检测到关键字之后除了拉取所有日志外,可以发送邮件、钉钉之类的通知,根据自己需要去实现。原创不易,感觉本文有用可以点个赞,谢谢!
-
完整代码import requestsimport jsonimport osdef music_download(): kw = input("请输入音乐名称:") # 请求头 headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36 Edg/84.0.522.63", "Cookie":"_ga=GA1.2.1083049585.1590317697; _gid=GA1.2.2053211683.1598526974; _gat=1; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1597491567,1598094297,1598096480,1598526974; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1598526974; kw_token=HYZQI4KPK3P", "Referer": "http://www.kuwo.cn/search/list?key=%E5%91%A8%E6%9D%B0%E4%BC%A6", "csrf": "HYZQI4KPK3P", } # 参数列表 params = { "key": kw, # 页数 "pn": "1", # 音乐数 "rn": "10", "httpsStatus": "1", "reqId": "cc337fa0-e856-11ea-8e2d-ab61b365fb50", } # 创建列表,后面下载需要 music_list = [] url = "http://www.kuwo.cn/api/www/search/searchMusicBykeyWord?" res = requests.get(url = url,headers = headers,params = params) res.encoding = "utf-8" text = res.text # 转成json数据 json_list = json.loads(text) # 发现data中list是存主要数据的地方 datapack = json_list["data"]["list"] # 遍历拿到所需要的数据,音乐名称,歌手,id... for i in datapack: # 音乐名 music_name = i["name"] # 歌手 music_singer = i["artist"] # 待会需要的id先拿到 rid = i["rid"] # 随便试听拿到一个音乐的接口,这是的rid就用得上了 api_music = "http://www.kuwo.cn/url?format=mp3&rid={}&response=url&type=convert_url3" \ "&br=128kmp3&from=web&t=1598528574799&httpsStatus=1" \ "&reqId=72259df1-e85a-11ea-a367-b5a64c5660e5".format(rid) api_res = requests.get(url = api_music) # 打印发现真实的url确实在里面 # print(api_res.text) music_url = json.loads(api_res.text)["url"] # 大功告成,试试效果 print(music_name) print(music_singer) print(music_url) # 把数据存到字典方便下载时查找 music_dict = {} music_dict["name"] = music_name music_dict["url"] = music_url music_dict["singer"] = music_singer music_list.append(music_dict) # 看看真实数据数量 print(len(music_list)) # 下载 xiazai = input("输入音乐名称:") # 下载位置 root = 'E://下载的music//' for i in range(len(music_list)): try: if xiazai == music_list["name"]: # 创建文件夹 if not os.path.exists(root): os.mkdir(root) # 拿到字典中对应的音乐url数据 music_content = requests.get(url = music_list["url"]).content with open(root + "{}({}).mp3".format(music_list['name'],music_list['singer']),"wb") as f: f.write(music_content) print("下载成功") else: print("此歌名不在你所搜索的音乐里!") continue except: print("下载失败")if __name__ == "__main__": music_download()123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384运行结果2020.9.2更新略微改动,如图。如果输入名字时对应搜索的音乐存在重复名字的情况,会直到所有重名的音乐下载完毕才退出程序。最后,本帖提供一种爬虫方法。示例仅作展示,音乐作品相关,推荐大家授权下载!
-
1. 简介Python是一种跨平台的计算机程序设计语言。是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。 2. 部署环境Packet NameVersionDetailCentOSCentOS 7.5 with ARM2vCPUs | 8GB | kc1.large.4Python3.7.5none3. 安装部署3.1 下载安装包wget https://obs-mirror-ftp4.obs.cn-north-4.myhuaweicloud.com/tools/Python-3.7.5.tgz3.2 解压安装包tar -zxvf Python-3.7.5.tgz3.3 进入解压后的文件夹,进行编译cd Python-3.7.5 ./configure --prefix=/usr/local/python3.7.5 --enable-shared make make install3.4 查询/usr/lib64或/usr/lib下是否有libpython3.7m.so.1.0,如果有则跳过此命令如果文件夹下已有libpython3.7m.so.1.0,先备份cp /usr/local/python3.7.5/lib/libpython3.7m.so.1.0 /usr/lib643.5 复制软链接ln -s /usr/local/python3.7.5/bin/python3 /usr/bin/python3.7 ln -s /usr/local/python3.7.5/bin/pip3 /usr/bin/pip3.7 ln -s /usr/local/python3.7.5/bin/python3 /usr/bin/python3.7.5 ln -s /usr/local/python3.7.5/bin/pip3 /usr/bin/pip3.7.53.6 查看版本信息python3.7.5 --version pip3.7.5 --version4. FAQ待补充。
-
实在是没找到CDN的版块,就放到OBS来提问了CDN的python SDK代码def refresh_create(_refresh_task): print("refresh files or dirs:") task = conn.cdn.create_refresh_task(**_refresh_task) print(task) if __name__ == "__main__": refresh_file_task = { "type": "file", "urls": ["https://..."] # url在网页操作刷新CND执行成功,所以url没有问题 } #domains_query() # 这里是可以查询出数据的,所以conn是没问题的,既账号密码那些应该没什么问题 refresh_create(refresh_file_task)执行后结果refresh files or dirs: Traceback (most recent call last): File "f:\Richie\百度云同步盘\new\coder\vscode\python\HuaWeiCDN.py", line 92, in <module> refresh_create(refresh_file_task) File "f:\Richie\百度云同步盘\new\coder\vscode\python\HuaWeiCDN.py", line 44, in refresh_create task = conn.cdn.create_refresh_task(**_refresh_task) File "D:\Program Files\Python36\lib\site-packages\openstack\cdn\v1\_proxy.py", line 742, in create_refresh_task return self._create(_task.RefreshTask, **attrs) File "D:\Program Files\Python36\lib\site-packages\openstack\proxy2.py", line 218, in _create return res.create(self._session, headers=headers, prepend_key=prepend_key) TypeError: create() got an unexpected keyword argument 'headers'代码是基本是华为github上提供的代码,出现了这个错误,求大神帮助!!!
-
上传内容大小不能超过5GB。如果文件超过了5G,怎样才能支持
-
2020-08-20:GO语言中的协程与Python中的协程的区别?
-
背景CentOS7系统默认有安装python2.7版本,基于python2.7自带模块生成测试数据生成数据脚本# -*- coding: UTF-8 -*- import os,getopt,sys import time,random import shutil import uuid ENVENTNUM=100 MODSTR="this is test flume,haha!" FILENAME='log_test_' def usage(): print "Example:python testflume.py -i input_folder -o output_folder -s singlefilesize" opts, args = getopt.getopt(sys.argv[1:], "hi:o:s:") input_folder="" output_folder="" for op, value in opts: if op == "-i": input_folder = value elif op == "-o": output_folder = value elif op == "-h": usage() sys.exit() print "input_folder:" + input_folder+";"+"output_folder:"+output_folder j=1L n=0L ISOTIMEFORMAT='%Y-%m-%d,%X' while 1: filehandler=open(input_folder+'/'+FILENAME+str(j),'w') while n<=ENVENTNUM: LOGSTR=random.choice(("zhangsan", "lisi", "wangwu","zhengliu"))+',male,'+str(random.randint(100,400)) filehandler.write(LOGSTR+'\n') LOGSTR1=random.choice(("Liyang", "Caixuyu", "Zhangmeili","Aihuaqian","Zhenpiaoliang"))+',female,'+str(random.randint(100,400)) filehandler.write(LOGSTR1+'\n') n=n+1 filehandler.close() shutil.move(input_folder+'/'+FILENAME+str(j),output_folder) time.sleep(5) n=0L j=j+1
-
发现了很多技术大牛在云播客中今天为大家带来 python的爬虫之爬取用户信息 不过小编在此也说下:爬虫在一些地方是违法的希望大家可以善用技术 附上链接:https://bbs.huaweicloud.com/blogs/192345效果:git项目地址:https://gitee.com/1091198228/huaweilianmengshujucaiji开发日志2020年8月3日00点51分: +帖子.作者pname=tree.xpath('//a[@class="poPname"]/text()') pname Out[5]: ['HW小龙', 'HW小龙', 'HW小龙', 'HW小龙', 'HW小龙', 'HW小龙', 'HW小龙', 'HW小龙', 'HW小龙', 'HW小龙', 'HW小龙', 'HW小龙', 'HW小龙'] [+]帖子.发表日期本来想从联盟的主页提取帖子的发表日期#规则写出来之后是这样的,很明显,多了“发表于”这三个字。 #还需要写个循环去消除这三个字,挺麻烦的。下个版本可能会直接从帖子里面提取(这种方式会影响帖子的浏览量) time=tree.xpath('//span[@title]/@title | //span[@class="poPtime" and not(span)]/text()') time Out[14]: ['2020-8-1', '2020-7-31', '发表于2020-6-17', '2020-7-31', '发表于2020-7-13', '2020-7-30', '发表于2020-7-16', '发表于2020-7-20', '发表于2020-7-21', '发表于2020-7-18', '发表于2020-7-17', '发表于2020-7-9', '发表于2020-7-1'] +表格保存为html网页效果:代码片段:import datetime #获取当前日期 nowdate=datetime.datetime.now() #获取年月,因为是按月统计所以日暂时用不着 mytime=nowdate.strftime("%Y")+"年"+nowdate.strftime("%m")+"月" if input("是否保存数据为html?[y/n]:") == "y": style='<style type="text/css">table{width:90%;background:#ccc;margin:10px auto;border-collapse:collapse;}th,td{height:25px;line-height:25px;text-align:center;border:1px solid #ccc;}th{background:#eee;font-weight:normal;}tr{background:#fff;}tr:hover{background:#cc0;}td a{color:#06f;text-decoration:none;}td a:hover{color:#06f;text-decoration:underline;}</style>' htmlfile=mytime+lminfo["unScNa"]+".html" htmlbody= style + itmes_tab(sumitmes).get_html_string()+lminfo_tab(lminfo).get_html_string() f = open(htmlfile,"w") f.write(htmlbody) f.close() print("保存成功:文件名:",htmlfile) os.system(htmlfile) #打开网页 +主题发表日期精确到日,预计3.0版本会精确到分钟(可能会影响统计结果)
-
使用华为镜像下载setuptools是提示没有对应的版本
-
【转载华为云社区】链接:https://bbs.huaweicloud.com/blogs/190407作为时下最热门的编程语言,Python是一门学习上手快、开发效率高、代码优雅的编程语言。有消息称,今年9月的新学期开始,浙江八年级新增Python编程语言课程。不难发现,学习Python编程语言已经从娃娃开始了。今天,小编汇总了关于Python编程语言的学习资料,内容包含从入门到精通文章、Python使用工具、Python爬虫神经网络深度学习算法、经典、难点详细解析等等60+篇的干货,想要学习python编程语言的你一定不要错过!!从基础到实战 带你极速掌握 Python技术Python 入门知识好程序员分享Python最佳学习路线掌握这25个关键技术点,Python编程语言学习就掌握50%了自学书籍推荐:《Python入门到进阶》从0到1:Python爬虫知识点梳理精心整理的一些 Python 学习资料大全(含资料下载地址)小白入门Python,必看的一些基础材料带你看点关于Python的“野史”Python 辅助工具吐血整理!决不能错过的100+个python库Python大神编程常用4大工具,你用过几个?程序员学Python编程或许不知的十大提升工具史上最全Python字符串操作指南Python中常用的十大图像处理工具Python 编程基础从零做网站开发 -- 基于Flask和JQuery,实现表格管理平台Python 基础篇:global/nonlocal关键字使用requests库爬取网站乱码(\xe4\xb8\xb0\xe5\xa)的解决方法Python并发学习:多进程与多线程的用法及场景介绍装逼的一行代码:快速共享文件机器学习:10+分类算法汇总学习一篇文章搞懂Python装饰器所有用法来聊聊多线程的几位“辅助”从零学GUI -- 制作智能聊天机器人利用python制作漂亮的词云图鲲鹏云实验-Python+Jupyter机器学习基础环境为Atlas 200 DK制作python环境离线安装包基于Pycharm专业版构建开发板Python开发运行环境基于Atlas 200 DK的原版YOLOv3(基于Darknet-53)实现Atlas 200 DK安装python3的hiai库以及opencv手把手教你在鲲鹏上使用编程语言——Java、PythonPython 进阶开发「Python 编程」编码实现网络请求库中的 URL 解析器Python排序算法[二]:测试数据的迷雾散去Python如何爬取实时变化的WebSocket数据Python 排序算法[一]:令你茅塞顿开,却又匪夷所思爬虫的基本原理——Python网络爬虫基本原理和框架Python网络爬虫requests的基本用法Python中urllib的使用方法Python正则表达式由浅入深详解Python使用requests发送请求实操展示python爬虫之PyQuery的基本使用谈谈在Python中如何处理异常利用requests库和正则表达式抓取猫眼电影排行Python实现网页链接解析提取分析Ajax爬取今日头条街拍美图如何用鲲鹏弹性云服务器部署《Python网络爬虫开发环境》使用Selenium爬取淘宝商品如何在云端快速搭建python网站Python 实战指导Python帮你打包下载所有抖音好听的背景音乐,还不快收藏使用Python开发小说下载器,不再为下载小说而发愁使用Python为中秋节绘制一块美味的月饼4行Python代码监测每行程序的运行时间和空间消耗这个七夕节,用Python为女友绘制一张爱心照片墙吧!如何把图片变得炫酷多彩,Python教你这样实现!赶在520之前,程序员送上的最特别“我爱你”表白Python解析照片EXIF信息,获取坐标位置将Android手机打造成你的Python开发者桌面Python爬虫实战之爬取糗事百科段子Python 经验指南Python装饰器总结,带你几步跨越此坑!Python读写配置文件使用总结与避坑指南Python正则表达式,看完这篇文章就够了…非编程人学Python,要注意哪些隐秘的错误认知?关于Python中的错误与异常,你是否了解的够仔细?
-
文档里介绍的选项我这里没有
-
使用Python调用ManageOne运营API在运营环境中遇到一个需求,就是如何很方便的获取环境中各租户的资源使用情况,这里可以使用python requests 的方式来操作。首先要通过API获取数据import requestsimport jsonres_body = {"auth": { "identity": { "methods": ["password"], "password": { "user": { "domain": { "name": "mo_bss_admin" }, "name": "xxx", "password": "xxx", } } }, "scope": { "domain": { "name": "mo_bss_admin" }, }, }, }res_headers = { 'Content-Type': 'application/json', 'Accept': 'application/json; charset=UTF-8' }res_url = "https://iam-apigateway-proxy.demo.com/v3/auth/tokens"res = requests.post(url = res_url, headers = res_headers, json = res_body, verify = False)# 将token从headers中提取出来token = res.headers['X-Subject-Token']MIIEEgYJKoZIhvcNAQcCoIIEAzCCxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxmgOHw=import copy# 使用token获取vdc的列表url1 = "https://sc.demo.com/rest/vdc/v3.0/vdcs?start=0&limit=1000"new_headers = copy.deepcopy(res_headers)new_headers['X-Auth-Token'] = tokenres1 = requests.get(url=url1, headers = new_headers, verify=False)parsed = json.loads(res1.text)print(res1.status_code, "\n\r", json.dumps(parsed, indent=4, sort_keys=True))200 # 这里只展示其中一个vdc{ "total": 1, "vdcs": [ { "az_id": null, "create_at": 1589418019000, "create_user_id": "385xxxxxxxxxd", "create_user_name": "bss_admin", "description": "", "domain_id": "ea3xxxxxxxxx60", "domain_name": "demo", "ecs_used": 0.0, "enabled": true, "enterprise_id": null, "enterprise_project_id": null, "evs_used": 0.0, "extra": "{\"manager\":\"\",\"phone\":\"\",\"email\":\"\"}", "id": "bdc8cxxxxxxxxxxxxxxxxxx32a6a", # vdc的id "idp_name": null, "ldap_id": null, "level": 2, # 2级vdc "name": "demo", "project_count": 1, "region_id": null, "tag": "vdc", "third_id": null, "third_type": "0", "top_vdc_id": "d9xxxxxxxxxxxxxxxxxxxxxxxxxxxx72", "upper_vdc_id": "d9xxxxxxxxxxxxxxxxxxxxxxxxxxxx72", "upper_vdc_name": "demo", "utc_create_at": "2020-05-14 01:00:19.0" }, ]}这里会将所有vdc的基本信息获取到,我们需要将vdc id记录下来,后面会用到。import rec = []count = 0id_dict = {}for i in parsed['vdcs']: id_dict[i['name']] = i['id'] # 将vdc的id打印出来 print("{0:<25}".format(i['name']),":",i['id']) demo : d9xxxxxxxxxxxxxxxxxxxxxxxxxxxx72利用vdc id去获取vdc的全部细节。这里可以使用一个for循环对所有的vdc进行标准化处理。url2 = "https://sc.demo.com/rest/vdc/v3.0/vdcs/{}/details"vid = "d9xxxxxxxxxxxxxxxxxxxxxxxxxxxx72"res2 = requests.get(url=url2.format(vid),headers = new_headers,verify=False)parsed1 = json.loads(res2.text)print(res2.status_code,json.dumps(parsed1, indent=4, sort_keys=True))返回的json示例如下(示例内容选自《ManageOne 8.0.0 运营面API参考》)200 { "vdc": { "domain_id": "f8310f0f46f04656b10475d260b3026f", "domain_name": "baiqiang1", "upper_vdc_id": "0", "regions": [{ "cloud_infras": [{ "quotas": [{ "service_id": "nfvivpc", "resources": [{ "local_used": 45001, "resource": "vpc", "other_limit": 50000, "other_used": 50001, "local_limit": 50000 }] }], "name": "xian-alpha-2", "cloud_infra_id": "NFVI_xian-alpha-2", "status": "normal", "available_zones": [{ "quotas": [{ "service_id": "nfviecs", "resources": [{ "local_used": 0, "resource": "cores", "other_limit": 100000, "other_used": 110002, "local_limit": 100000 }] }], "az_id": "fsp.type2" }] }], "name": "{\"zh_cn\":\"alpha-2\",\"en_us\":\"xian-alpha-2\"}", "region_id": "xian-alpha-2", "type": "private_cloud" }], "regionId": "xian-beta2-1", "status": "normal" }], "level": 1, "name": "baiqiang1", "description": "", "id": "a24b93f0-2c17-4c2f-b14c-0fb8128a1a5a", "create_at": 1512169700000, "enabled": true } } VDCDetailsResponses对象包含如下属性: 参数 是否必选 类型 值域 说明 vdc 否 VDCDetailBean对象 无 VDC信息。 VDCDetailBean对象包含如下属性: 参数 是否必选 类型 值域 说明 id 否 string 无 VDC id,只能包含小写字母、数字、中划线,长度在1-36之间。 name 否 string 无 VDC 名称。 tag 否 string 无 VDC 类型。 description 否 string 无 VDC 描述。 upper_vdc_id 否 string 无 上级VDC id,只能包含小写字母、数字、中划线,长度在1-36之间。 upper_vdc_name 否 string 无 上级 VDC 名称。 top_vdc_id 否 string 无 一级VDC id,只能包含小写字母、数字、中划线,长度在1-36之间。 extra 否 object 无 扩展信息。 ecs_used 否 double 无 ECS 总数。 evs_used 否 double 无 EVS 总数。 project_count 否 int32 无 项目总数。 enabled 否 boolean true,false VDC使能开关。 domain_id 否 string 无 域标识,长度在1-36之间。 level 否 int32 无 VDC级别,取值在1-5之间。 create_user_id 否 string 无 创建用户ID。 create_user_name 否 string 无 创建用户名称。 create_at 否 int64 无 创建时间。 utc_create_at 否 string 无 创建时间。 domain_name 否 string 无 域名称。 ldap_id 否 string 无 AD id,只能包含小写字母、数字、中划线,长度在1-36之间。 mfa_status 否 string 无 该租户下用户是否开启双因子认证,false默认不开启。 process_id 否 string 无 审批流程ID,只能包含小写字母、数字、中划线,长度为1-36个字符。 third_type 否 string 无 对接类型,1表示对接SAML,2表示ldap enterprise_id 否 string 无 华为云帐户。 enterprise_project_id 否 string 无 华为云项目ID。 cloud_federation_status 否 boolean true,false 华为云状态。 cloud_federation_rate 否 Map<object, object> 无 华为云使用率。 regions 否 List<Region> 无 区域信息。 Region对象包含如下属性: 参数 是否必选 类型 值域 说明 region_id 是 string 无 地域ID,长度在1-32之间。 action 否 string 无 服务操作参数,取值范围 bind,unbind,modify。VDC创建时指定为bind,不校验,配额修改时默认为modify。 name 否 string 无 地域名称,长度在1-512之间,只读参数。 type 否 string 无 地域类型,包含private_cloud、public_cloud等,只读参数。 status 否 string 无 地域类型,包含private_cloud、public_cloud等,只读参数。 cloud_infras 否 List<Cloud_infra> 无 资源池配额。 Cloud_infra对象包含如下属性: 参数 是否必选 类型 值域 说明 cloud_infra_id 否 string 无 资源池ID,长度在1-64之间。 name 否 string 无 资源池区名称,长度在1-255之间,只读参数。 type 否 string 无 资源池区类型,长度在1-255之间,只读参数。 status 否 string 无 资源池状态,包含normal、abnormal等,只读参数。 available_zones 否 List<Available_zone> 无 可用分区配额。 quotas 否 List<Quota> 无 资源池配额。 Available_zone对象包含如下属性: 参数 是否必选 类型 值域 说明 az_id 否 string 无 可用分区ID,长度在1-128之间。 name 否 string 无 可用分区名称,长度在1-255之间,只读参数。 status 否 string 无 可用分区状态,包含normal、abnormal等,只读参数。 type 否 string 无 可用分区类型,只读参数。 extend_param 否 string 无 拓展参数,只读参数。 cloud_infra_id 否 string 无 资源池ID,长度在1-64之间。 quotas 否 List<Quota> 无 可用分区下配额。 Quota对象包含如下属性: 参数 是否必选 类型 值域 说明 service_id 否 string 无 配额服务ID,长度在1-255之间。 action 否 string 无 服务操作参数,取值范围 bind,unbind,modify。 resources 否 List<Dict> 无 配额项。 Dict对象包含如下属性: 参数 是否必选 类型 值域 说明 resource 否 string 无 配额ID,长度在1-255之间。 local_limit 否 int32 无 本级配额上限,取值在[-1,2147483647]。取值为-1时,表示不限配额。 other_limit 否 int32 无 本级配额上限,取值在[-1,2147483647]。取值为-1时,表示不限配额。 local_used 否 double 无 本级配额使用量,取值在[0,2147483647],只读参数。 other_used 否 double 无 下级配额使用量,取值在[0,2147483647],只读参数。 Quota对象包含如下属性: 参数 是否必选 类型 值域 说明 service_id 否 string 无 配额服务ID,长度在1-255之间。 action 否 string 无 服务操作参数,取值范围 bind,unbind,modify。 resources 否 List<Dict> 无 配额项。 Dict对象包含如下属性: 参数 是否必选 类型 值域 说明 resource 否 string 无 配额ID,长度在1-255之间。 local_limit 否 int32 无 本级配额上限,取值在[-1,2147483647]。取值为-1时,表示不限配额。 other_limit 否 int32 无 本级配额上限,取值在[-1,2147483647]。取值为-1时,表示不限配额。 local_used 否 double 无 本级配额使用量,取值在[0,2147483647],只读参数。 other_used 否 double 无 下级配额使用量,取值在[0,2147483647],只读参数。 接下来对我们需要的数据进行提取,由于我只关注有关ECS的服务quota,所以可以使用下面的方法进行提取。regions = parsed1['vdc']['regions']def print_vdc_detail(regions): azs = [] for region in regions: for ci in region['cloud_infras']: for az in ci['available_zones']: azs.append(az) for az in azs: print("\n\r",az['az_id'],':\n') for src in az['quotas']: # az['quotas'] -> list print('资源类型:{}'.format(src['service_id'])) for det in src['resources']: print(" # {0:<25}: {1}".format(det['resource'],det['local_used']))print_vdc_detail(regions)#########结果如下################az0.dc0 :资源类型:ecs # cores : 17.0 #使用的CPU核数 # ram : 40.0 #已经使用的内存数 # gpu_instances : 0.0 # npu_instances : 0.0 # instance_snapshot : 0.0 # instances : 44.0 #创建的ECS数资源类型:evs # gigabytes : 448.0 #使用的卷容量 # volumes : 25.0 #创建的云硬盘数量az1.dc1 :资源类型:bms # cores : 192.0 # ram : 512.0 # instances : 2.0资源类型:evs # gigabytes : 0.0 # volumes : 0.0az2.dc2 :资源类型:ecs # cores : 8.0 # ram : 16.0 # gpu_instances : 0.0 # npu_instances : 0.0 # instance_snapshot : 0.0 # instances : 1.0资源类型:evs # gigabytes : 400.0 # volumes : 2.0可以循环调用上面的步骤,获取所有vdc的资源数据def get_resource(name,vid): url2 = "https://sc.armcloud.hcs.huawei.com/rest/vdc/v3.0/vdcs/{}/details" res2 = requests.get(url=url2.format(vid),headers = new_headers,verify=False) parsed1 = json.loads(res2.text) regions = parsed1['vdc']['regions'] print("VDC: {}".format(name)) print_vdc_detail(regions) print('\n') for name, vid in id_dict.items(): get_resource(name, vid)###########结果如下#################VDC: demoaz0.dc0 :资源类型:ecs # cores : 16.0 # ram : 33.0 # gpu_instances : 0.0 # npu_instances : 0.0 # instance_snapshot : 0.0 # instances : 21.0资源类型:evs # gigabytes : 555.0 # volumes : 23.0VDC: demo1az0.dc0 :资源类型:ecs # cores : 0.0 # ram : 0.0 # gpu_instances : 0.0 # npu_instances : 0.0 # instance_snapshot : 0.0 # instances : 0.0资源类型:evs # gigabytes : 0.0 # volumes : 0.0VDC: demo2az0.dc0 :资源类型:ecs # cores : 24.0 # ram : 86.0 # gpu_instances : 0.0 # npu_instances : 0.0 # instance_snapshot : 0.0 # instances : 26.0资源类型:evs # gigabytes : 642.0 # volumes : 36.0接下来可以基于这个调用链,将代码改成可复用的SDK的形式,前端展示可以通过Django、Flask或者GUI等,也可以输出成excel表格并自动发送邮件给干系人。
-
因为联盟盟主每月都会上报联盟数据,月浏览量、月加入人数什么的。如果每次手动统计的话就非常不方便,所以我尝试着写出一个工具来采集数据自动统计一下,以求代替繁琐的人工操作。目前计划版本:已完成: 1.0:帖子数据采集和联盟数据采集、可视字符界面表格。 2.0:优化采集过程,完全函数化。可生产html的表格。计划中: 3.0:可按日或周统计数据,产生相关报表。 4.0:云服务化{在网页操作,不用下载客户端}采集效果: 生成的网页: 字符界面:也许你发现了,这个联盟id是什么?我定义的联盟id是联盟url后的数字,比如下面链接中的1111就是联盟id。https://developer.huaweicloud.com/hero/group-1111.html而且这个id好像是注册排号的,也就是说后期有希望搞个联盟大数据。都爬进来代码完全开源欢迎各位体验和反馈。开发日志:https://bbs.huaweicloud.com/blogs/192345开源地址:https://gitee.com/1091198228/huaweilianmengshujucaiji我是新入行小白,对代码结构不规范的地方还请大佬们指出,我一定快速改正。
-
请问各位大大,使用Python3 连接 GaussDB的依赖包在哪里下载呀,如果可以的话,可以再请教一下连接步骤吗?谢谢
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签