构建自己的服务器有什么好处呢?
构建自己的服务器有什么好处呢?笔者总结了几点:
1.如果公司不通外网,同样能解决即时通讯的问题。
2.服务器设置到公司内部,不受外界影响(即可以避免这次的断网所带来影响)。
3.服务器设置可以便于备份数据,也就是一切交流的数据都可以保留到服务器里方便随时提出来使用(同样也对员工起到监督的作用,因为所有的聊天记录管理员都是可以调出来的)。
即时通讯 www.freeeim.com
感受科技之美
构建自己的服务器有什么好处呢?笔者总结了几点:
1.如果公司不通外网,同样能解决即时通讯的问题。
2.服务器设置到公司内部,不受外界影响(即可以避免这次的断网所带来影响)。
3.服务器设置可以便于备份数据,也就是一切交流的数据都可以保留到服务器里方便随时提出来使用(同样也对员工起到监督的作用,因为所有的聊天记录管理员都是可以调出来的)。
即时通讯 www.freeeim.com
前段时间,我在实现gradle多模块构建遇到一个问题,以前我们基本上是以jar包形式让开发者集成到工程中使用,但自从Android Studio中有了多module的概念,而我们的SDK也是分了多个模块进行构建的,但我们这里有个问题就是模块之间是相互关联的,不能针对每个模块单独打包,而每个module都会生成对应的aar,但并不会把依赖的module代码打进去,别问我为什么知道,你将aar后缀改为zip,然后反编译classes.jar就可以看到。所以我们这边就有了合并aar这样的一个需求,下面就告诉大家怎么来实现。
android-fat-aar
当时我遇到这个问题,就去github搜了一下,已经有人将合并aar的脚本开源出来了,开源地址如下:
https://github.com/adwiv/android-fat-aar
什么是aar?
什么是aar?它跟jar包有什么区别?它该怎么样使用?相信大家一定会有这些疑问。首先aar是针对Android Library而言的,你可以理解为IDE针对Android Library的打包,一个aar包含什么东西?
它的文件后缀名是.aar,它本身是一个zip文件,强制包含以下文件:
/AndroidManifest.xml
/classes.jar
/res/
/R.txt
另外,AAR文件可以包括以下可选条目中的一个或多个:
/assets/
/libs/name.jar
/jni/abi_name/name.so (where abi_name is one of the Android supported ABIs)
/proguard.txt
/lint.jar
具体看到这里看如何创建一个Android Library:
https://developer.android.com/studio/projects/android-library.html#aar-contents
jar包跟aar包有什么区别?
jar:只包含了class文件与清单文件,不包含资源文件,如图片等所有res中的文件。
aar:包含所有资源,class以及res资源文件全部包含。
如果你只是简单实用一些类库,你可以直接使用*.jar文件,而如果你想既想使用类库,又想实用资源,那么你就可以创建一个Android Library,使用它生成的*.aar文件。
jar文件的使用方式我们应该比较熟悉了,将它复制到工程的libs目录下,然后在gradle中添加以下脚本:
dependencies {
compile fileTree(include: [‘*.jar’], dir:’libs’)
}
aar文件使用同样需要复制到libs目录下,并按照以下方式集成:
repositories {
flatDir {
dirs’libs’
}
}
dependencies {
compile(name:’your aar’, ext:’aar’)
}
多模块构建合并aar
这个是本文的重点,我们可以再每个module下的build/outputs/aar下找到编译生成的*.aar文件。
步骤1:
将gradle文件’fat-aar.gradle’到你的项目目录,然后apply:
apply from: ‘fat-aar.gradle’
步骤2:定义嵌入的依赖关系
你需要修改你以前依赖项,并将compile更改为embedded,作为你想要合并的aar。使用例子如下:
通过以上的方式你可以将多个module生成的aar合成一个,大家可以新建一个demo工程来测试下
天我们在互联网上的所有应用,都是部署在服务器上,就连如今应用领域火热的容器技术及Serverless应用,底层都离不开服务器,无非是选择物理服务器还是云服务器的差别而已。
那么我们拥有一台云服务器可以做什么呢?
如果技术过关,我们可以做如今互联网上所有应用的贫民版,至于有多贫,那得看技术水平及服务器能支持的贫困等级,但很多复刻对我们来说除了娱乐之外,毫无意义,今天就简单分享几个有意义的玩法:
1、搭建个人博客
也许有人说,这都什么年代了,还搭建个人博客,微博、微信以及各种自媒体,还不够你分享吗,有啥意义呢?
我告诉你意义大的去了,无论你是网络写手还是技术爱好者,拥有个人博客,你可以自由的发挥自己的才能,同时通过公域流量的方式将自己的内容分享出去,作为自身业务知识积累,并作为自媒体的引流平台,很多搞开发或运维的站长,多年来一直维护自己的网站,当有任何一个新媒体崛起时,都可以借助在自己博客的内容积累快速积累起先发优势。
2、搭建CPS推广网站
什么是CPS推广呢?我们一句话概括:参考实际的销售量进行收费,*常见的就是淘宝客,你帮助淘宝卖家推广,淘宝卖家给你分享佣金,这个特别适合大学生及宝妈,可以将自己的空闲时间转化为金钱。
当然,CPS推广网站也需要自己去搭建,如果不懂搭建的同学,可以参考刚才个人博客的搭建方法,找对wordpress主题,装修一个漂亮的淘宝客网站,没一定问题。
有人可能会问,货源怎么来?
使用自己的淘宝账号登录淘宝联盟,你会看到大量的可推广商品,这些就是你推广网站的货源。
3、游戏私服
对于游戏爱好者来说,如果服务器配置还不错,例如2核4G以上的服务器,可以轻松的搭建一个游戏私服,满足10个、8个人玩是没问题的,特别适合于大学宿舍一块玩游戏,同时如果对游戏搭建有兴趣,也可以借此好好的学习一下游戏搭建及简单运营。
4、个人网盘
我们平时使用的网盘常用的如百度网盘,但大家都知道,自从Pandownload被封以后,百度网盘的下载速度更慢了,对于经常有大文件需要下载的用户来说,除了购买会员,别无选择。
当你有台服务器时,你就多了一个选择,那就是可以自己搭建网盘。
5、搭建私有云笔记
云服务器能做的还有很多,今天就先分享到这里,如果你暂时还么有服务器,那么腾讯云*近的活动服务器值得推荐,腾讯云*近推出的年中特惠活动,1核2G1M低至99元/年,4核8G5M带宽低至1099元/年,活动链接可参考:
精选秒杀 – 腾讯云1核2G1M低至99元/年cloud.tencent.com
入门常见问题:
问题1:是否需要考ACA?
答:个人建议是还是要考一下,因为考试前需要熟悉下ACP的出题思路,ACA是采取线上考试的方式,600元的考试费还赠送课程其实很划算,也算是一个模拟训练。此外,通过ACA考试后有证书,对自己继续考ACP也是个鼓励。
问题2:ACA和ACP的区别?
答:个人参与下来ACA更偏向于理论一些,而ACP除了理论外应用场景的考题明显比ACA要多,原理方面的考题,难度上ACA和ACP是差不多的。
考试复习注意事项
云计算ACP考试的内容,ECS、RDS、SLB、OSS、CDN、VPC、弹性伸缩、基础知识。
基础知识:
云计算ACP的基础知识部分大部分考题集中在网络方面,并不难,常见的端口要了解,比如TCP/IP、HTTP、HTTPS、FTP、UDP等的常用端口,考题数量并不少并且查阅一下就可以拿分的。
ECS(云服务器):
ECS是云计算ACP考试中的重中之重,网上看到有文章说每个部分的分数比例是多少,其实关心这个没有任何意义,因为云计算是一个整体,考题也一样,属于你中有我我中有你的关系。ECS当然确实考题比例是*多的,但是不是难点,在复习时需要仔细阅读文档,理解之外需要记住一些数值。这里简单的列举一些考试会考到的内容,安全组是什么?安全规则又是什么?安全组和安全规则之间的关系?*大多少个安全组?每个安全组*多配置多少条安全规则?这几个问题搞明白了基本安全组和安全规则的分数能够拿下。ECS作为云服务器配置当然也是考试的重点,这一部分内容需要查阅考试当时的文档资料,比如目前的ECS实例*大多少核?云盘有几种?ECS实例根据应用场景分为几类?因为网上有个600题的文件被广为流传,但是500题的时间比较久了,所以ECS和云盘的情况已经发生了很大的变化,不能照搬600题的答案。特别特别注意地域(REGION)和可用区(ZONE)的区分,仔细阅读文档,哪些情况可以跨不同可用区,哪些可以跨地域,这类考题贯穿整个ACP考试的各个模块并且比较容易搞错。
RDS(云数据库):
个人感觉RDS的考题是*少的,在RDS上注意一下应用场景就可以拿到大部分分数,重点在于区分和OSS在应用上的不同。
SLB(负载均衡):
负载均衡是另一个集中考点,*重要的和ECS一样,区分地域(REGION)和可用区(ZONE)的区别。混挂和混访的概念要搞明白,两种常用的负载均衡的区别如四层负载均衡(LVS)和七层负载均衡(TENGINE)以及他们转发的协议的不同。健康检查的注意事项,对于ECS的健康检查是怎么完成的等等。
OSS(云存储):
共享存储因为概念比较简单,所以反而容易被忽略。在应用场景得考题中着重考查和RDS的区分,这些考题比较容易的,相对来说难点在于上行流量和下行流量的计费上,也就是ECS和OSS的传输过程对于流量的计费方式的不同,不同的本质其实还是因为地域和可用区的原因。OSS内部BUCKET和PROJECT的数量和隶属关系也是常考的重点。
CDN(内容分发网络):
内容分发网络是一个难点,应用场景考题同样很容易。但是原理很难,主要注意阿里云全世界有多少个地域可以作为内容分发节点,这个很重要。
VPC(专有网络):
VPC主要区分,公有云、私有云和混合云的不同。公有云和私有云区分非常简单,所以常见的考题集中在混合云上,比如什么时候需要采用专线,什么时候用*,本地IDC和云之间怎么通信等。
弹性伸缩:
除了ECS外,弹性伸缩的考题*多,但是其实很容易拿分。弹性伸缩概念很容易掌握,主要注意的点和ECS一样需要仔细阅读文档,了解弹性伸缩的配置要点,比如自动配置情况下的问题,手动配置情况下的问题。举例就是配置不同的ECS能否配置弹性伸缩?只要掌握两个核心,手动和自动,了解明白它们之间的区别,那这部分内容得分是比较容易的。
————————————————
版权声明:本文为CSDN博主「星速云」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wx_15323880413/article/details/109077144
语音触发器
Hey Siri
“Hey Siri”功能允许用户启动Siri。一个很小的语音识别器一直在运行并监听这两个单词。当它检测到“Hey Siri”时,Siri将余下的语音作为命令或查询进行解析。“Hey Siri”探测器使用深度神经网络(DNN)将每个时刻的声音的声学模式转换为语音声音的概率分布。然后,它计算你所说的短语是“Hey Siri”的可能性分数。如果得分足够高,Siri会被唤醒。
图1. iPhone上的Hey Siri流程
如图1所示,整个系统有几个部分。Siri的大部分实现都是“在云端”,包括主要的自动语音识别,自然语言解释和各种信息服务。还有一些服务器可以提供检测器使用的声学模型的更新。我们主要关注探测器:一个专门的语音识别器,它只关注“Hey Siri”。
监听“Hey Siri”
iPhone中的麦克风以每秒16000的速度将您的声音转换为瞬时波形样本流。频谱分析阶段将波形采样流转换成一系列帧,每帧描述约0.01秒的声谱。将这些帧中的大约20个(音频为0.2秒)送到深度神经网络(DNN),其将这些声学模式中的每一个转换成一组语音类别的概率分布:用于“Hey Siri”的短语,再加上沉默和其他的讲话,总共约20个音类。如图2。
我们选择DNN的每个隐藏层中的单元数量,以适应“Hey Siri”检测器运行时可用的计算资源。我们使用的网络通常具有五个隐藏层,所有这些层都是相同的大小:32,128或192个单元,具体取决于内存和功率的限制。在iPhone上,我们使用两个网络,一个用于初始检测,另一个用作辅助检查器。初始检测器使用的次数少于辅助检查器。
假设我们使用的是*小的DNN,则可以通过查看表示不同阶段声学信号的图3来更好地了解探测器的工作原理。*底部是麦克风波形的光谱图。在这种情况下,有人在说“Hey Siri What…”更明亮的部分是这个短语中*响亮的部分。Hey Siri模式是在垂直的蓝线之间。
从底部向上的第二个水平条显示了用梅尔滤波器组分析相同波形的结果,其基于感知测量给出频率的权重。由于声道的精细结构,这种转换使光谱图中可见的细节变得平滑:或者是随机的,如在/s/中,或者是周期性的,在这里被看作垂直条纹。
标记为H1至H5的交替的绿色和蓝色水平条显示了五个隐藏层中的每一个单元的数值(激活)。已经为这个数字安排了每层的32个隐藏单元,以便将具有相似输出的单元放在一起。
下一条(有黄色斜线)显示声学模型的输出。在每一帧中,短语中的每个位置都有一个输出,另外还有一些输出用于静音和其他语音。
双通道检测
“Hey Siri”探测器不仅要准确,而且需要快速,对电池寿命没有显着影响。我们还需要*大限度地减少内存使用和处理器需求,特别是处理器需求峰值。
为了避免整天运行主处理器来监听触发短语,iPhone的Always On Processor(AOP)(一个小型,低功耗的辅助处理器,即嵌入式运动协处理器)可以访问麦克风信号(6S及更新机型)。我们使用AOP有限处理能力的一小部分来运行具有小型声学模型(DNN)的探测器。当分数超过阈值时,运动协处理器唤醒主处理器,主处理器使用更大的DNN来分析信号。在支持AOP的*个版本中,*个探测器使用了一个有5层32隐藏单元的DNN,第二个探测器有5层192个隐藏单元。
人脸触发器
概述
Hey Siri是一种基于语音识别的触发器,通过识别固定的关键字“Hey Siri”来触发Siri。基于人类固有的对话方式,提供另一种Siri触发器(Face Siri)。Face Siri通过判定使用者注视iPhone,进而触发Siri。
人类对话
假设场景,张三与李四对话,有以下两种方式:
1、 如图5所示,张三呼叫李四名字,并与李四建立一次对话。
步骤1:张三说:“李四”。
步骤2:李四听到后回答:“在”。
步骤3:张三问:“吃了吗”?
步骤4:李四回答:“吃过了”。
Hey Siri触发器类似于此种模式。iPhone监听到Hey Siri, 启动Siri并完成后续服务。
2、 如图6所示,张三和李四看向对方,并建立一次对话。
步骤1:互相看向对方。
步骤2:张三问:“吃了吗”?
步骤3:李四回答:“吃过了”。
基于此种人类已有的对话模式,提供一种新的触发Siri的模式,并不需要喊出那个固定的关键字“Hey Siri”。
Face Siri
如图7所示,使用者通过注视iPhone来启动Siri。
步骤1:使用者注视iPhone。使用者面部正对iPhone,并保持张开眼睛看向iPhone。
步骤2:判断是否注视iPhone。通过DNN判断摄像头获取图片的人脸占比是否超过阈值,眼睛是否张开。
步骤3:判断超时之前是否接收到语音。若有效时间内监测到有效语音输入,则触发Siri并等待语音输入完成。
步骤4:解析语音。Siri将语音输入解析为命令或者查询并提供服务。
小型机是指运行原理类似于PC(个人电脑)和服务器,但性能及用途又与它们截然不同的一种高性能计算机,它是70年代由DCE(数字设备公司)公司首先开发的一种高性能计算产品。
小型机具有区别PC及其服务器的特有体系结构,还有各制造厂自己的专利技术,有的还采用小型机专用处理器,比如美国Sun、日本Fujitsu(富士通)等公司的小型机是基于SPARC处理器架构,而美国HP公司的则是基于PA-RISC架构;Compaq公司是Alpha架构。另外I/O总线也不相同,Fujitsu是PCI,Sun是SBUS,等等。这就意味着各公司小型机机器上的插卡,如网卡、显示卡、SCSI卡等可能也是专用的。此外,小型机使用的操作系统一般是基于Unix的,像Sun、Fujitsu是用Sun Solaris,HP是用HP-Unix,IBM是AIX。所以小型机是封闭专用的计算机系统。使用小型机的用户一般是看中Unix操作系统的安全性、可靠性和专用服务器的高速运算能力。
现在生产小型机的厂商主要有HP、IBM、SUN、浪潮、曙光等.它们的主要特色在于年宕机时间只有几小时,所以又统称为z系列(zero 零)。AS/400主要应用在银行和制造业,还有用于Domino,主要的技术在于TIMI(技术独立机器界面),单级存储,有了TIMI技术可以做到硬件与软件相互独立。RS/6000比较常见,用于科学计算和事务处理等。
----------------------------------------------
*大的区别就是可用性,服务器重要部件坏了就中止服务了,小型机要冗余或者集群,即使一些部件坏了,马上就会有冗余部件接管,不会宕机。
云服务器有什么作用?
1.Web服务
对于有网站空间需求的 中小企业和个人建站来说,租用云服务器是个不错的选择。云服务器即买即用,拥有多种带宽选择,还可使用独立的IP,省钱而又享有独立主机的各种资源,满足中小企业网站发展需求。
2.Email邮件服务器
云服务器拥有高性能的数据处理能力,不仅能够储存数据,而且还能够快速的处理数据,所以云服务器用来作为Email邮件服务器使用也是一个不错的选择 。
3.小程序后端
在小程序的生产环境中,如果需要调用服务器的 REST API 或 Web Socket,服务器必须提供安全的链接地址。也就是说,服务器需要使用SSL加密数据。因此,我们需要在服务器中配置 SSL 加密。
4.APP后端
搞软件开发的人都知道,对于一些网络应用软件必须要租用服务器存放才能被更多用户使用。如一些应用于浏览软件、传输软件、远程登录软件等。如果是像以往那样租用物理机服务器,成本费用非常高昂。但是现在有云服务器的选择可以节约了不少成本。
云服务器其实和虚拟主机的作用差不多,但采用集群式的方式,让使用更加的安全。相比来说,使用起来也方便很多,而且灵活很多,但本质还是一样的。运算能力超强,用户通过电脑等方式接入数据中心,按自己的需求进行运算。提供了便捷的、高效的网络访问。搭配其他云计算资源即可轻松搭建IT架构,满足不同量级需求。
云服务器的特点:
1.稳定性和安全性高。云服务器采用分布式存储,支持云镜像,同时存储4份数据,确保数据安全性。
2.灵活性好。云服务器升级灵活,配置可以随意调节。
3.可靠性高。支持热迁移,支持快速故障迁移。
4. 自助服务性。支持在线重置服务器密码,支持多服务器内网连接,支持用户自主安装系统。
5. 支持负载均衡解决方案。
使用云服务器作用与好处:
1、多地域性覆盖
丰富的地域选择为业务保驾护航:华北、华东、华南三大地域全面覆盖国内业务需求,境外香港、北美、新加坡等地域满足业务出海需求。
2、稳定可靠
基于成熟的kvm虚拟化技术;提供99.95%服务可用性;提供配置更高、性能更强的二代 系列 , 以 及 标 准 型 、 高IO型、内存型、计算型等不同机型满足不同需求
3、高质量网络
BGP网络支持国内所有主流运营商接入,覆盖全国的*速公网体验;公网入口故障时跨域秒级调度
4、成本低廉
提供两种计费方式,满足不同应用场景-包年包月:平均单价较低,适合较长时间需要计算资源的用户;按量计费:适合秒杀大促等突发资源需求,阶梯收费、使时间越长单价越低
从广义上讲,服务器是指网络中能对其它机器提供某些服务的计算机系统(如果一个PC对外提供ftp服务,也可以叫服务器)。
从狭义上讲,服务器是专指某些高性能计算机,能通过网络,对外提供服务。相对于普通PC来说,稳定性、安全性、性能等方面都要求更高,因此在CPU、芯片组、内存、磁盘系统、网络等硬件和普通PC有所不同。
服务器作为网络的节点,存储、处理网络上80%的数据、信息,因此也被称为网络的灵魂。做一个形象的比喻:服务器就像是邮局的交换机,而微机、笔记本、 PDA、手机等固定或移动的网络终端,就如散落在家庭、各种办公场所、公共场所等处的电话机。我们与外界日常的生活、工作中的电话交流、沟通,必须经过交换机,才能到达目标电话;同样如此,网络终端设备如家庭、企业中的微机上网,获取资讯,与外界沟通、娱乐等,也必须经过服务器,因此也可以说是服务器在 “组织”和“领导”这些设备。
它是网络上一种为客户端计算机提供各种服务的高性能的计算机,它在网络操作系统的控制下,将与其相连的硬盘、磁带、打印机、Modem及各种专用通讯设备提供给网络上的客户站点共享,也能为网络用户提供集中计算、信息发表及数据管理等服务。它的高性能主要体现在高速度的运算能力、长时间的可靠运行、强大的外部数据吞吐能力等方面。
服务器的构成与微机基本相似,有处理器、硬盘、内存、系统总线等,它们是针对具体的网络应用特别制定的,因而服务器与微机在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面存在差异很大。尤其是随着信息技术的进步,网络的作用越来越明显,对自己信息系统的数据处理能力、安全性等的要求也越来越高,如果您在进行电子商务的过程中被黑客窃走密码、损失关键商业数据;如果您在自动取款机上不能正常的存取,您应该考虑在这些设备系统的幕后指挥者 ————服务器,而不是埋怨工作人员的素质和其他客观条件的限制。
目前,按照体系架构来区分,服务器主要分为两类:
非x86服务器:包括大型机、小型机和UNIX服务器,它们是使用RISC(精简指令集)或EPIC处理器,并且主要采用UNIX和其它专用操作系统的服务器,精简指令集处理器主要有IBM公司的POWER和PowerPC处理器,SUN与富士通公司合作研发的SPARC处理器、EPIC处理器主要是HP 与Intel合作研发的安腾处理器等。这种服务器价格昂贵,体系封闭,但是稳定性好,性能强,主要用在金融、电信等大型企业的核心系统中。
x86服务器:又称CISC(复杂指令集)架构服务器,即通常所讲的PC服务器,它是基于PC机体系结构,使用Intel或其它兼容x86指令集的处理器芯片和Windows操作系统的服务器,如IBM的System x系列服务器、HP的Proliant 系列服务器等。 价格便宜、兼容性好、稳定性差、不安全,主要用在中小企业和非关键业务中。
从当前的网络发展状况看,以“小、巧、稳”为特点的x86架构的PC服务器得到了更为广泛的应用。
从理论定义来看,服务器是网络环境中的高性能计算机,它侦听网络上其它计算机(客户机)提交的服务请求,并提供相应的服务。为此,服务器必须具有承担服务并且保障服务质量的能力。
但是这样来解释仍然显得较为深奥模糊,其实服务器与个人电脑的功能相类似,均是帮助人类处理信息的工具,只是二者的定位不同,个人电脑(简称为 Personal Computer,PC)是为满足个人的多功能需要而设计的,而服务器是为满足众多用户同时在其上处理数据而设计的。而多人如何同时使用同一台服务器呢? 这只能通过网络互联,来帮助达到这一共同使用的目的。
我们再来看服务器的功能,服务器可以用来搭建网页服务(我们平常上网所看到的网页页面的数据就是存储在服务器上供人访问的)、邮件服务(我们发的所有电子邮件都需要经过服务器的处理、发送与接收)、文件共享&打印共享服务、数据库服务等。而这所有的应用都有一个共同的特点,他们面向的都不是一个人,而是众多的人,同时处理的是众多的数据。所以服务器与网络是密不可分的。可以说离开了网络,就没有服务器;服务器是为提供服务而生,只有在网络环境下它才有存在的价值。而个人电脑完全可以在单机的情况下完成主人的数据处理任务。
python办公笔记分享
python 处理办公软件
一、文件处理
1、输出目录下所有文件及文件夹
获取当前python程序运行目录
import os
print(os.getpwd())
路径连接
import os
print(os.path.join(‘pythonTest’, ‘test1’))
列出某个文件夹下所有文件和文件夹
import os
print(os.listdir(‘D:/mycode/’))
循环判断指定文件夹中哪些是文件夹
import os
files = os.listdir()
for file in files:
print(file, os.path.isdir(file))
os.scandir() 查找文件**(更推荐)**
import os
for file in os.scandir(‘D:/mycode/’):
print(file.name, file.path, file.is_dir())
练习: 列出当前目录包含hello字符串的文件的个数(不区分大小写)
import os
num = 0
for file in os.scandir(‘./’):
if not file.is_dir():
if ‘hello’ in file.name.lower():
num += 1
print(“包含hello的文件个数:”, num)
2、遍历、搜索文件及查询文件信息
遍历文件夹
import os
for root, dirs, files in os.walk(‘./’):
print(f’发现文件夹:{root})’)
print(f’文件夹列表:{dirs}’)
print(f’文件列表:{files}’)
print(‘————————–‘)
是否某字符串开头、结尾
print(‘abc.txt’.startswith(‘ab’))
print(‘abc.txt’.endswith(‘.txt’))
搜索指定的文件
模式 意义
* 匹配所有
? 匹配任何单个字符
[seq] 匹配seq中的任何字符
[!seq] 匹配任何不在seq中的字符
import glob
print(glob.glob(‘*.txt’))
递归搜索指定文件
import glob
print(glob.glob(‘**/*.txt’, recursive=True))
匹配文件名
import fnmatch
print(fnmatch.fnmatch(‘lesson1.py’, ‘le*1.py’))
print(fnmatch.fnmatch(‘lesson1.py’, ‘le*[0-9].py’))
查询文件信息
import os
import time
for file in os.scandir():
print(file.name, file.stat().st_size/1024/1024, time.ctime(file.stat().st_mtime))
datetime模块输出时间
import datetime
that_time = datetime.datetime.fromtimestamp(1567764428)
print(that_time)
print(that_time.year, that_time.month, that_time.day, that_time.hour, that_time.minute, that_time.second)
练习: 递归搜索当前文件夹中今年修改的后缀名为 .zip 的所有文件
import os
import glob
import datetime
now_year = datetime.datetime.now().year
print(‘当前目录以下文件为今年的.zip压缩文件:’)
for file in glob.glob(‘**/*.zip’, recursive=True):
file_year = datetime.datetime.fromtimestamp(os.stat(file).st_mtime).year
if file_year == now_year:
print(file, f’文件大小为:{os.stat(file).st_size/1024}KB’)
3、创建临时文件及文件夹
读取文件
f = open(‘test.txt’, ‘r’, encoding=’utf-8′)
text = f.readlines()
print(text)
f.close()
with … as … 写法:
with open(‘test.txt’, ‘r’, encoding=’utf-8′) as f:
text = f.readlines()
print(text)
写入文件
with open(‘test2.txt’, ‘w’, encoding=’utf-8′) as f:
f.write(‘hello world’)
创建临时文件
from tempfile import TemporaryFile
f = TemporaryFile(‘w+’)
f.write(‘hello world’)
f.seek(0)
data = f.readlines()
print(data)
f.close()
创建临时文件夹
from tempfile import TemporaryDirectory
with TemporaryDirectory() as tmp_folder:
print(f’临时文件夹:{tmp_folder}’)
4、批量创建、复制、移动、删除、重命名文件及文件夹
创建文件夹
import os
if not os.path.exists(‘dirname’):
os.mkdir(‘dirname’)
创建多层文件夹
import os
os.makedirs(‘aa/bb/cc’)
复制文件
import shutil
shutil.copy(‘test.txt’, ‘./aa/test.txt’)
shutil.copy(‘test.txt’, ‘./aa/new_test.txt’)
复制文件夹 (新文件夹不能已经存在)
import shutil
shutil.copytree(‘aa/’, ‘dd/’)
移动文件或者文件夹
import shutil
shutil.move(‘test.txt’, ‘bb/’)
shutil.move(‘test.txt’, ‘bb/new_test.txt’)
shutil.move(‘aa/’, ‘bb/’)
重命名文件或文件夹
import os
os.rename(‘test.txt’, ‘new_test.txt’)
os.rename(‘aa/’, ‘new_aa/’)
删除文件
import os
os.remove(‘test.txt’)
删除文件夹
import shutil
shutil.rmtree(‘aa/’)
练习: 找出当前文件夹中所有.zip文件,并加上该文件*后修改日期重命名,然后将所有重命名后的文件移动到backup文件夹中。
import os
import datetime
import shutil
if not os.path.exists(‘backup’):
os.mkdir(‘backup’)
for file in os.scandir():
if file.name.endswith(‘.zip’):
m_format_time = datetime.datetime.fromtimestamp(os.stat(file.name).st_mtime).strftime(‘%Y-%m-%d’)
shutil.move(file.name, ‘backup/’ + m_format_time + ‘-‘ + file.name)
5、创建和解压压缩包
读取压缩包
import zipfile
with zipfile.ZipFile(‘test.zip’, ‘r’) as zipobj:
for file_name in zipobj.namelist():
print(file_name)
读取压缩包内文件的信息
import zipfile
with zipfile.ZipFile(‘test.zip’, ‘r’) as zipobj:
for file_name in zipobj.namelist():
info = zipobj.getinfo(file_name)
print(file_name, info.file_size, info.compress_size)
解压压缩包中的单个文件
import zipfile
with zipfile.ZipFile(‘test.zip’, ‘r’) as zipobj:
zipobj.extract(‘test.txt’)
解压所有文件
import zipfile
with zipfile.ZipFile(‘test.zip’, ‘r’) as zipobj:
zipobj.extractall()
将有密码的压缩包解压
import zipfile
with zipfile.ZipFile(‘test.zip’, ‘r’) as zipobj:
zipobj.extractall(path=’解压/’, pwd=b’123456′)
创建压缩包
import zipfile
file_list = [‘test1.txt’, ‘test2.txt’, ‘test3.txt’]
with zipfile.ZipFile(‘compress.zip’, ‘w’) as zipobj:
for file in file_list:
zipobj.write(file)
向已有压缩包中添加文件
import zipfile
with zipfile.ZipFile(‘compress.zip’, ‘a’) as zipobj:
zipobj.write(‘test4.txt’)
练习: 将当前文件夹所有修改时间在今天之前的文件重命名加上*后修改日期,将所有重命名后的文件都添加到带有今天日期的压缩包里,并将压缩包移动到backup文件夹中,删除原始文件。
import os
import datetime
import zipfile
new_name_list = []
now_time_num = int(datetime.datetime.now().strftime(‘%Y%m%d’))
for file in os.scandir():
if not (file.is_dir() or file.name.endswith(‘.py’)):
file_mtime = os.stat(file.name).st_mtime
file_mtime_num = int(datetime.datetime.fromtimestamp(file_mtime).strftime(‘%Y%m%d’))
if file_mtime_num < now_time_num:
file_mtime_format = datetime.datetime.fromtimestamp(file_mtime).strftime(‘%Y-%m-%d’)
file_new_name = file_mtime_format + ‘-‘ + file.name
print(file.name, file_mtime_format)
os.rename(file.name, file_new_name)
new_name_list.append(file_new_name)
if not os.path.exists(‘backup’):
os.mkdir(‘backup’)
if len(new_name_list) > 0:
now_time = datetime.datetime.now()
now_date_format = now_time.strftime(‘%y-%m-%d’)
compress_name = now_date_format + ‘-compress.zip’
with zipfile.ZipFile(‘./backup/’ + compress_name, ‘w’) as zipobj:
for file_name in new_name_list:
zipobj.write(file_name)
os.remove(file_name)
二、处理 Excel 表格
1、python 打开及读取 Excel 表格内容
打开Excel表格并获取表格名称
from openpyxl import load_workbook
workbook = load_workbook(filename=’test.xlsx’)
获取sheet的尺寸范围
from openpyxl import load_workbook
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook[‘Sheet1′]
print(sheet.dimensions)
获取某个单元格数值
from openpyxl import load_workbook
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook.active
cell = sheet[‘C1′]
print(cell.value)
获取某个单元格的行、列、坐标
from openpyxl import load_workbook
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook.active
cell = sheet[‘C1′]
print(cell.row, cell.column, cell.coordinate)
from openpyxl import load_workbook
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook.active
cell = sheet.cell(row=1, column=4)
print(cell.row, cell.column, cell.coordinate)
获取一系列的单元格
from openpyxl import load_workbook
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook.active
for row in sheet.iter_rows(min_row=2, max_row=4, min_col=2, max_col=4):
for cell in row:
print(cell)
迭代整个表格的所有行
from openpyxl import load_workbook
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook.active
for row in sheet.rows:
print(row)
2、python 向 Excel 表格中写入内容
向某个单元格中写入内容并保存
from openpyxl import load_workbook
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook.active
sheet[‘B2’] = ‘hello world’
workbook.save(filename=’test.xlsx’)
插入python列表数据
from openpyxl import load_workbook
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook.active
data = [
[‘张三’, 1],
[‘李四’, 2],
[‘王五’, 3]
]
for row in data:
sheet.append(row)
workbook.save(filename=’test.xlsx’)
插入一列
from openpyxl import load_workbook
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook.active
sheet.insert_cols(idx=2)
workbook.save(filename=’test.xlsx’)
插入多行
from openpyxl import load_workbook
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook.active
sheet.insert_rows(idx=2, amount=3)
workbook.save(filename=’test.xlsx’)
删除行
from openpyxl import load_workbook
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook.active
sheet.delete_rows(idx=2, amount=2)
workbook.save(filename=’test.xlsx’)
移动单元格
from openpyxl import load_workbook
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook.active
sheet.move_range(‘A1:B2′, cols=2, rows=2)
workbook.save(filename=’test.xlsx’)
创建和删除表格
from openpyxl import load_workbook
workbook = load_workbook(filename=’test.xlsx’)
print(workbook.sheetnames)
workbook.create_sheet(‘MySheet’)
sheet = workbook[‘Sheet1′]
workbook.remove(sheet)
workbook.save(filename=’test.xlsx’)
复制表格
from openpyxl import load_workbook
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook[‘MySheet’]
workbook.copy_worksheet(sheet)
workbook.save(filename=’test.xlsx’)
修改表格名称
from openpyxl import load_workbook
workbook = load_workbook(filename=’test.xlsx’)
workbook[‘MySheet’].title = ‘MyNewSheet’
workbook.save(filename=’test.xlsx’)
创建新的Excel文件
from openpyxl import Workbook
workbook = Workbook()
sheet = workbook.active
sheet.title = ‘表格一’
for i in range(1, 10):
for j in range(1, 10):
sheet.cell(row=i, column=j).value = i * j
workbook.save(filename=’output.xlsx’)
冻结窗格
from openpyxl import load_workbook
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook.active
sheet.freeze_panes = ‘B2′
workbook.save(filename=’test.xlsx’)
筛选
from openpyxl import load_workbook
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook.active
sheet.auto_filter.ref = sheet.dimensions
workbook.save(filename=’test.xlsx’)
修改字体样式
from openpyxl.styles import Font
from openpyxl import load_workbook
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook.active
cell = sheet[‘A2′]
cell.font = Font(name=’微软雅黑’, size=12, italic=True, bold=True, color=’ff0000′)
获取表格中字体的样式
from openpyxl import load_workbook
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook.active
cell = sheet[‘B2′]
font = cell.font
print(font.name, font.size, font.italic, font.bold)
设置对其样式
wrap_text 是否自动换行
from openpyxl import load_workbook
from openpyxl.styles import Alignment
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook.active
cell = sheet[‘B2’]
cell.value = ‘锄禾日当午,汗滴禾下土。’
alignment = Alignment(horizontal=’center’, vertical=’center’, text_rotation=45)
cell.alignment = alignment
workbook.save(filename=’test.xlsx’)
单元格边框设置
from openpyxl import load_workbook
from openpyxl.styles import Border,Side
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook.active
cell = sheet[‘C3′]
side1 = Side(style=’thin’, color=’FF0000′)
side2 = Side(style=’dashed’, color=’0000FF’)
border = Border(left=side1, right=side1, top=side2, bottom=side2)
cell.border = border
workbook.save(filename=’test.xlsx’)
设置填充样式
from openpyxl import load_workbook
from openpyxl.styles import PatternFill, GradientFill
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook.active
cell_d4 = sheet[‘D4′]
pattern_fill = PatternFill(fill_type=’solid’, fgColor=’FF0000′)
cell_d4.fill = pattern_fill
cell_e5 = sheet[‘E5’]
gradient_fill = GradientFill(stop=(‘FF0000′, ’00FF00’, ‘0000FF’))
cell_e5.fill = gradient_fill
workbook.save(filename=’test.xlsx’)
设置行高和列宽
from openpyxl import load_workbook
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook.active
sheet.row_dimensions[1].height = 50
sheet.column_dimentsions[‘A’].width = 50
workbook.save(filename=’test.xlsx’)
合并单元格
from openpyxl import load_workbook
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook.active
sheet.merge_cells(‘A1:B2′)
sheet.merge_cells(start_row=5, end_row=7, start_column=5, end_column=7)
workbook.save(filename=’test.xlsx’)
取消合并单元格 unmerge_cells
插入图片
from openpyxl import load_workbook
from openpyxl.drawing.image import Image
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook.active
logo = Image(‘logo.png’)
logo.width = 100
logo.height = 50
sheet.add_image(logo, ‘C1′)
workbook.save(filename=’test.xlsx’)
插入柱状图
from openpyxl import load_workbook
from openpyxl.chart import BarChart, Reference
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook.active
chart = BarChart()
data = Reference(worksheet=sheet, min_row=1, max_row=6, min_col=2, max_col=6)
categories = Reference(sheet, min_col=1, min_row=2, max_row=6)
chart.add_data(data, titles_from_data=True)
chart.set_categories(categories)
sheet.add_chart(chart, ‘A7’)
workbook.save(‘test.xlsx’)
插入条形图
from openpyxl import load_workbook
from openpyxl.chart import LineChart, Reference
workbook = load_workbook(filename=’test.xlsx’)
sheet = workbook.active
chart = LineChart()
data = Reference(worksheet=sheet, min_row=1, max_row=6, min_col=2, max_col=6)
categories = Reference(sheet, min_col=1, min_row=2, max_row=6)
chart.add_data(data, from_rows=True, titles_from_data=True)
chart.set_categories(categories)
sheet.add_chart(chart, ‘A7’)
workbook.save(‘test.xlsx’)
三、处理 PDF 文件
1、提取PDF文字内容
使用 pdfplumber 提取文字
import pdfplumber
with pdfplumber.open(‘test.pdf’) as pdf:
first_page = pdf.pages[0]
print(first_page.extract_text())
使用 pdfplumber 提取单个简单表格
import pdfplumber
with pdfplumber.open(‘test.pdf’) as pdf:
first_page = pdf.pages[0]
table = first_page.extract_table()
print(table)
使用 pdfplumber 提取多个简单表格
import pdfplumber
with pdfplumber.open(‘test.pdf’) as pdf:
table_page = pdf.pages[0]
for table in table_page.extract_tables():
print(table)
提取表格时设定参数
import pdfplumber
with pdfplumber.open(‘test.pdf’) as pdf:
table_page = pdf.pages[0]
table = table_page.extract_table(
table_settings={
“vertical_strategy”: “text”,
“horizontal_strategy”: “text”
}
)
print(table)
使用 pypdf2 分割 pdf
from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_reader = PdfFileReader(‘test.pdf’)
for page in range(pdf_reader.getNumPages()):
pdf_writer = PdfFileWriter()
pdf_writer.addPage(pdf_reader.getPage(page))
with open(f’./分割后的PDF文件/divide_page{page}.pdf’, ‘wb’) as out:
pdf_writer.write(out)
使用 pypdf2 合并 pdf
from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_writer = PdfFileWriter()
for page in range(2):
pdf_reader = PdfFileReader(f’./分割后的PDF文件/divide_page{page}.pdf’)
for page_num in range(pdf_reader.getNumPages()):
pdf_writer.addPage(pdf_reader.getPage(page_num))
with open(‘merge.pdf’, ‘wb’) as out:
pdf_writer.write(out)
使用 pypdf2 旋转 pdf 页面
from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_reader = PdfFileReader(‘test.pdf’)
pdf_writer = PdfFileWriter()
for num in range(pdf_reader.getNumPages()):
if num % 2 == 0:
page = pdf_reader.getPage(num).rotateClockwise(90)
pdf_writer.addPage(page)
else:
page = pdf_reader.getPage(num).rotateCounterClockwise(90)
pdf_writer.addPage(page)
with open(‘rotateTest.pdf’, ‘wb’) as out:
pdf_writer.write(out)
使用 pypdf2 给 pdf 加水印
from PyPDF2 import PdfFileReader, PdfFileWriter
from copy import copy
watermark_pdf = PdfFileReader(‘watermark.pdf’)
watermark_page = watermark_pdf.getPage(0)
pdf_reader = PdfFileReader(‘test.pdf’)
pdf_writer = PdfFileWriter()
for page in range(pdf_reader.getNumPages()):
original_page = pdf_reader.getPage(page)
new_page = copy(watermark_page)
new_page.mergePage(original_page)
pdf_writer.addPage(new_page)
with(open(‘watermarkFile.pdf’, ‘wb’)) as out:
pdf_writer.write(out)
使用 pypdf2 加密 pdf 文件
from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_reader = PdfFileReader(“test.pdf”)
pdf_writer = PdfFileWriter()
for page in range(pdf_reader.getNumPages()):
pdf_writer.addPage(pdf_reader.getPage(page))
pdf_writer.encrypt(“123456”)
with open(‘test_encrypt.pdf’, ‘wb’) as out:
pdf_writer.write(out)
使用 pypdf2 解密 pdf 文件
from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_reader = PdfFileReader(‘test_encrypt.pdf’)
pdf_reader.decrypt(“123456”)
pdf_writer = PdfFileWriter()
for page in range(pdf_reader.getNumPages()):
pdf_writer.addPage(pdf_reader.getPage(page))
with open(‘test_decrypt.pdf’, ‘wb’) as out:
pdf_writer.write(out)
四、处理Word文件
1、Python读取Word文档内容
读取内容
from docx import Document
doc = Document(‘test.docx’)
for paragraph in doc.paragraphs:
print(paragraph.text)
读取文字块
from docx import Document
doc = Document(‘test.docx’)
for paragraph in doc.paragraphs:
for run in paragraph.runs:
print(run.text)
2、Python写入Word文档内容
添加标题、段落
from docx import Document
doc = Document()
doc.add_heading(‘一级标题’, level=1)
paragraph1 = doc.add_paragraph(‘这是*段段落。’)
paragraph2 = doc.add_paragraph()
paragraph2.add_run(‘加粗’).bold = True
paragraph2.add_run(‘普通’)
paragraph2.add_run(‘斜体’).italic = True
doc.save(‘test.docx’)
添加分页
from docx import Document
doc = Document()
doc.add_heading(“*页”, level=2)
doc.add_paragraph(“*页内容”)
doc.add_page_break()
doc.add_heading(“第二页”, level=3)
doc.add_paragraph(“第二页内容”)
doc.save(“test2.docx”)
添加图片
from docx import Document
from docx.shared import Cm
doc = Document()
doc.add_picture(“test.jpg”)
doc.add_picture(“test.jpg”, width=Cm(5))
doc.add_picture(“test.jpg”, width=Cm(5), height=Cm(8))
doc.save(“test3.docx”)
添加表格
from docx import Document
records = [
[‘学号’, ‘姓名’, ‘成绩’],
[101, ‘张三’, 99],
[102, ‘李四’, 96],
[103, ‘王五’, 98]
]
doc = Document()
table = doc.add_table(rows=4, cols=3)
for row in range(4):
cells = table.rows[row].cells
for col in range(3):
cells[col].text = str(records[row][col])
doc.save(‘test4.docx’)
3、Word文档内容编辑
文字样式的修改
from docx import Document
from docx.shared import Pt, RGBColor
from docx.oxml.ns import qn
doc = Document(“test.docx”)
for paragraph in doc.paragraphs:
for run in paragraph.runs:
run.font.bold = True
run.font.italic = True
run.font.underline = True
run.font.strike = True
run.font.shadow = True
run.font.size = Pt(20)
run.font.color.rgb = RGBColor(255, 0, 0)
run.font.name = ‘微软雅黑’
r = run._element.rPr.rFonts
r.set(qn(‘w:eastAsia’), ‘微软雅黑’)
doc.save(“test_modified.docx”)
段落对齐
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
doc = Document(‘test.docx’);
for paragraph in doc.paragraphs:
paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.save(‘test_modified.docx’)
段落行间距
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
doc = Document(‘test.docx’)
for paragraph in doc.paragraphs:
paragraph.paragraph_format.line_spacing = 2.0
doc.save(‘test_modified.docx’)
段前段后间距
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.shared import Pt
doc = Document(‘test.docx’)
for paragraph in doc.paragraphs:
paragraph.paragraph_format.space_before = Pt(12)
paragraph.paragraph_format.space_after = Pt(12)
doc.save(‘test_modified.docx’)
五、处理PPT文件
1、Python读取PPT
读取PPT文字
from pptx import Presentation
prs = Presentation(‘test.pptx’)
for slide in prs.slides:
for shape in slide.shapes:
if shape.has_text_frame:
text_frame = shape.text_frame
print(text_frame.text)
读取PPT段落
from pptx import Presentation
prs = Presentation(‘test.pptx’)
for slide in prs.slides:
for shape in slide.shapes:
text_frame = shape.text_frame
for paragraph in text_frame.paragraphs:
print(paragraph.text)
友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速 |