
喜欢学习的童孩
活动内容...收起 活动简介: 阿里云 MVP Tech Show是由阿里云主办的线下技术路,以阿里云 MVP为主讲人,配合阿里云专家,向所有开发者分享云计算前沿技术。 本期阿里云 MVP tech show 邀请两位大数据方向的MVP以及一位阿里云技术专家共同来分享工业大数据场景化解决方案,阐述如何帮助传统企业进行产业升级。 1、 活动时间和地点: 时间:2018年6月2日周六 13:00-16:30 地点:余杭区良睦路1399号梦想小镇互联网村23号楼(良仓孵化器) 活动回顾!!加入对应城市同城会!!来学习哦。 2、 报名入口的链接: 阿里云 ACE杭州同城会成员可直接在钉钉群内报名备注杭州!即可参加活的哦!!现场专家会送很多礼物和带来自己擅长的一个方向给大家分享!等你来哦!.非ACE成员请联系良仓报名 3、 嘉宾信息: 嘉宾姓名:闫安 公司名称:杭州雷数科技有限公司 职位:首席科学家 嘉宾简介(100字以内):毕业于中科大少年班、布朗大学和华盛顿大学(MBA)先后长期负责微软总部和阿里巴巴核心大数据部门,有丰富的平台和行业解决方案经验2015年创建阿里数加平台、数据工作室,主导开发了关系引擎、规则引擎、DTBoost、DataV等爆款数据产品,并带领实施了政企、民企、互联网领域的一系列解决方案。 演讲主题:AI、大数据落地智能工业实战分享 第一部分 人工智能、大数据的本质解读。 第二部分 在普遍传统思维困局、经济主体数字资源匮乏的背景下,人工智能、大数据如何通过“三步走法”助力经济主体升级? 第三部分:具体实施案例分享。 嘉宾姓名:赵晓飞 公司名称:杭州雷数科技有限公司 职位:技术总监 嘉宾简介:前微软数据挖掘团队高级工程师,长期负责数据爬取、处理、分析等工作。曾经负责对上万家新三板企业的年报等数据进行解析、分析,并在此基础上对企业的价值进行打分排名。目前负责公司的智能产品研发和算法相关工作。 演讲主题:智能工业大数据落地实践 演讲主题介绍:(100字以内)大数据在工业领域如何帮助传统企业进行产业升级。大数据项目落地所面临的困境以及我们的解决方案。 嘉宾姓名:陈焰(传学) 公司名称:阿里云计算有限公司 职位:解决方案专家 图片3.png 嘉宾简介:主要负责基于阿里云产品的大数据解决方案相关工作,参与过最多跑一次、城市大脑等重量级项目。 演讲主题:智能大数据解决方案 演讲主题介绍: 介绍阿里巴巴内部的数据中台相关工作的落地经验和在阿里云上的能力输出。 4、 活动流程: 活动环节设置/时间/演讲主题/演讲人姓名 13:00-13:30 签到 13:30-13:35 主持人开场介绍 13:35-14:05 《AI、大数据落地智能工业实战分享》- 阿里云MVP 闫安 14:05-14:10 Q&A ACE成员纳新+抽奖 14:10-14:40《智能工业大数据落地实践》 – 阿里云 MVP赵晓飞 14:40-14:45 Q&A 14:45-15:15 《智能大数据解决方案》 – 阿里云专家 陈焰 15:15-15:20 Q&A 15:20-15:40 现场交流
【阿里云ACE】杭州春季技术沙龙会 联合举办方:杭州全景良仓加速器 活动类型: 技术沙龙、阿里云ACE迎春聚会 活动地点: 全景网杭州路演中心(浙江省杭州市滨江区江南大道3900号) 云计算服务工程师:缪政辉,来带大家手动操作!《跨云平台的对象储存文件迁移实践》 这周呢? 介绍如何将一整套服务器架构轻松快捷的迁移到阿里云,包括: 自建和其他公有云的服务器操作系统盘、数据盘如何通过迁云工具高还原高便捷的实现快速迁移。 数据库如何通过 DTS 快速迁移至ECS自建数据库或者云数据库产品。 手把手教你如何将大量的本地文件或者存放于其他公有云的对象储存文件批量迁移至阿里云OSS并进行文件校验 4. 以及PB级数据文件的迁移方式讲解。 开始时间: 2018年3月31日 13:30 (集体活动请务必准时) 费用: 免费 报名人群: 喜欢云计算、喜欢阿里云的技术人; 正在或者将要从事互联网技术,或者互联网技术相关的朋友们 活动介绍: 阿里云 ACE全称Alibaba Cloud Engineer,寓意每个成员都是云计算的工程师、建造者。同时ACE又是扑克牌中的“A”,代表了这群人是云计算中最“王牌”的群体。 阿里云 ACE杭州同城会旨在打造全国最大最优秀的技术人俱乐部,为技术人提供丰富多彩的活动、聚会和成长滋养。 活动计划: 13:20 – 13:30 全景良仓加速器集合、拍照、签到 13:30 – 16:00 邀请了杭州卓见云科技有限公司——云计算服务工程师:缪政辉,来带大家手动操作!《跨云平台的对象储存文件迁移实践》!建议大家携带电脑,一起操作。 建议:ACE 参会前提前准备一些复杂文件(文件类型越多越好)存放于像腾讯云COS这样的公有云对象储存平台,以及一台闲置的云服务器(ECS)(可以按量)。 剩下时间我们抽奖发礼物!精彩瞬间
这是2018年上海的同城会活动哦!!图文回顾!!这次活动有我们的阿里云MVP 傅奎(十年信息安全老司机)分享《信息安全》的知识!!!入场的地方!!我们在等待小伙伴。。签完到!我们的老师就正式开始讲课了!!!不过首先我上台要阐述一下我们活动的意义和宗旨哈哈!!! 小伙伴认真的在听老师的讲的课程!!讲到了他自己经历过的一个故事!!最后放一张大神的照片!!! 哈哈哈!!欢迎小伙伴下次来参加活动哦!!分享知识,一起进步!!
建立联邦(建立数据库与数据库联系与问题) 有问题可以找小可玩,评论留言。什么是联邦??建立和另外一个库的关系,换句话说就是我可以在这个库查到另外一个库的表。 本地库连目标数据库1、登陆本地服务器数据库 切换到对应的用户:su - 本地库用户名 连接本地库:db2 connect to 本地库 user 本地库用户名 using 本地用户密码 2、开启联邦支持开启联邦支持,查看数据库管理配置文件,FEDERATED属性 db2 get dbm cfg 如联邦属性为NO, 则需开启属性,重启数据库。 1.cd /家/本地库用户名/ 2.db2 get dbm cfg | grep -i federated ----查询命令 3.db2 update dbm cfg using federated yes ---重置命令 4.db2stop force 5.db2start 3、编目目标数据库信息(编目数据库名称不能超过8位) db2 catalog tcpip node 节点名 remote ip地址 server 端口; db2 catalog db 目标数据库名字 as 取得别名 at node 节点名; db2 terminate;(一定要提交,当你执行提交的时候就会退出数据库连接,切记!!) 查看是否创建成功 db2 list node directory db2 list db directory 4、建立联邦:创建Wrapper, Server, Mapping创建Wrapper(这个联邦N次只需要创建一次) db2 create wrapper drda 创建Server命令格式: db2 "create server 自定义服务器名字 type DB2/UDB version 9.7 wrapper "DRDA" authorization 对方用户 password 对方密码 options (NODE 'node_name',dbname '对方数据库')" db2 "create server EDWSVR type DB2/UDB version 9.7 wrapper "drda" authorization \"edwinst\" password \"edwinst\" options(NODE 'N_EDW',DBNAME 'EDW') " 创建MAPPING 命令格式: db2 "create user mapping for 本地用户 server <server_name> options (remote_authid '对方用户', remote_password '对方密码')" db2 "create user mapping for \"db2inst1\" server payment1svr options (remote_authid 'db2inst2',remote_password 'db2inst2')" 5、建立联邦关系 db2 "create nickname <schema.table_alias_name> for <server_name.对方用户名.table>" db2 "create nickname DSA.EDWCOLUMNS for QKDB1SVR.SYSCAT.COLUMNS" 6、遇见问题1、关于通信问题之类的错误。先检查编目是不是有问题。试着去连一下编目的数据库。 db2 list db directory db2 list node directory 在检查是不是开启联邦了。如果是no就按照上面步骤去做。 db2 get dbm cfg | grep -i federated ----查询命令 如果编目检查没有问题,语法写的也没有问题,联邦也开启了都没有问题,那就重启下数据库。遇见问题: db2 "create server PASSVR type DB2/UDB version 10.5 wrapper "drda" authorization \"pasinst\" password \"pasinst\" options(NODE 'N_PASDB',DBNAME 'PASDB') " 报错信息: DB21034E The command was processed as an SQL statement because it was not a valid Command Line Processor command. During SQL processing it returned: SQL30080N A communication error "111" occurred sending or receiving data from the remote database. SQLSTATE=08001 解决办法:找了很久,然后重启edw数据库,然后在执行一遍好了!!所以很无语。2、常用的联邦sql。遇见问题:建立联邦的时候,编目完去连了一下编目的库,发现成功了!但是没有db2 terminate 所以没有退出来!导致我语句执行到联邦所在的库了,反调了,所以需要删除一些东西。问题解决: db2 "list node directory" db2 "list db directory" db2 "drop nickname 要删的联邦表名" db2 "drop USER MAPPING FOR \"dainst\" server QKDB1SVR " db2 "drop server 删的服务名字" db2 "drop wrapper drda" db2 uncatalog node 节点名 (取消节点的编目) db2 uncatalog db 取得别名 / 数据库名字 (取消数据库的编目) 上面语句可能会用到。这次掉在db2 terminate这个坑里了,不知道这个还可以退出。
首先自我介绍:我是小可!哈哈,我看云栖关于DB2文章很少,正好我也是在做数据仓库,平时用到的一些东西给大家分享一下!有问题记得评论提出哦!也可以加我的技术交流群:127591054和企鹅联系我哦!希望可以帮助到大家感谢! 第一步,学习DB2除了自己装个DB2以外,然后就要做下面这一步了!编目!为什么要编目?因为要在本地访问远程数据库!所以需要在下面黑框框写下面的语句哦!有问题欢迎评论! 1、编目 db2 catalog tcpip node 节点名 remote ip地址 server 端口; db2 catalog db 数据库名字 as 取得别名 at node 节点名; db2 terminate; 其中:tcpid是网络请求方式,编码数据库,名字不能超过8位 remote是ip,server是端口 取消命令: db2 uncatalog node 节点名 (取消节点的编目) db2 uncatalog db 取得别名 / 数据库名字 (取消数据库的编目) 备注:其中节点名和别名是自己随便写的哦!不过两个节点名是一样的! 当然编目完就需要连数据库了!!大家对于编目有问题可以评论留言哦! 2、连接数据库 db2 connect to 取得别名 / 数据库名字 user 用户名 using 密码 3、查询编目信息和数据库信息 db2 list db directory #########:查询连接了多少个数据库 db2 list node directory #########:连接点,表示创建多少个节点连接几个库。 **(下面这个估计用到的最多,至少我是哈哈,首先大家要记住导入导出数据格式Del格式文件,这个是DB2的一种存放数据的格式,还有IXF格式,这两个格式存放的规则不一样)4、导入导出数据export/import/load** 首先给大家看下,导出的目录结构!这个是ixf格式导出的!一般我用的都是DEL导出,方便简单!后面我会以这两种方式为例讲一下导出导入 Export: db2 “export to 目录/表名.del of del select * from 表”; db2 "export to 目录\tab1.ixf of ixf lobs to 目录\ lobfile lobs modified by lobsinsepfiles messages 目录\tab1.msg select * from schema_name.table_name"; 说明:schema_name 是表所属 table_name是表名 lobsinsepfiles,lobsinfile 是生成lob文件 前一个是生成每个,后面是生成到一个文件中 messages:是导出的日志。 IXF文件——是集成交换格式 DEL文件——定界ASCII文件,也是一个ASCII字符流。 IXF是这个样子的。DEL就是以,号分隔得的,记事本打开直接看也很清晰!所以一般导出这个格式。 Import: db2 “import from目录/表名.del of del select * from 表”; db2 “import from 目录/表名.ixf of ixf messages msg2.txt insert into 表” Load说起Load大家只需要记得Load不要生成日志所以很快!Import需要生成就够了!用法和Import与Export基本一样,换个名字而已。 db2 “load client from FILENAME of del modified by codepage=1386 coldel; chardel’ dumpfile=PATH/FILENAME messages PATH/FILENAME insert into TABLEBAME for exception TABLENAME ALLOW READ ACCESS” 常用的语法: db2 “load from 目录/表名.del of del insert into 表” Load报错解决方法: db2 “load from dev/null of del termiate into 表” 下面是参数介绍大家可以看看! 5、db2look(导出表结构)/db2move(批量处理导入导出)参数: -u -用户名 -p -密码 -tn -表名,导出单一表 -tf - 文件名,文件中每行记录一个完整的表名 -ts -表空间名称,用于导出某个表空间下的所有数据 -tc -表创建者,导出某用户创建的所有数据 -sn -模式名,用于导出某个模式下的所有数据 db2move 数据库名字export –u 用户名 –p 密码 例如: db2move yun_pas export -sn ytfinst -u pasinst -p pasinst 说明: 1,这将会把数据库testdb中的全部数据提取到当前目录中。 每个表的内容都存储在一个.ixf文件中,每个.ixf文件都有一个与之相对应的.msg文件,.msg文件是描述从表中导出数据时的信息的。另外还有两个文件,db2move.lst用来记录.ixf文件、.msg文件与表的一一对应关系,EXPORT.out记录的是导出数据时的屏幕输出。下面的图就是一个完整的批量导出某个模式下的数据的目录。 大量例子来袭 1)、全库数据导出,导出语句如下 db2move db export -u db2admin -p db2admin 2)、导出某个表空间的所有数据 db2move db export -ts tb1 -u db2admin -p db2admin 若要导出多个表空间数据,方法如下: db2move db export -ts tb1,tb2 -u db2admin -p db2admin 注:上行语句中的“tb1,tb2”用逗号分隔,且不能有空格 3)、导出单一表 db2move db export -tn tbname -u db2admin -p db2admin 4)、导出某个模式下的所有数据 db2move db export -sn schemaname -u db2admin -p db2admin 5)、根据配置文件导出数据 配置文件中记录需要导出的所有表名,必须注意,每行只能写一个完整表名,且要加上所属的模式名,并以加上双引号 在此,在db2cmd所在的目录下,创建一个文件,如table.txt,文件中如下编写: "db2admin"."table1" "db2admin"."table2" "db2admin"."table3" 导出语句为: db2move db export -tf table.txt -u db2admin -p db2admin 这样就可以根据 table.txt 文件中配置的表,导出相应数据。 6)、导出某个用户下的所有数据 db2move db export -tc db2admin -u db2admin -p db2admin 7)、通过import,replace数据 db2move db import -io replace -u db2admin -p db2admin db2look:1、语法(我们其实可以在db2cmd打db2look也是可以出来的!我这里贴图) 大量例子来袭哈哈: 其中 数据库名:sample 用户:db2admin模式名:db2admin 1、db2look -d sample -u db2admin -e -o db2look.sql -- 这将生成由用户db2admin 创建的所有表和联合对象的 DDL 语句 -- db2look 输出被发送到名为 db2look.sql 的文件中 3.、db2look -d sample -z db2admin -e -o db2look.sql -- 这将为模式名为db2admin 的所有表生成 DDL 语句 -- 还将生成 $USER 创建的所有联合对象的 DDL。 -- db2look 输出被发送到名为 db2look.sql 的文件中 3.、db2look -d sample -u db2admin -m -o db2look.sql -- 这将生成 UPDATE 语句以捕获关于用户db2admin创建的表/昵称的统计信息 -- db2look 输出被发送到名为 db2look.sql 的文件中 4.、db2look -d sample -u db2admin -e -wrapper W1 -o db2look.sql -- 这将生成由用户db2admin创建的所有表的 DDL 语句 -- 还将生成适用于包装器 W1 的用户db2admin所创建所有联合对象的 DDL -- db2look 输出被发送到名为 db2look.sql 的文件中 5、db2look -d sample -u db2admin -e -server S1 -o db2look.sql -- 这将生成由用户db2admin创建的所有表的 DDL 语句 -- 还将生成适用于服务器 S1 的用户db2admin所创建所有联合对象的 DDL -- db2look 输出被发送到名为 db2look.sql 的文件中 6、执行sql脚本 db2 -tvf 目录\xxx.sql -z 目录\xxx.log 7、编译执行存储过程(大家对这个不太理解我们后面在说!) 编译:db2 -td@ -f 存过文件位置 执行:db2 “call 存过名字(参数)”
【阿里云ACE】上海新春活动 20180203 上海的冬天,又湿又冷,很少见下雪。每年冬天的来临,都有经历几场淅淅沥沥的小雨。树上的黄叶,好像凋落的特别快。好像前些天还是绿黄绿黄的,突然间寒风来袭。经过几场小雨,和寒风的凛冽,然后就只看到光脱的枝桠直指着天空.一切变得那么静谧,萧瑟。 我们的魔都!!上海!!我们又来啦!!说起上海给我的感觉是有魔力但不失分度!就像一个女王!高傲般的诱人!**上海的小巷也是别有一番风味!古典而不失味道!** 谜一样的城市!应该是很有味道的一座城市!当然我们这次的主办方就在一个小巷子里!不由得让我想起大上海的另一番风景! 而我们今天来到了这里!!一个温馨的小巷里!一个温馨的地方! 而在今天这个日子里!我们借着春意举办了阿里云ACE上海同城会的第二场以技术分享为主题的活动! 阿里云 ACE全称Alibaba Cloud Engineer,寓意每个成员都是云计算的工程师、建造者。同时ACE又是扑克牌中的“A”,代表了这群人是云计算中最“王牌”的群体。 先看看我们的场地(赞助方洽客in空间吴兴路店),哈哈!是不是很有上海的小温馨! 接下来!什么都有!就差人了!!当然这次上海的活动我们请到了阿里云 MVP翟永东主题分享《最实用的大数据》说句心里话!翟永东;老师讲的很好!从案例讲到模型!句句简单明了让大家很容易接受。 中途休息阶段! 我给大家发橘子吃!!哈哈 通过课题开始了激烈的讨论。然后开始发礼物!给了最活跃的小伙伴!!接下来!我们开始啦!另外一个环节!那就是写新春对联!哈哈看大家对于新春的祝福!是不是很可爱!这些程序猿们。 上拜图灵只佑可用,下跪关公但求永动!横批:风调码顺 于是上海这次活动圆满结束啦!!祝所有的程序猿新年快乐啦!愿永无BUG!!!年后活动!我们再约!新年快乐啦!最后感谢到场小伙伴的参与,感谢这次产地赞助商上海洽客in空间吴兴路店的支持,下次再见啦! 关注官方活动钉钉群获取最新活动内容!线上线下直播!等你来学习!
【阿里云ACE】杭州新春活动 20180204 杭州前段时间的雪景,刷遍了朋友圈和头条!!不经让我想起了疏影(余于辛卯岁北归,与西湖诸友夜酌,因有感于旧游,寄周草窗。)的一首诗!感触颇深。所以先来回味一下!新春前的杭州气息! 柳黄未结。放嫩晴消尽,断桥残雪。隔水人家,浑是花阴,曾醉好春时节。 轻车几度新堤晓,想如今、燕莺犹说。纵艳游、得似当年,早是旧情都别。 重到翻疑梦醒,弄泉试照影,惊见华发。却笑归来,石老云荒,身世飘然一叶。 闭门约住青山色,自容与、吟窗清绝。怕夜寒、吹到梅花,休卷半帘明月。 是不是杭州雪景名不虚传!! 雪景固然很美,但是春色却是另一番美景,古人云:> “ 江南好,风景旧曾谙。日出江花红胜火,春来江水绿如蓝。能不忆江南! ” 而在今天这个日子里!我们借着春意举办了阿里云ACE杭州同城会的第二场以技术分享为主题的活动! 阿里云 ACE全称Alibaba Cloud Engineer,寓意每个成员都是云计算的工程师、建造者。同时ACE又是扑克牌中的“A”,代表了这群人是云计算中最“王牌”的群体。 先看看我们的合集图! 首先我来算个概率问题: 相遇的概率目前世界人口60多亿。一生有: 80*365=29200(天)平均每天可以遇到1000个人左右。 一辈子遇到人的总数: 29200*1000=29200000(人)相遇的几率:29200000/6000000000=0.00487 相识概率计算:平安活到80岁大概会认识3000人左右(最不爱交友的人的数字,比较保守一点地说:)相识概率: 3000/6000000000=0.0000005(千万分之5) 相知概率计算:人活一辈子有几个知心朋友呢?相知概率: 20/6000000000=0.000000003(十亿分之3) 所以呢?今天在这里遇见大家是一种很难得缘分! 当然大家能够聚在一起除了缘分之外,当然就是我们这次ACE活动的目的,希望大家可以学到知识,认识朋友! 所以我们今天请来了三位大咖,给大家分享他们在自己的职业道路上所擅长的领域做一个分享! 当然呢?活动前的第一步,小伙伴都会签到,顺便领取我们阿里云定制的贴纸,是不是很有爱心?? 全景良仓加速器(这次活动场地的赞助方)集合、拍照、签到。发布了当场活动时间内,发布本次活动点赞数最高的一个小伙伴,获得阿里云的定制机械键盘O!! 是不是光芒四射哈哈!!(虽然这个已经选出来了) 在这个时候费亮哥哥出场啦!!!!光芒四射,这次他来串讲!(俗称打酱油!),然后就是我作为会长和活动发起人就微微的做了一下自我介绍啦~~(费亮哥哥在我右边,哈哈) 当然作为重酬戏的活动开始啦!我们首先邀请到阿里云 MVP应俊主题分享《新互联网环境下人才的共享模式》。 应俊从互联网+(衣食住行)、平台与个人模式、自由职业者、全民IT时代等角度出发,全面分析了互联网新趋势,并列举了软件众包的优势。最后,应俊总结了未来信息工作者必备的六大素质,其中包括“内在的自我驱动力”,“自定义工作、重视结果”,“熟练使用新的沟通工具”,“笔头功夫要硬”,“从知识向学习转变”,“风向信息”。 ^_^有木有看到大家都很专注的样子哈哈! ** 然后我们邀请了阿里云 MVP姜炳主题分享《玩转数据——运维的价值和目标》(一起探讨我们在运维上踩过的坑)** 并从效率、稳定(质量)、安全、成本等角度进行了运维目标拆解。最后,姜炳打趣地总结到,运维就是一个”自我实现,到自我淘汰,再到自我实现“的过程,否则运维的头发也不会变少看到大家在互动的样子我就放心了!哈哈 具有超过10年HR经验,专注技术人才人力资源领域的HR家CEO赵瑾瑾也来到现场,与小伙伴们分享职场“那些事儿”。 看到美女HR给现场的小伙伴,测适合什么样的女生真的想上去试一把!哈哈。场面一度爆笑呀!!! 然后书法大师,上台为我们讲了关于春联的故事!暗示写春联活动开始啦!! 春节临近,主办方备齐笔墨纸砚,特意请来中国美术学院研究生教大家如何写春联。现场,大师大显身手为参与人员“私人定制”了多副春联,把现场的气氛装点得喜气洋洋。现场的小伙伴,也纷纷拿起笔墨表达对于生活的无限憧憬。辞旧迎新,春联寄语了大家对美好的向往,赞助方全景良仓加速器希望在冬去春来的时候,回望收获的喜悦,也祝福各位更美好的明天。 写春联活动开始啦!最有创意得阿里云定制书包哦!其他同学也有机会活的阿里云定制礼物哦!下面就是春联大集合!! (我的创意哈哈,虽然不是我写的) “莫道运维无姝丽,谁言开发不风情”,横批“十动然拒”,简直道出心声。 小伙伴们有趣的灵魂真是呼之欲出~ 活动结束啦!最后在放一张我们的合照!! 最后感谢到场小伙伴的参与,感谢这次产地赞助商杭州全景良仓加速器的支持,和中国美术学院研究生们。下次再见啦! 关注官方活动钉钉群获取最新活动内容!线上线下直播!等你来学习!
技术交流群:127591054 楼主,在爬网页抓数据的时候。发现lxml死活装不上,百度了试了这种奇葩做法,最终还是不行,知道看到一个神作!!哈哈。我总结一下这个问题。我用pip自动装的,lxml发现报错!!!然后手动解决问题!**问题描述:running build_ext building 'lxml.etree' extension 目测是没有找到lxml.etree这个模块!!**下面开始解决!! 我需要装的包,大伙如果需要可以装,这个没什么依赖的! python -m pip install requests lxml依赖的包,网上说有很多!我最后都没有装,也装上了!主要一点,首先更新pip 。如果没更新的话,目前版本9.1 python -m pip install --upgrade pip 下载这个版本:lxml-3.7.1-cp35-cp35m-win_amd64.whl高一点版本提示:running build_ext building 'lxml.etree' extension 没有这个包,所以装3.7版本点击这个地址下载lxml。 python -m pip install 对应本地路径./lxml-3.7.1-cp35-cp35m-win_amd64.whl 然后就可以啦~~~~
作者企鹅:595696297 技术交流群:127591054 工作中用到所以开发了一个,。映射文档如下格式。格式按照自己需求参考。我这里有N列,可以参考。做必要改动即可。 下面是运行结果 其他SQL语句都是基本差不多的,看一下代码,略微改动一下,就可以完美移植各种数据库的映射语句。 简单说一下怎么使用下面是目录的结构,文档的格式在ExcelFile文件夹中。 1、首先要保证安装Python3.x版本。我这里用的是3.02、安装所需要包,用win+R进入CMD窗口输入:python -m pip install xlrd3、按照标准化文档的格式写映射文档,然后放到ExcelFile目录下,名字格式:数据标准化拆分-XXXXX4、按照自己需求配置,配置文件。同级目录:Config.txt import xlrd #import pandas as pd import collections import random import time from datetime import date,datetime import sys,os,io #Author JackChiang #遇到问题:联系QQ595696297哦! #配置名称置为空等待读取 userspace = '' sheetname = '' if_add_flog = '' if_auto_load = '' if_auto_mkdir = '' #获取当前脚本所在路径 def cur_file_dir(): path = sys.path[0] #获取脚本路径 if os.path.isdir(path):#判断脚本是文件还是编译后的文件,如果是脚本返回脚本目录,如果是编译文件,返回编译文件路径 return path elif os.path.isfile(path): return os.path.dirname(path) #读取配置文件 def read_config(fileone): #申明修改全局变量 global userspace,sheetname,if_add_flog,if_auto_load,if_auto_mkdir f1 = open(fileone,'r+') while 1: lines = f1.readlines(10) if not lines: break for line in lines: line=line.strip('\n') file_key = line.split('=')[0] file_value = line.split('=')[1] if file_key == 'USERSPACE': userspace = file_value if file_key == 'SHEETNAME': sheetname = file_value if file_key == 'IF_ADD_FLOG': if_add_flog = file_value if file_key == 'IF_AUTO_LOAD': if_auto_load = file_value if file_key == 'IF_AUTO_MKDIR': if_auto_mkdir = file_value if userspace != '' and sheetname != '' and if_add_flog != '' and if_auto_load != '' and if_auto_mkdir != '': logMsg.write('配置文件读取完成!\n') return True else: logMsg.write('配置文件读取失败!\n') return False #搜索当前标准化文档的文件 def file_name(file_dir): L = [] #TRUE代表开启自动搜索全部文档,否则代表读取file文件目录 if if_auto_load != 'TRUE': f2 = open(file_dir+"\\file.txt",'r+') while 1: lines = f2.readlines(100) if not lines: break for line in lines: line=line.strip('\n') L.append(line) f2.close() print('从文件读取目录文件完成!') logMsg.write('从文件读取目录文件完成!\n') else: f1 = open(file_dir+"\\file.txt",'w') ExcelFile = file_dir+'\\ExcelFile' #清空文件内容 f1.truncate() for root, dirs, files in os.walk(ExcelFile): for file in files: filename = os.path.splitext(file)[0] filespl = os.path.splitext(file)[1] if '数据标准化拆分' in filename: if filespl == '.xls': path = '%s%s%s' % (root, '\\', file) L.append(path) f1.write(path) f1.write('\n') logMsg.write(file + '文件写入!!\n') print('写入目录文件完成!') logMsg.write('写入目录文件完成!\n') f1.close() return tuple(L) #读取Excel文件中的内容,找到没张表的位置 def read_excel_one(sheet): #开始一行一行遍历锁定ALL位置 flog = 0 flog_count = 0 L = [] j = 0 L1 = [] #dict = {} #使用有序字典 dict = collections.OrderedDict() for i in range(sheet.nrows): value = sheet.cell_value(i, 3) table_name = sheet.cell_value(i, 1) mode_value = sheet.cell_value(i, 0) if value == 'ALL': j = i if j != 1: L.append(j) L.append(i) L.append(table_name) L.append(mode_value) flog_count = flog_count + 1 #print('%s 找到啦!第%s次有ALL:%s'%(flog_count,i,table_name)) L.append(sheet.nrows-1) #print(L) #找到第一次出现ALL的位置代表表的开始,第二次出现的前一个位置代表结束。 #遍历列表 print(len(L)) for i in range(len(L)): #print(i+1,L[i]) if(i+1)%4==0: if i+1 != len(L): #print(L[i-3]) #print(L[i-2]) #print(L[i-1]) #print(L[i]) L1.append(L[i-1]) L1.append(L[i-3]) L1.append(L[i]-1) dict[L[i-2]] = L1 L1 = [] else: #处理最后一个情况 L1.append(L[i-1]) L1.append(L[i-3]) L1.append(L[i]) dict[L[i-2]] = L1 L1 = [] #print(dict) return dict #创建目录 def mkdir_one(fileone,cell_value): path_one = fileone + '\\' + cell_value # 判断路径是否存在 # 存在 True # 不存在 False isExists=os.path.exists(path_one) # 判断结果 if not isExists: # 如果不存在则创建目录 # 创建目录操作函数 os.makedirs(path_one) logMsg.write(path_one +' 创建成功\n') else: # 如果目录存在则不创建,并提示目录已存在 logMsg.write(path_one +' 目录已存在\n') return path_one #翻译语句 def read_table_one(dict,sheet,fileone): ddlFile = fileone + '\\DDL' defFile = fileone + '\\DDL\\DEFAULT_DDL' #cell_value = sheet.cell_value(2,0) #path_one = mkdir_one(ddlFile,cell_value) #判断是否需要创建文件夹,还是使用默认 path_one = defFile #遍历字典取值 for k,v in dict.items(): cell_value = v[0] #BANK : ['IMBS',1, 18] if if_auto_mkdir == 'TRUE': path_one = mkdir_one(ddlFile,cell_value) logMsg.write('%s 表的行范围为: %s\n'%(k,v)) f1 = open('%s\\%s_%s.ddl'%(path_one,cell_value,k),'w',encoding='utf-8') page = '--------------------------------------------------\n' f1.write(page) f1.write('-- Create Table '+ cell_value + '.'+ k+'\n') f1.write(page) f1.write('Create Table '+ cell_value + '.'+ k+'(\n') row_pri_name = '' row_table_decs = '' Str_com = [] for i in range(v[1]+1,v[2]+1): row_data = sheet.row_values(i) if row_data[5] == 'INTEGER': table_cloumn_type = row_data[5] elif row_data[5] == 'TIMESTAMP': table_cloumn_type = row_data[5] elif row_data[5] == 'DATE': table_cloumn_type = row_data[5] elif row_data[5] == 'BIGINT': table_cloumn_type = row_data[5] elif row_data[5] == 'DECIMAL': row_data7 = row_data[7] if row_data[6] == '': logMsg.write('在%s表中的%s字段长度没有写!!\n'%(k,row_data[3])) return; if row_data[7] == '': logMsg.write('在%s表中的%s字段精度没有写!!默认为0 \n'%(k,row_data[3])) row_data7 = 0 table_cloumn_type = '%s(%d,%d)'%(row_data[5],row_data[6],row_data7) else: table_cloumn_type = '%s(%d)'%(row_data[5],row_data[6]) if row_data[10] == 'Physical Primary Key': table_pri = ' NOT NULL ,' if row_pri_name == '': row_pri_name = row_data[3]+',' else: row_pri_name = row_pri_name+row_data[3]+',' else: table_pri = ' ,' #读到最后一行,去掉逗号 if i == v[2] and if_add_flog != 'TRUE': table_pri = table_pri[:-1]+')' #拼接字段 f1.write(' '+row_data[3]+' '+table_cloumn_type+table_pri) f1.write('\n') #注解放入列表 if row_data[4] != '': Str_com.append('Comment on Column %s.%s.%s is \'%s\';'%(cell_value,k,row_data[3],row_data[4])) row_table_decs = row_data[2] #print(row_data) if if_add_flog == 'TRUE': f1.write(' EFF_DT DATE NOT NULL ,\n') f1.write(' END_DT DATE ,\n') f1.write(' JOB_SEQ_ID INTEGER )\n') f1.write('in %s\n'%(userspace)) f1.write('Partitioning Key ('+row_pri_name+'EFF_DT) Using Hashing\n') f1.write('Compress Yes;\n') else: f1.write('in %s\n'%(userspace)) f1.write('Partitioning Key ('+row_pri_name[:-1]+') Using Hashing\n') f1.write('Compress Yes;\n') #创建注解 f1.write('Comment on Table '+cell_value + '.'+ k+' is \''+ row_table_decs + '\';\n') for i in Str_com: f1.write(i) f1.write('\n') f1.write('\n') if if_add_flog == 'TRUE': #创建索引 f1.write(page) f1.write('-- Create Index '+cell_value + '.'+ k+'_'+time.strftime("%Y%m%d")+'_1\n') f1.write(page) f1.write('Create Index '+cell_value + '.'+ k+'_'+time.strftime("%Y%m%d")+'_1\n') f1.write(' on '+cell_value + '.'+ k+'\n') f1.write(' (END_DT) Allow Reverse Scans;\n') f1.write('\n') f1.write(page) f1.write('-- Create Index '+cell_value + '.'+ k+'_'+time.strftime("%Y%m%d")+'_2\n') f1.write(page) f1.write('Create Index '+cell_value + '.'+ k+'_'+time.strftime("%Y%m%d")+'_2\n') f1.write(' on '+cell_value + '.'+ k) f1.write(' (JOB_SEQ_ID) Allow Reverse Scans;\n') f1.write('\n') #创建主键 f1.write(page) SQLKey = random.randint(100000000000000,999999999999999) f1.write('-- Create Primary Key SQL%d\n'%SQLKey) f1.write(page) f1.write('alter table '+cell_value + '.'+ k+'\n') f1.write(' add constraint SQL%d\n'%SQLKey) if if_add_flog == 'TRUE': f1.write('Primary Key ('+row_pri_name+' EFF_DT);\n') else: f1.write('Primary Key ('+row_pri_name[:-1]+');\n') f1.close() def execute_mode(L_name): #循环处理文档 for L in L_name: ExcelFile=xlrd.open_workbook(L) path_name = L.split('\\')[-1] SheelList = sheetname.split(',') #获取目标EXCEL文件sheet名 L_Sheetname = [] Sheetname_one = ExcelFile.sheet_names() for Sheet_NM in Sheetname_one: for Shee_t in SheelList: if Sheet_NM == Shee_t: L_Sheetname.append(Sheet_NM) else: pass #print(L_Sheetname) for Sheet_NM in L_Sheetname: sheet=ExcelFile.sheet_by_name(Sheet_NM) print('文件名:%s Sheet名字:%s Sheet行数:%s Sheet列数:%s'%(path_name,sheet.name,sheet.nrows,sheet.ncols)) logMsg.write('文件名:%s Sheet名字:%s Sheet列数:%s Sheet行数:%s\n'%(path_name,sheet.name,sheet.nrows,sheet.ncols)) #rows=sheet.row_values(2)#第三行内容 #cols=sheet.col_values(1)#第二列内容 #value = sheet.cell_value(1, 3) #print(value) dict = read_excel_one(sheet) read_table_one(dict,sheet,fileone) L_Sheetname = [] print('文件:%s 处理完成!!!'%path_name) logMsg.write('文件:%s 处理完成!!!\n'%path_name) print('===========================================\n') logMsg.write('===========================================\n') print('===========================================\n') logMsg.write('===========================================\n') #用pandas 实现(暂时放弃) #def read_excel_two(filepath): # df = pd.read_excel(filepath) # print(df.shape) # print(df.dtypes) # #print(df[df.字段代码 == 'ALL']) ################################################### ###################开始################## #记录日志 fileone = cur_file_dir() logMsg = open(fileone+"\\RunLog.txt",'w',encoding='utf-8') con_flog = read_config(fileone+"\\Config.txt") v1 = '%s、表空间已经设置为:%s:'%(1,userspace); v2 = '%s、sheet页名字已经设定为:%s:'%(2,sheetname) v3 = '%s、是否加ODS末尾字段状态:%s:'%(3,if_add_flog) v4 = '%s、是否自动读取ExcelFile文件夹文件状态为:%s:'%(4,if_auto_load) v5 = '%s、是否自动根据模式名创建文件状态为:%s:'%(5,if_auto_mkdir) print(v1) print(v2) print(v3) print(v4) print(v5) logMsg.write(v1+'\n') logMsg.write(v2+'\n') logMsg.write(v3+'\n') logMsg.write(v4+'\n') logMsg.write(v5+'\n') #可以从L取数,但这里灵活一点从文件取数 #如果需要自动识别所有,配置文件修改为TRUE,否则手动决定目录 L = file_name(fileone) #print(L[1]) if con_flog == True: execute_mode(L) print('程序执行完毕!!!') logMsg.write('=========程序执行完毕!!!============\n') logMsg.close() else: print('配置文件格式错误!!')
企鹅交流群 127591054 ORACLE select date '2017-11-11' + level - 1 ddate, level from dual connect by level < date '2017-11-30' - date '2012-11-11' + 2 DB2 with temp1(col1)as ( values(date('2005-09-03')) union all select col1 + 1 DAY from temp1 where col1 +1 DAY <= date('2006-02-01') ) select * FROM TEMP1;
QQ技术交流群:127591054海量资料免费学习,各个方向大神带你飞,欢迎爱学习的你哦。 作者企鹅:595696297欢迎交流数据。 当然总结的同时发现一篇超级详细的文章,大家有兴趣可以去读一下。 http://blog.csdn.net/freeking101/article/details/76522504 SQL对于大多数数据库来说大同小异,来简练的说一下一条SQL查询语句执行的流程。 1、首先点击运行按钮,写好的SQL语句会通过你用的客户端传到服务器。 2、服务器对SQL语句进行解析,首先传过来的SQL语句会先从高数缓存中查找是否有相同的执行计划,如果找到就会直接执行,省去后面步骤节约时间。另外这个缓存是服务器的,内存的读取速度要比硬盘快的多! 3、服务器开始检查语句的合法性。检查传过来的SQL语句是否符合语法规则,如果出现错误就会反馈给客户端。在这一步不会对SQL语句本身的表,字段进行检查。这些是下一步需要检查的。 4、语言含义检查。当语法没有问题的时候,数据库开始检查表,字段是不是在数据字典中呀,如果不存在,同样会把错误信息反馈给客户端。所以在写查询语句的时候先是语法错误,语法没错了才是字段表结构错误。 5、获取对象锁。如上都正确了,数据库会把要查询的表对象进行加锁,以免在操作的同时,别人在对同一条数据或者表结构进行处理变更,从而保持一致。 6、数据访问权限核对。数据库会查询当前用户是否具有这张表的查询权限,当然数据权限这里需要如上都检查没问题再会到这一步!所以sql写正确未必能查到数据,sql写错误不知后面还有个坑。 7、最佳执行计划。数据库会对没有问题的sql,按照一定的规则进行优化,当然优化是有限的。具体的还需要自己在sql的同时考虑到sql语句的调优,已达到最快的效率!然后数据库会把这条sql语句以及执行计划放到数据库的高速缓存,以便下次再有相同语句,直接执行不用在检查了。 8、语句执行。 一是:若被选择行所在的数据块已经被读取到数据缓冲区的话,则服务器进程会直接把这个数据传递给客户端,而不是从数据库文件中去查询数据。 二是:若数据不在缓冲区中,则服务器进程将从数据库文件中查询相关数据,并把这些数据放入到数据缓冲区中(buffer cache) 9、SQL语句中的函数、关键字、排序等执行顺序。 MYSQL ORACLE (8)SELECT (9)DISTINCT (11)<Top Num> <select list> (1)FROM [left_table] (3)<join_type> JOIN <right_table> (2)ON <join_condition> (4)WHERE <where_condition> (5)GROUP BY <group_by_list> (6)WITH <CUBE | RollUP> (7)HAVING <分组后筛选> (10)ORDER BY <排序字段> 逻辑查询处理阶段简介 ---------- 1、FROM:对FROM子句中的前两个表执行笛卡尔积(Cartesian product)(交叉联接),生成虚拟表VT1 2、ON:对VT1应用ON筛选器。只有那些使<join_condition>为真的行才被插入VT2。 3、OUTER(JOIN):如 果指定了OUTER JOIN(相对于CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到 VT2,生成VT3.如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。 4、WHERE:对VT3应用WHERE筛选器。只有使<where_condition>为true的行才被插入VT4. 5、GROUP BY:按GROUP BY子句中的列列表对VT4中的行分组,生成VT5. 6、CUBE|ROLLUP:把超组(Suppergroups)插入VT5,生成VT6. 7、HAVING:对VT6应用HAVING筛选器。只有使<having_condition>为true的组才会被插入VT7. 8、SELECT:处理SELECT列表,产生VT8. 9、DISTINCT:将重复的行从VT8中移除,产生VT9. 10、ORDER BY:将VT9中的行按ORDER BY 子句中的列列表排序,生成游标(VC10). 11、TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回调用者。 注:步骤10,按ORDER BY子句中的列列表排序上步返回的行,返回游标VC10.这一步是第一步也是唯一 一步可以使用SELECT列表中的列别名的步骤。这一步不同于其它步骤的 是,它不返回有效的表,而是返回一个游标。SQL是基于集合理论的。集合不会预先对它的行排序,它只是成员的逻辑集合,成员的顺序无关紧要。对表进行排序 的查询可以返回一个对象,包含按特定物理顺序组织的行。ANSI把这种对象称为游标。理解这一步是正确理解SQL的基础。 因为这一步不返回表(而是返回游标),使用了ORDER BY子句的查询不能用作表表达式。表表达式包括:视图、内联表值函数、子查询、派生表和共用表达式。它的结果必须返回给期望得到物理记录的客户端应用程序。例如,下面的派生表查询无效,并产生一个错误: select * from(select orderid,customerid from orders order by orderid) as d 下面的视图也会产生错误 create view my_view as select * from orders order by orderid 在SQL中,表表达式中不允许使用带有ORDER BY子句的查询,而在T—SQL中却有一个例外(应用TOP选项)。 所以要记住,不要为表中的行假设任何特定的顺序。换句话说,除非你确定要有序行,否则不要指定ORDER BY 子句。排序是需要成本的,SQL Server需要执行有序索引扫描或使用排序运行符。 10、数据提取过程 当语句执行完成之后,查询到的数据还是在服务器进程中,还没有被传送到客户端的用户进程。所以,在服务器端的进程中,有一个专门负责数据提取的一段代码。他的作用就是把查询到的数据结果返回给用户端进程,从而完成整个查询动作。 END~~
一、使用正则表达式的命令 使用正则表达式的命令最常见的就是 / (搜索)命令。其格式如下: /正则表达式 另一个很有用的命令就是 :s(替换)命令,将第一个//之间的正则表达式替换成第二个//之间的字符串。 :s/正则表达式/替换字符串/选项 在学习正则表达式时可以利用 / 命令来练习。 二、元字符 元字符是具有特殊意义的字符。使用元字符可以表达任意字符、行首、行 尾、某几个字符等意义。 元字符一览 元字符 说明 . 匹配任意一个字符 [abc]匹配方括号中的任意一个字符。可以使用-表示字符范围,如[a-z0-9]匹 配小写字母和阿拉伯数字。 [^abc] 在方括号内开头使用^符号,表示匹配除方括号中字符之外的任意字符。 \d 匹配阿拉伯数字,等同于[0-9]。 \D 匹配阿拉伯数字之外的任意字符,等同于[^0-9]。 \x 匹配十六进制数字,等同于[0-9A-Fa-f]。 \X 匹配十六进制数字之外的任意字符,等同于[^0-9A-Fa-f]。 \w 匹配单词字母,等同于[0-9A-Za-z_]。 \W 匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]。 \t 匹配<TAB>字符。 \s 匹配空白字符,等同于[ \t]。 \S 匹配非空白字符,等同于[^ \t]。 另外,如果要查找字符 *、.、/等,则需要在前面用 \ 符号,表示这不是元字符,而只是普通字符而已。 元字符 说明 \* 匹配 * 字符。 \. 匹配 . 字符。 \/ 匹配 / 字符。 \\ 匹配 \ 字符。 \[ 匹配 [ 字符。 表示数量的元字符 元字符 说明 * 匹配0-任意个 \+ 匹配1-任意个 \? 匹配0-1个 \{n,m} 匹配n-m个 \{n} 匹配n个 \{n,} 匹配n-任意个 \{,m} 匹配0-m个 表示位置的符号 元字符 说明 $ 匹配行尾 ^ 匹配行首 \< 匹配单词词首 \> 匹配单词词尾 使用例 /char\s\+[A-Za-z_]\w*; " 查找所有以char开头,之后是一个以上的空白, " 最后是一个标识符和分号 /\d\d:\d\d:\d\d " 查找如 17:37:01 格式的时间字符串 :g/^\s*$/d " 删除只有空白的行 :s/\<four\>/4/g " 将所有的four替换成4,但是fourteen中的four不替换 三、替换变量 在正规表达式中使用 ( 和 ) 符号括起正规表达式,即可在后面使用\1、\2 等变量来访问 ( 和 ) 中的内容。 使用例 /\(a\+\)[^a]\+\1 " 查找开头和结尾处a的个数相同的字符串," 如 aabbbaa,aaacccaaa,但是不匹配 abbbaa :s/\(http:\/\/[-a-z\._~\+%\/]\+\)/<a href="\1">\1<\/a>/ " 将URL替换为<a href="http://url">http://url</a>的格式 :s/\(\w\+\)\s\+\(\w\+\)/\2\t\1 " 将 data1 data2 修改为 data2 data1 四、函数式 在替换命令 s/// 中可以使用函数表达式来书写替换内容,格式为 :s/替换字符串/\=函数式 在函数式中可以使用 submatch(1)、submatch(2) 等来引用 \1、\2 等的内容,而submatch(0)可以引用匹配的整个内容。 使用例 :%s/\<id\>/\=line(".") " 将各行的 id 字符串替换为行号 :%s/^\<\w\+\>/\=(line(".")-10) .".". submatch(1) " 将每行开头的单词替换为 (行号-10).单词 的格式, " 如第11行的 word 替换成 1. word 五、与Perl正则表达式的区别 元字符的区别 Vim语法 Perl语法 含义 \+ + 1-任意个 \? ? 0-1个 \{n,m} {n,m} n-m个 和 (和) 分组 六、vi 正则表达式练习 闲言碎语不要讲…例子说明一切,比如下面这段我需要换成 ubb 标签 vim 命令模式,输入 :%s/.*src=”([^"]*)”[^>]*>/[img]1[/img]/g 替换为 [img ]gu.jpg[ /img] [img ]os.jpg[ /img] [img ]hu.jpg[ /img] [img ]ang.jpg[ /img] 解释如下: : 命令执行状态 %s 表示查找并替换 %s/a/b/g a 被查找的字符串(正则匹配);b 要替换成的文字;g 表示全局搜索替换(否则只处理找到的第一个结果) ([^"]*) 表示非引号的字符N个;外面 () 表示后面替换要用(用 1,…,9等引用) [/img] / 需要被 转义 与其它工具正则不一样的地方在于 () 也必须 (),怪不得我老是弄不出来。 相关资料: via http://net.pku.edu.cn/~yhf/tao_regexps_zh.html vi 命令 作用 :%s/ */ /g 把一个或者多个空格替换为一个空格。 :%s/ *$// 去掉行尾的所有空格。 :%s/^/ / 在每一行头上加入一个空格。 :%s/^[0-9][0-9]* // 去掉行首的所有数字字符。 :%s/b[aeio]g/bug/g 将所有的bag、beg、big和bog改为bug。 :%s/t([aou])g/h1t/g 将所有tag、tog和tug分别改为hat、hot和hug(注意用group的用法和使用1引用前面被匹配的字符)。 Sed Sed是Stream EDitor的缩写,是Unix下常用的基于文件和管道的编辑工具,可以在手册中得到关于sed的详细信息。 这里是一些有趣的sed脚本,假定我们正在处理一个叫做price.txt的文件。注意这些编辑并不会改变源文件,sed只是处理源文件的每一行并 把结果显示在标准输出中(当然很容易使用重定向来定制): sed脚本 描述 sed ’s/^$/d’ price.txt 删除所有空行 sed ’s/^[ ]*$/d’ price.txt 删除所有只包含空格或者制表符的行 sed ’s/”//g’ price.txt 删除所有引号 关于magic vim中有个magic的设定。设定方法为: :set magic " 设置magic :set nomagic " 取消magic :h magic " 查看帮助 vim毕竟是个编辑器,正则表达式中包含的大量元字符如果原封不动地引用(像perl那样), 势必会给不懂正则表达式的人造成麻烦,比如 /foo(1) 命令, 大多数人都用它来查找foo(1)这个字符串, 但如果按照正则表达式来解释,被查找的对象就成了 foo1 了。 于是,vim就规定,正则表达式的元字符必须用反斜杠进行转义才行, 如上面的例子,如果确实要用正则表达式,就应当写成 /foo(1) 。 但是,像 . * 这种极其常用的元字符,都加上反斜杠就太麻烦了。 而且,众口难调,有些人喜欢用正则表达式,有些人不喜欢用…… 为了解决这个问题,vim设置了 magic 这个东西。简单地说, magic就是设置哪些元字符要加反斜杠哪些不用加的。 简单来说: magic(\m):除了 $ . * ^ 之外其他元字符都要加反斜杠。 nomagic(\M):除了 $ ^ 之外其他元字符都要加反斜杠。 这个设置也可以在正则表达式中通过 \m \M 开关临时切换。 \m 后面的正则表达式会按照 magic 处理,\M 后面的正则表达式按照 nomagic 处理, 而忽略实际的magic设置。 例如: /\m.* # 查找任意字符串 /\M.* # 查找字符串 .* (点号后面跟个星号) 另外还有更强大的 \v 和 \V。 * \v(即 very magic 之意):任何元字符都不用加反斜杠 * \V(即 very nomagic 之意):任何元字符都必须加反斜杠 例如: /\v(a.c){3}$ # 查找行尾的abcaccadc /\m(a.c){3}$ # 查找行尾的(abc){3} /\M(a.c){3}$ # 查找行尾的(a.c){3} /\V(a.c){3}$ # 查找任意位置的(a.c){3}$ 默认设置是 magic,vim也推荐大家都使用magic的设置,在有特殊需要时,直接通过 \v\m\M\V 即可。 本文下面使用的元字符都是 magic 模式下的。 量词 vim的量词与perl相比一点也不逊色。 vim Perl 意义 * * 0个或多个(匹配优先) \+ + 1个或多个(匹配优先) \? 或 \= ? 0个或1个(匹配优先),\?不能在 ? 命令(逆向查找)中使用 \{n,m} {n,m} n个到m个(匹配优先) \{n,} {n,} 最少n个(匹配优先) \{,m} {,m} 最多m个(匹配优先) \{n} {n} 恰好n个 \{-n,m} {n,m}? n个到m个(忽略优先) \{-} *? 0个或多个(忽略优先) \{-1,} +? 1个或多个(忽略优先) \{-,1} ?? 0个或1个(忽略优先) 从上表中可见,vim的忽略优先量词不像perl的 *? +? ?? 那样,而是统一使用 {- 实现的。 这大概跟忽略优先量词不常用有关吧。 环视和固化分组 vim居然还支持环视和固化分组的功能,强大,赞一个 :D 关于环视的解释请参考Yurii的《精通正则表达式》一书吧。 vim Perl 意义 \@= (?= 顺序环视 \@! (?! 顺序否定环视 \@<= (?<= 逆序环视 \@ (? 逆序否定环视 \@> (?> 固化分组 \%(atom\) (?: 非捕获型括号 和perl稍有不同的是,vim中的环视和固化分组的模式的位置与perl不同。 例如,查找紧跟在 foo 之后的 bar,perl将模式写在环视的括号内, 而vim将模式写在环视的元字符之前。 Perl的写法 /(?<=foo)bar/ vim的写法 /\(foo\)\@<=bar 参考 vim的帮助文件非常有用,关于正则表达式可以参考以下的内容。 :h pattern :h magic :h perl-patterns
QQ交流群:127591054 1、首先解压到/usr/lib/jvm/目录下 # tar zxvf jdk-8u5-linux-XXX.gz -C /usr/lib/jvm/ 一般是解压到/usr/lib下,可以在该目录下创建jvm,然后解压到既定目录,该目录下已经有一个ubuntu自带的jdk-6-openjdk了,而jdk1.8.0_05就是命令解压来的 2、配置jdk使其生效 sudo nano /etc/profile 在文件最末尾添加如下所示内容,ctrl+x,y退出即可完成保存,用其他编辑器类似。 export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_112 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH={JAVA_HOME}/bin:$PATH 3、更新默认jdk sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_05/bin/java 300 sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.8.0_05/bin/javac 300 sudo update-alternatives –config java 系统会列出系统中所有的jdk版本,选择最新安装的那个版本输入2即可 4、检查 # java –version
QQ交流群:127591054 JackChiang QQ:595696297 获取两个日期之间的日期列表如:输入2012-09-21~2013-10-21 得到的结果为:2012-09-21,2012-09-22等等一直到2013-10-21 调用get_date_list函数传入一个时间范围列表:如get_date_list([1,’2012-09-21’,’2013-10-21’]) 传入参数列表第0个代表状态,0代表日期传入是错误的,1,代表传入一个日期。2、代表传入两个日期,并且第二个日期是大于第一个日期的合法日期。 #获取两个日期中间的日期列表 def gen_dates(b_date, days): day = timedelta(days=1) for i in range(days): yield b_date + day*i def get_date_list(user_say_date): """ 获取日期列表 :param start: 开始日期 :param end: 结束日期 :return: """ data = [] if user_say_date[0] == 1: data.append(user_say_date[1]) return data elif user_say_date[0] == 2: start = datetime.strptime(user_say_date[1],"%Y-%m-%d").date() end = datetime.strptime(user_say_date[2], "%Y-%m-%d").date() for d in gen_dates(start, (end-start).days): data.append(d) #最后把日期加入 data.append(user_say_date[2]) return data else: data = [] return data 下面这个就可以解释上面的一些疑问,为什么需要状态,我这里对传入日期做了判断,因为用户可以输入一个日期而不是范围。 下面的函数就可以生成一个用户输入的时间列表,并且带有状态。然后列表就会作为上面代码函数的入参。 #日期处理 def CurDate(str): #首先判断当前日期是连续的还是单一天数的。 str_Date = re.split(r'~',str) #判断用户输入日期是不是有效日期 flog = 1 try: for i in range(len(str_Date)): datetime.strptime(str_Date[i],"%Y-%m-%d") except: flog = 0 # 代表有两个日期,或者就是只有一个日期 if len(str_Date) > 1 and flog == 1: #判断后面输入的日期是否大于前面的日期,验证用户输入数据是否正确 if datetime.strptime(str_Date[0],"%Y-%m-%d").date() > datetime.strptime(str_Date[1],"%Y-%m-%d").date(): #插入0代表数据错误 str_Date.insert(0,0) return str_Date else: #否则插入2代表有两个日期 str_Date.insert(0,2) return str_Date elif len(str_Date) == 1 and flog == 1: str_Date.insert(0,1) else: str_Date.insert(0,0) return str_Date 测试: 输入一个日期,如下图。 测试范围日期,如下图
QQ交流群:127591054 作者:JackChiang 作者QQ:595696297 Python版本3.5 这个小项目,是解决数据库查看的时候一些错误的,查看。每天都会跑数据,但是第一天的数据和第二天的名字可以是一样的,我第二天还可以在跑一遍。 涉及到的知识: 1、日期获取,例如获取2012-02-21~2013-08-21之间所有的日期列表,需要一天一天查询遍历。 2、正则匹配名字,由于一个调度会生成4条数据,需要找到这4条数据的顺序必须固定才为正确否则就是不对的。 3、然后把查询出来有问题的数据写入到文件。 代码有详细的注解,有问题可以练习我QQ学习哦 # -*- coding: utf-8 -*- import time import sys,os #要重新载入sys。因为 Python 初始化后会删除 sys.setdefaultencoding 这个方 法 import ibm_db import re import datetime from datetime import * #1、首先获取db2数据库连接,进行连接 #2、读取用户要操作的日期,可以输入日期范围和固定日期 #2.1、如果输入指定范围日期格式为2018-09-12~2019-09-21 #如果用户输入的是范围,这时候需要一天一天的进行处理,方法和2.2一样 #2.2、如果输入指定日期为:2019-09-02 #3、可以查询当前日志所有时间范围数据检查 #获取当前脚本所在路径 def cur_file_dir(): path = sys.path[0] #获取脚本路径 if os.path.isdir(path):#判断脚本是文件还是编译后的文件,如果是脚本返回脚本目录,如果是编译文件,返回编译文件路径 return path elif os.path.isfile(path): return os.path.dirname(path) #添加配置文件 def OneFile(): dic = {} str = cur_file_dir() file_input = open(str+'\\DB2_Protory.txt','r') list_file_line = file_input.readlines() for list1 in list_file_line: print(list1.strip('\n')) list1 = list1.strip('\n') key = (list1.split('='))[0].upper() value = (list1.split('='))[1] dic[key]=value file_input.flush() file_input.close() return dic #首先获取db2数据库连接,进行连接 def ConDB(database,hostname,port,protocol,uid,pwd): dburl = "DATABASE=%s;HOSTNAME=%s;PORT=%s;PROTOCOL=%s;UID=%s;PWD=%s;"%(database,hostname,port,protocol,uid,pwd) print(dburl) conn = ibm_db.connect(dburl, "", "") if conn: sql = "SELECT service_level, fixpack_num FROM TABLE(sysproc.env_get_inst_info())as INSTANCEINFO" stmt = ibm_db.exec_immediate(conn,sql) result = ibm_db.fetch_both(stmt) print('----------------------连接成功---------------------') print('---地址:%s 数据库:%s 用户:%s'%(hostname,database,uid)) print('DB2 version: ',result[0]) return conn else: return #用来关闭数据库连接 def CloseClo(conn): ibm_db.close(conn) #日期处理 def CurDate(str): #首先判断当前日期是连续的还是单一天数的。 str_Date = re.split(r'~',str) #判断用户输入日期是不是有效日期 flog = 1 try: for i in range(len(str_Date)): datetime.strptime(str_Date[i],"%Y-%m-%d") except: flog = 0 # 代表有两个日期,或者就是只有一个日期 if len(str_Date) > 1 and flog == 1: #判断后面输入的日期是否大于前面的日期,验证用户输入数据是否正确 if datetime.strptime(str_Date[0],"%Y-%m-%d").date() > datetime.strptime(str_Date[1],"%Y-%m-%d").date(): #插入0代表数据错误 str_Date.insert(0,0) return str_Date else: #否则插入2代表有两个日期 str_Date.insert(0,2) return str_Date elif len(str_Date) == 1 and flog == 1: str_Date.insert(0,1) else: str_Date.insert(0,0) return str_Date #获取两个日期中间的日期列表 def gen_dates(b_date, days): day = timedelta(days=1) for i in range(days): yield b_date + day*i def get_date_list(user_say_date): """ 获取日期列表 :param start: 开始日期 :param end: 结束日期 :return: """ data = [] if user_say_date[0] == 1: date.append(user_say_date[1]) return data elif user_say_date[0] == 2: start = datetime.strptime(user_say_date[1],"%Y-%m-%d").date() end = datetime.strptime(user_say_date[2], "%Y-%m-%d").date() for d in gen_dates(start, (end-start).days): data.append(d) #最后把日期加入 date.append(user_say_date[2]) return data else: data = [] return data #查询根据时间所判断有问题的数据 def SelSQl(success_date,conn): #开始处理 #拼接处理SQL SQL= "这里写的是操作的代码"%success_date stmt = ibm_db.exec_immediate(conn, SQL) #一行一行的读取 result = ibm_db.fetch_both(stmt) # 设置默认值 flog = 0 a = ['', '', '', ''] seq_id = [0, 0, 0, 0] read_error = 0 #记录出错次数,4个为一次 sum_date = 0 #记录总数 #打开文件准备记录错误信息 str = cur_file_dir() f1 = open(str+"\\ErrorSQL.SQL",'a') while (result): # 四条数据做一次判断 sum_date = sum_date + 1 if flog == 4: #列表数据达到四条,开始判断顺序 a0 = r"^LD_.*?_INIT$" #第一行匹配格式 a1 = r"^AP_.*?_INIT$" # 第二行匹配格式 a2 = r"^LD_.*?[^I]?[^N]?[^I]?[^T]{1}$" # 第三行匹配格式 a3 = r"^AP_.*?[^I]?[^N]?[^I]?[^T]{1}$" # 第四行匹配格式 print(a) if re.match(a0, a[0]) != None and re.match(a1, a[1]) != None and re.match(a2, a[2]) != None and re.match(a3,a[3]) != None: pass else: # 如果其中有一个匹配不正确,代表数据顺序有问题。 # 所以要把错误信息放入到列表 read_error = read_error + 1 if read_error == 1: print('---------------------------日期:%s----------------------------'%success_date) f1.write('---------------------------日期:%s----------------------------'%success_date) f1.write('\n') print('发现数据出现问题!') # 把出错信息写入到文件。 ErrorSQL = "SELECT * FROM ETL.JOB_LOG A WHERE JOB_SEQ_ID IN(%d,%d,%d,%d) UNION ALL" % ( seq_id[0], seq_id[1], seq_id[2], seq_id[3]) f1.write(ErrorSQL) f1.write('\n') # 把每条时间放入指定列表位置,四条数据刷新一次 flog = 0 a = ['', '', '', ''] seq_id = [0, 0, 0, 0] a[flog] = result[2] seq_id[flog] = result[0] flog = flog + 1 result = ibm_db.fetch_both(stmt) #写完错误关掉文件 if read_error > 0 : f1.write('总行数为:%s ,出错的信息有: %s 次'%(sum_date/4,read_error)) f1.write('\n') f1.close() print('总行数为:%s ,出错的信息有: %s 次'%(sum_date/4,read_error)) #Main dice = OneFile() conn = None try: #conn = ConDB(dice['DATABASE'],dice['HOSTNAME'],dice['PORT'],dice['PROTOCOL'],dice['UID'],dice['PWD']) user_say = input("请输入指定范围日期格式例如为2018-09-12~2019-09-21,或者输入指定一天日期例如:2019-09-21") user_say_date = CurDate(user_say) print(user_say_date) data = get_date_list(user_say_date) print(data) #获取到一个日期列表然后循环进行查询 #for current_data in data: # SelSQl(current_data,conn) CloseClo(conn) except Exception as ex: CloseClo(conn) print(ex) finally: CloseClo(conn)
QQ交流群:127591054 JackChiang QQ:595696297 Python3.5 看代码说话,这里使用的python版本为3.5首先需要导入的IBM的数据包:ibm_db 简单使用如下,详细项目看另外一篇。 注意事项:1、就是一定记得要关闭连接。2、读取数据只能一行一行读取,需要result = ibm_db.fetch_both(stmt)代码在调下一行 #-*-coding-*- import ibm_db import time conn = ibm_db.connect("DATABASE=EDW;HOSTNAME=输入IP;PORT=端口;PROTOCOL=通信协议;UID=用户名;PWD=密码;", "", "") #print(conn) if conn: #写一条查询语句 sql = "Select A,B,C from CC.ABC" stmt = ibm_db.exec_immediate(conn,sql) result = ibm_db.fetch_both(stmt) for i in range(len(result)): print("第一个字段:",result[0]+'\n'+"第二个字段:",result[1]+'\n'+"第三个字段",result[2]) print('----------------') #停止0.五秒输出 time.sleep(0.5) result = ibm_db.fetch_both(stmt) #最后记得关闭数据库连接 ibm_db.close(conn)
不错的文章~~工作中很常用。 记录学习。 交流群127591054 原帖地址:http://www.3lian.com/edu/2013/11-29/111321.html 对表进行大量删除后,可能会有很多空闲空间可以回收,相关计算方法参考如下: 更新统计信息 Analyze table compute statistics ; 计算碎片空间 SELECT TABLE_NAME , (BLOCKS *8192 / 1024/1024 ) - (NUM_ROWS*AVG_ROW_LEN/1024/1024) "Data lower than HWM in MB" FROM DBA_TABLES WHERE UPPER(owner) =UPPER('&OWNER') order by 2 desc; ANALYZE TABLE big_emp1 ESTIMATE STATISTICS; SELECT table_name,num_rows,blocks,empty_blocks FROM user_tables WHERE table_name='BIG_EMP1'; SELECT COUNT (DISTINCT DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)|| DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)) "Used" FROM big_emp1; SELECT segment_name,segment_type,blocks FROM dba_segments WHERE segment_name='BIG_EMP1'; 对于索引 校验结构 analyze index validate structure; 检查 column name format a15 column blocks heading "ALLOCATED|BLOCKS" column lf_blks heading "LEAF|BLOCKS" column br_blks heading "BRANCH|BLOCKS" column Empty heading "UNUSED|BLOCKS" select name, blocks, lf_blks, br_blks, blocks-(lf_blks+br_blks) empty from index_stats; 或者 select name, btree_space, used_space, pct_used from index_stats; 回收空间方法 'Compatible' 必须 >=10.0 1. Enable row movement for the table. SQL> ALTER TABLE scott.emp ENABLE ROW MOVEMENT; 2. Shrink table but don't want to shrink HWM (High Water Mark). SQL> ALTER TABLE scott.emp SHRINK SPACE COMPACT; 3. Shrink table and HWM too. SQL> ALTER TABLE scott.emp SHRINK SPACE; 4. Shrink table and all dependent index too. SQL> ALTER TABLE scott.emp SHRINK SPACE CASCADE; 5. Shrink table under MView. SQL> ALTER TABLE SHRINK SPACE; 6. Shrink Index only. SQL> ALTER INDEX SHRINK SPACE; 验证 SQL> set serveroutput on SQL> declare 2 v_unformatted_blocks number; 3 v_unformatted_bytes number; 4 v_fs1_blocks number; 5 v_fs1_bytes number; 6 v_fs2_blocks number; 7 v_fs2_bytes number; 8 v_fs3_blocks number; 9 v_fs3_bytes number; 10 v_fs4_blocks number; 11 v_fs4_bytes number; 12 v_full_blocks number; 13 v_full_bytes number; 14 begin 15 dbms_space.space_usage ('SYSTEM', 'T_SHRINK', 'TABLE', v_unformatted_blocks, 16 v_unformatted_bytes, v_fs1_blocks, v_fs1_bytes, v_fs2_blocks, v_fs2_bytes, 17 v_fs3_blocks, v_fs3_bytes, v_fs4_blocks, v_fs4_bytes, v_full_blocks, v_full_bytes); 18 dbms_output.put_line('Unformatted Blocks = '||v_unformatted_blocks); 19 dbms_output.put_line('FS1 Blocks = '||v_fs1_blocks); 20 dbms_output.put_line('FS2 Blocks = '||v_fs2_blocks); 21 dbms_output.put_line('FS3 Blocks = '||v_fs3_blocks); 22 dbms_output.put_line('FS4 Blocks = '||v_fs4_blocks); 23 dbms_output.put_line('Full Blocks = '||v_full_blocks); 24 end; 25 / Unformatted Blocks = 0 FS1 Blocks = 0 FS2 Blocks = 0 FS3 Blocks = 0 FS4 Blocks = 2 Full Blocks = 1
此篇文章参考微信通信机制,收益匪浅!:http://lib.csdn.net/article/wechat/63831 QQ交流群127591054 当然也可以写发送消息的代码,机制和上述文章介绍的一样,大家可以参考学习! 偶遇:偶尔在论坛发现有外国友人在开源社区发布的Python微信删除好友查看,但是这个作者的代码我这边运行出现了点问题,就是各种问题,我在作者基础上进行研究修改!最终在Python2.7成功运行,之后又用了两天时间把运行环境转移到Python3.5。几乎完美执行!但是有一个问题我真的无能为力!在当我输出第三组好友名单的时候,就报错了! 报错如下:没办法我就去掉输出好友,就正常了,完整代码在下面,几乎每一句做了详细的注释! #UnicodeEncodeError: 'UCS-2' codec can't encode characters in position 138-138: Non-BMP character not supported in Tk 原理:简单点就是把好友分组拉入群组,不超过40,别人是看不到的,拉不进俩就代表你被删了!! 但是问题来了,我最近发现腾讯web端操作容易被受限制,我拉了一组或者两组就被限制,说操作频繁了!!所以大家可以拿来学习微信通讯机制!!,不可以用来做坏事哦!虽然可以得到这个用户所有的信息! 完整代码如下:祝大家学习进步!详细注释代码中有写。^~^,就不一句一句讲了。 1、运行代码,会跳出二维码,扫描在手机确认登陆,然后关闭图片,程序自动运行!! 2、按操作一步一步执行就可以了~~,具体实现看注释其实不难。 # coding=utf-8 #Python 3.5 #Author Jack Chiang import os import urllib import re import http.cookiejar import time import xml.dom.minidom import json import sys import math import matplotlib.pyplot as plt import matplotlib.cbook as cbook import matplotlib from matplotlib.font_manager import FontProperties DEBUG = True #确定当前测试是否查看服务器返回的Json数据 max_group = 35 # 每组人数 QRImagePath = os.getcwd() + '/qrcode.jpg' tip = 0 #全局变量:标识是否扫描二维码登陆 uuid = '' #全局变量:获取登陆值 base_uri = '' redirect_uri = '' skey = '' wxsid = '' wxuin = '' pass_ticket = '' deviceId = 'e000000000000000'#这个参数是一个15个字节的随机数,所以写死了 BaseRequest = {} ContactList = [] My = [] def getUUID(): global uuid url = 'https://login.weixin.qq.com/jslogin' params = { 'appid': 'wx782c26e4c19acffb', 'fun': 'new', 'lang': 'zh_CN', '_': int(time.time()), } #使用get方法,通过请求地址:https://login.weixin.qq.com/jslogin?appid=wx782c26e4c19acffb&fun=new&lang=zh_CN&_=时间戳 #其中,时间戳这个值是当前距离林威治标准时间的毫秒。 request = urllib.request.Request(url = url, data = urllib.parse.urlencode(params).encode(encoding='UTF-8')) response = urllib.request.urlopen(request) #成功则返回:window.QRLogin.code = 200; window.QRLogin.uuid = "UUID" data = response.read() #1970纪元后经过的浮点秒数time.time() #print (time.time()) #print(data) #只要有UUID就可以登陆微信网页版 # window.QRLogin.code = 200; window.QRLogin.uuid = "oZwt_bFfRg=="; regx = r'window.QRLogin.code = (\d+?); window.QRLogin.uuid = "(\S+?)"' #利用正则表达式匹配 pm = re.search(regx,str(data)) code = pm.group(1) #200 uuid = pm.group(2) #oZwt_bFfRg== if code == '200': return True return False #下载微信登陆图片然后打开 def showQRImage(): global tip #3、查询是否扫描二维码登录 #使用get方法,查询地址:https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid=XXXXXX&tip=1&_=时间戳 tip=1 url = 'https://login.weixin.qq.com/qrcode/%s?tip=%d&_=%d' % (uuid,tip,int(time.time())) """params = { 'tip': '1', '_': int(time.time()), }""" #这里的XXXXXX是我们刚才获取的uuid,时间戳同上。tip在第一次获取时应为1,这个数是每次查询要变的。 #拼接地址 request = urllib.request.Request(url = url) #等价request = urllib.request.Request(url = url, data = urllib.parse.urlencode(params)) response = urllib.request.urlopen(request) f = open(QRImagePath, 'wb') f.write(response.read()) f.close() #使用matplotlib显示图片 image_file = cbook.get_sample_data(QRImagePath) image = plt.imread(image_file) font = FontProperties(fname=r"D:/Develop//Python27//Lib//site-packages//matplotlib//mpl-data//fonts//ttf//Veral.ttc", size=20) s = u'~扫描二维码,然后关闭继续哦~' plt.imshow(image) plt.title(s,fontproperties=font) plt.axis('off') # clear x- and y-axes plt.show() plt.close() #判断当前执行是哪种环境,然后对呀的环境打开图片 """if sys.platform.find('darwin') >= 0: #MAC os.system('open %s' % QRImagePath) elif sys.platform.find('linux') >= 0: #Linux os.system('xdg-open %s' % QRImagePath) else: #win32 os.system('call %s' % QRImagePath)""" print('请使用微信扫描二维码以登录') def waitForLogin(): global tip, base_uri, redirect_uri url = 'https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?tip=%s&uuid=%s&_=%s' % (tip, uuid, int(time.time())) print(url) request = urllib.request.Request(url = url) response = urllib.request.urlopen(request) #如果不扫描会停在这个位置 data = response.read() #print(data) # window.code=500; regx = r'window.code=(\d+);' pm = re.search(regx, str(data)) code = pm.group(1) # window.code=408; if code == '201': #已扫描 print('扫描成功!,请在手机上点击确认以登录') tip = 0 elif code == '200': #已登录 #window.code=200; #下面链接为个人登陆的网页版,你可以把自己获取的链接复制到百度试一下,看看效果!直接跳到网页版自己的微信。 #window.redirect_uri="https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=A7YkJKTtu09JTsy7f6zy3w8e@qrticket_0 #&uuid=********&lang=zh_CN&scan=*********"; print('正在登录...') regx = r'window.redirect_uri="(\S+?)";' pm = re.search(regx, str(data)) redirect_uri = pm.group(1) + '&fun=new' base_uri = redirect_uri[:redirect_uri.rfind('/')] #print(redirect_uri) #print(base_uri) elif code == '408': #超时不做操作 pass return code def login(): global skey, wxsid, wxuin, pass_ticket, BaseRequest #访问登录地址在获取地址后面加&fun=new,获得uin、sid、pass_ticket、skey request = urllib.request.Request(url = redirect_uri) response = urllib.request.urlopen(request) data = response.read() # print(data) #根据data链接访问得到一下xml数据,进行解析 ''''' <error> <ret>0</ret> <message></message> <skey>xxx</skey> <wxsid>xxx</wxsid> <wxuin>xxx</wxuin> <pass_ticket>xxx</pass_ticket> <isgrayscale>1</isgrayscale> </error> ''' doc = xml.dom.minidom.parseString(data) root = doc.documentElement for node in root.childNodes: if node.nodeName == 'skey': skey = node.childNodes[0].data elif node.nodeName == 'wxsid': wxsid = node.childNodes[0].data elif node.nodeName == 'wxuin': wxuin = node.childNodes[0].data elif node.nodeName == 'pass_ticket': pass_ticket = node.childNodes[0].data # print('skey: %s, wxsid: %s, wxuin: %s, pass_ticket: %s' % (skey, wxsid, wxuin, pass_ticket)) if skey == '' or wxsid == '' or wxuin == '' or pass_ticket == '': return False #拼接成一个字典后面登陆会用到 BaseRequest = { 'Uin': int(wxuin), 'Sid': wxsid, 'Skey': skey, 'DeviceID': deviceId, } return True #微信初始化 def webwxinit(): #要使用POST方法,访问地址:https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=时间戳&lang=ch_ZN&pass_ticket=XXXXXX url = base_uri + '/webwxinit?pass_ticket=%s&skey=%s&r=%s' % (pass_ticket, skey, int(time.time())) #print(url) #当然这个url需要post方式访问,参数就是之前形成的字典值 #(BaseRequest)uin、sid、skey分别对应上面步骤4获取的字符串,DeviceID是e后面跟着一个15字节的随机数。 params = { 'BaseRequest': BaseRequest } request = urllib.request.Request(url = url, data = json.dumps(params).encode(encoding='UTF-8')) request.add_header('ContentType', 'application/json; charset=UTF-8') response = urllib.request.urlopen(request) data = response.read() #data = data.encode() global ContactList, My dic = json.loads(str(data,encoding='utf-8')) #读取服务器通过重重验证过来返回的数据,dic就是当前用户所有信息 ContactList = dic['ContactList'] My = dic['User'] #User就是你的个人信息 #print(os.getcwd() + '/webwxinit.json'); if DEBUG == True: f = open(os.getcwd() + '/webwxinit.json', 'wb') f.write(data) f.close() ErrMsg = dic['BaseResponse']['ErrMsg']#捕获服务器异常信息 if len(ErrMsg) > 0: print(ErrMsg) Ret = dic['BaseResponse']['Ret'] if Ret != 0: return False return True # print(data) Ret = dic['BaseResponse']['Ret'] if Ret != 0: return False return True #获取好友列表数据 def webwxgetcontact(): url = base_uri + '/webwxgetcontact?pass_ticket=%s&skey=%s&r=%s' % (pass_ticket, skey, int(time.time())) request = urllib.request.Request(url = url) request.add_header('ContentType', 'application/json; charset=UTF-8') response = urllib.request.urlopen(request) data = response.read() if DEBUG == True: f = open(os.getcwd() + '/webwxgetcontact.json', 'wb') f.write(data) f.close() # print(data) #data是这个用户所有好友数据 dic = json.loads(str(data,encoding='utf-8')) MemberList = dic['MemberList'] # 倒序遍历,不然删除的时候出问题.. SpecialUsers = ['newsapp', 'fmessage', 'filehelper', 'weibo', 'qqmail', 'fmessage', 'tmessage', 'qmessage', 'qqsync', 'floatbottle', 'lbsapp', 'shakeapp', 'medianote', 'qqfriend', 'readerapp', 'blogapp', 'facebookapp', 'masssendapp', 'meishiapp', 'feedsapp', 'voip', 'blogappweixin', 'weixin', 'brandsessionholder', 'weixinreminder', 'wxid_novlwrv3lqwv11', 'gh_22b87fa7cb3c', 'officialaccounts', 'notification_messages', 'wxid_novlwrv3lqwv11', 'gh_22b87fa7cb3c', 'wxitil', 'userexperience_alarm', 'notification_messages'] for i in range(len(MemberList) - 1, -1, -1): #range(x-1,-1,-1)是倒序便利 例如range(10,-1,-1) 10,...0 Member = MemberList[i] if Member['VerifyFlag'] & 8 != 0: # 公众号/服务号 24&8=8 其他都是0 MemberList.remove(Member) elif Member['UserName'] in SpecialUsers: # 特殊账号 MemberList.remove(Member) elif Member['UserName'].find('@@') != -1: # 群聊 MemberList.remove(Member) elif Member['UserName'] == My['UserName']: # 自己 MemberList.remove(Member) return MemberList #创建群组开始 def createChatroom(UserNames): MemberList = [] for UserName in UserNames: MemberList.append({'UserName': UserName}) url = base_uri + '/webwxcreatechatroom?pass_ticket=%s&r=%s' % (pass_ticket, int(time.time())) params = { 'BaseRequest': BaseRequest, 'MemberCount': len(MemberList), 'MemberList': MemberList, 'Topic': '', } request = urllib.request.Request(url = url, data = json.dumps(params).encode(encoding='UTF-8')) request.add_header('ContentType', 'application/json; charset=UTF-8') response = urllib.request.urlopen(request) data = response.read() if DEBUG == True: #测试数据 f = open(os.getcwd() + '/webwxChatroo.json', 'wb') f.write(data) f.close() # print(data) dic = json.loads(str(data,encoding='utf-8')) ChatRoomName = dic['ChatRoomName'] MemberList = dic['MemberList'] DeletedList = [] for Member in MemberList: if Member['MemberStatus'] == 4: #被对方删除了 DeletedList.append(Member['UserName']) ErrMsg = dic['BaseResponse']['ErrMsg'] if len(ErrMsg) > 0: print(ErrMsg) return (ChatRoomName, DeletedList) #删除群组成员,最后删除自己 def deleteMember(ChatRoomName, UserNames): url = base_uri + '/webwxupdatechatroom?fun=delmember&pass_ticket=%s' % (pass_ticket) params = { 'BaseRequest': BaseRequest, 'ChatRoomName': ChatRoomName, 'DelMemberList': ','.join(UserNames), } request = urllib.request.Request(url = url, data = json.dumps(params).encode(encoding='UTF8')) request.add_header('ContentType', 'application/json; charset=UTF-8') response = urllib.request.urlopen(request) data = response.read() # print(data) dic = json.loads(str(data,encoding='utf-8')) ErrMsg = dic['BaseResponse']['ErrMsg'] if len(ErrMsg) > 0: print(ErrMsg) Ret = dic['BaseResponse']['Ret'] if Ret != 0: return False return True def addMember(ChatRoomName, UserNames): url = base_uri + '/webwxupdatechatroom?fun=addmember&pass_ticket=%s' % (pass_ticket) params = { 'BaseRequest': BaseRequest, 'ChatRoomName': ChatRoomName, 'AddMemberList': ','.join(UserNames), } request = urllib.request.Request(url = url, data = json.dumps(params).encode(encoding='UTF-8')) request.add_header('ContentType', 'application/json; charset=UTF-8') response = urllib.request.urlopen(request) data = response.read() # print(data) dic = json.loads(str(data,encoding='utf-8')) MemberList = dic['MemberList'] DeletedList = [] for Member in MemberList: if Member['MemberStatus'] == 4: #被对方删除了 DeletedList.append(Member['UserName']) ErrMsg = dic['BaseResponse']['ErrMsg'] if len(ErrMsg) > 0: print(ErrMsg) return DeletedList def main(): #模拟登陆凭证 opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(http.cookiejar.CookieJar())) urllib.request.install_opener(opener) if getUUID() == False: print ('获取uuid失败') return showQRImage() #下载微信登陆图片然后登陆 time.sleep(1) while waitForLogin() != '200': pass #循环验证直到为200返回true成功扫描 os.remove(QRImagePath) if login() == False: print ('登录失败') return if webwxinit() == False: print ('初始化失败') return MemberList = webwxgetcontact() MemberCount = len(MemberList) print ('通讯录共%s位好友' % MemberCount) ChatRoomName = '' result = [] #开始分组 好友总数/要分组人数 for i in range(0, int(math.ceil(MemberCount / float(max_group)))): UserNames = [] NickNames = [] DeletedList = '' for j in range(0, max_group): if i * max_group + j >= MemberCount: #判断 第N组人数是否超过总人数 break Member = MemberList[i * max_group + j] UserNames.append(Member['UserName']) #Username是一丢字母,不断变化的 NickNames.append(Member['NickName'].encode('utf-8')) #NickName是好友昵称 print('第%s组...' % (i + 1)) for k in range(0,NickNames.__len__()): NickNames[k] = str(NickNames[k],'utf-8') #str1 = ", " #str1 = str1.join(NickNames) #print(str1) #但是下面输出好友会出现问题,在出现第三组的时候就报下面错,不知道如何解决!!,去掉输出完美运行! #UnicodeEncodeError: 'UCS-2' codec can't encode characters in position 138-138: Non-BMP character not supported in Tk #print(', '.join(NickNames)) #会出现css标签,我想了想那是表情啊~~~哈哈 print('按回车键继续。。。') input() # 新建群组/添加成员 if ChatRoomName == '': (ChatRoomName, DeletedList) = createChatroom(UserNames) else: DeletedList = addMember(ChatRoomName, UserNames) DeletedCount = len(DeletedList) if DeletedCount > 0: result += DeletedList print('找到%s个被删好友' % DeletedCount) #input() # 删除成员 deleteMember(ChatRoomName, UserNames) # todo 删除群组 resultNames = [] for Member in MemberList: if Member['UserName'] in result: NickName = Member['NickName'] if Member['RemarkName'] != '': NickName += '(%s)' % Member['RemarkName'] resultNames.append(NickName.encode('utf-8')) for k in range(0,resultNames.__len__()): resultNames[k] = str(resultNames[k],'utf-8') print ('---------- 被删除的好友列表 ----------') print ('\n'.join(resultNames)) print ('-----------------------------------') if __name__ == '__main__' : print ('开始查询微信删除你的好友信息...') input('回车键继续...') main() input('回车键结束') 4、测试结果如下:我最近容易受限制!!
作者QQ595696297 QQ 交流群127591054 由于作者在这里用到,显示的一直是乱码也尝试的各种配置文件修改,还是不行。于是采用动态方法解决! 1、首先找到你要修改的字体,右键复制到matplotlib的目录下,作者的在这里:D:\Develop\Python27\Lib\site-packages\matplotlib\mpl-data\fonts\ttf 2、然后做完这步就是代码 import matplotlib.pyplot as plt import matplotlib.cbook as cbook from matplotlib.font_manager import FontProperties #使用matplotlib显示图片 image_file = cbook.get_sample_data(QRImagePath) image = plt.imread(image_file) font = FontProperties(fname=r"D:/Develop//Python27//Lib//site-packages//matplotlib//mpl-data//fonts//ttf//Veral.ttc", size=20) s = u'~扫描二维码,然后关闭继续哦~' plt.imshow(image) plt.title(s,fontproperties=font) plt.axis('off') # clear x- and y-axes plt.show() plt.close() 3、路径需要注意一下,转义,Veral.ttc就是你复制过来的字体。
学习交流群127591054. 为了用DB-API编写MySQL脚本,必须确保已经安装了MySQL。复制以下代码,并执行: -# -- coding: UTF-8 -- import MySQLdb 如果执行后的输出结果如下所示,意味着你没有安装 MySQLdb 模块: Traceback (most recent call last): File “test.py”, line 3, in import MySQLdb ImportError: No module named MySQLdb 安装有问题:看这里,正常安装在CMD打开后输入下面语句安装: pip install mysql-python 1.如果报类似 Microsoft Visual C++ 9.0 is required XXX的错误。这一这样解决 32位: MySQL-python-1.2.3.win32-py2.7.exe (1,023.1 KiB) 64位: MySQL-python-1.2.3.win-amd64-py2.7.exe 2.如果还有这个错误 : fatal error C1083: Cannot open include file: ‘config-win.h’: No such file or directory 需要安装 mysql-connector-c-6.0.2 版本自己选:https://dev.mysql.com/downloads/connector/c/6.0.html#downloads 安装后,可以再试试,就OK啦~ pip install mysql-python
此笔记是作者本人去年开始从一个DBA新人的学习笔记,积累至今,希望拿出来给那些对DBA有兴趣的童孩学习,大家一起努力嘛。 此笔记记录了作者工作学习中从零基础的学习的记录,和从中遇见的问题与问题的解决!很高兴大家来云栖博客大家庭交流学习! 感谢支持,鞠躬!!转载请注明作者哦!!谢谢。此文章不断更新!!谢谢大家支持!!附件上传了,文档的pdf版本有目录也方便看。