标签归档:Python工具

Python 绘制悼念的词云蜡烛

谨以此文悼念伟大的李文亮医生。

《有的人》— 臧克家
有的人活着,他已经死了。
有的人死了,他还活着。
有的人,骑在人民头上:“啊,我多伟大!”。
有的人,俯下身子给人民当牛马。
有的人,把名字刻入石头,想“不朽”。
有的人,情愿作野草,等着地下的火烧。
有的人,他活着别人就不能活。
有的人,他活着为了多数人更好地活。
骑在人民头上的,
人民把他摔垮。
给人民作牛马的,
人民永远记住他!
把名字刻入石头的,
名字比尸首烂得更早;
只要春风吹到的地方,
到处是青青的野草。
他活着别人就不能活的人,
他的下场可以看到;
他活着为了多数人更好地活着的人,
群众把他抬举得很高,很高。

无奈才学疏浅,无法用更多的语言描述我对他的敬意。但是作为程序员,我也有我的悼念方式:用代码绘制词云组成的蜡烛用以悼念。

1.准备

基于Python,绘制悼念的词云蜡烛我们需要用到的包有:

  • pip install matplot
  • pip install scipy==1.2.1
  • pip install wordcloud
  • pip install jieba
  • pip install codecs
  • pip install pandas
  • pip install numpy

打开CMD/Terminal 输入以上命令即可安装。如果你还没有安装Python,可以阅读此篇文章:超详细Python安装指南

然后需要找到生成词云的文本和相关图片,这里我用的是BBC的一篇报道,还有这张蜡烛图片:

来源:图品汇

2.编写代码

整体代码如下,我编写了非常详细的注释,大家不懂得可以根据注释的提示进行查询和学习。

# coding:utf-8
import jieba
import numpy
import codecs
import pandas
import matplotlib.pyplot as plt
from scipy.misc import imread
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
from wordcloud import WordCloud
  
def load_file_segment():
    # 加载我们自己的词典
    jieba.load_userdict("mywords.txt")
    # 读取文本文件并分词
    f = codecs.open(u"text.txt",'r',encoding='utf-8')
    # 打开文件
    content = f.read()
    # 读取文件到content中
    f.close()
    # 关闭文件
    segment=[]
    # 保存分词结果
    segs=jieba.cut(content) 
    # 对整体进行分词
    for seg in segs:
        if len(seg) > 1 and seg != '\r\n':
            # 如果说分词得到的结果非单字,且不是换行符,则加入到数组中
            segment.append(seg)
    return segment
 
def get_words_count_dict():
    segment = load_file_segment()
    # 获得分词结果
    df = pandas.DataFrame({'segment':segment})
    # 将分词数组转化为pandas数据结构
    words_count = df.groupby(by=['segment'])['segment'].agg({"计数":numpy.size})
    # 按词分组,计算每个词的个数
    words_count = words_count.reset_index().sort_values(by="计数",ascending=False)
    # reset_index是为了保留segment字段,排序,数字大的在前面
    return words_count
 
words_count = get_words_count_dict()
# 获得词语和频数

bimg = imread('candle.jpeg')
# 读取我们想要生成词云的模板图片
wordcloud = WordCloud(background_color='white', mask=bimg, font_path='simsun.ttc')
# 获得词云对象,设定词云背景颜色及其图片和字体
 
# 如果你的背景色是透明的,请用这两条语句替换上面两条 
# bimg = imread(candle.jpeg')
# wordcloud = WordCloud(background_color=None, mode='RGBA', mask=bimg, font_path='simhei.ttc')
 

words = words_count.set_index("segment").to_dict()
# 将词语和频率转为字典
wordcloud = wordcloud.fit_words(words["计数"])
# 将词语及频率映射到词云对象上
bimgColors = ImageColorGenerator(bimg)
# 生成颜色
plt.axis("off")
# 关闭坐标轴
plt.imshow(wordcloud.recolor(color_func=bimgColors))
# 绘色
plt.show()

其中candle.jpeg是位于当前文件夹的蜡烛文件,simhei.ttc是位于当前文件夹的字体文件,mywords.txt是我自己生成的词表,text.txt便是用于生成词云的文本。

以上全部文件和源代码我都已上传到公众号后台,回复:悼念蜡烛 即可下载。

3.生成蜡烛词云

我将这份源代码命名为candle.py, 通过在命令行中运行:

python candle.py

即可获得该蜡烛词云

中华民族需要永远记住李文亮医生。


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 自动提取电影中所有人脸

最近由于论文写作需要涉及到人脸的提取操作,结合以前做过的人脸识别项目:Python自动识别人脸开机 和 ffmpeg 的影片逐帧提取功能,实现了自动提取电影中所有人脸的操作。

我们知道,机器学习、深度学习算法需要数据量到达一定量级之后效果才比较好。所以我们今天的这个功能主要可以用于一些人脸识别算法的训练集提取。

1.准备

我们使用ffmpeg提取视频中的图片,它的安装方法如下:

1.1 windows安装ffmpeg :

1.下载:https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-essentials.zip

2.解压 zip 文件到指定目录;
将解压后的文件目录中 bin 目录(包含 ffmpeg.exe )添加进 path 环境变量(此电脑->右键->属性->高级系统设置->环境变量->编辑Path用户变量->新建-> 输入 bin目录的完整路径)中;

3.进入 cmd,输入 ffmpeg -version,可验证当前系统是否识别 ffmpeg,以及查看 ffmpeg 的版本;如果可以,则说明安装成功。

1.1 macOS安装ffmpeg:

1.Command+空格 搜索终端(Terminal)

2.输入以下命令安装homebrew:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

3.输入以下命令安装ffmpeg:
brew install ffmpeg

1.2 安装用于提取人脸的OpenCV模块

如果你已经安装好了Python(如果没有的话请看这篇文章:超详细Python安装指南),打开CMD/终端(Termianl)输入以下命令即可安装:

pip install opencv-python

接下来,让我们先学会从影片中逐帧提取图片。

2.提取图片

FFmpeg从视频中提取图片非常简单,而且功能很强大,能选择多少秒提取一帧,或者每秒提取X帧。

如果我们只需要1秒1帧,在CMD或Terminal中输入以下命令即可:

ffmpeg -i 视频路径.mp4 -r 1 image-%5d.jpg

其中:

-r 1 代表每秒取1帧
image-%5d.jpg是指命名格式为 image-00001.jpg

如图所示:

这样就能获得视频里的帧图:

3.从图片中提取人脸

如果你阅读过我以前的这篇文章: Python自动识别人脸开机 就会知道其实用OpenCV提取人脸是一件非常简单的事情。

它只需要你将图片使用cv2.imread函数读取进来,然后再使用一个训练好的分类器文件就能获得人脸的位置。如下代码所示:

def read_pic_save_face(sourcePath, targetPath, *suffix):
    """
    提取图片中的人脸

    1.对list中图片逐一进行检查,找出其中的人脸然后写到目标文件夹下
    2.haarcascade_frontalface_alt.xml 为库训练好的分类器文件
    3.下载opencv,安装目录中可找到该xml文件
    或关注 Python实用宝典 公众号后台回复 电影提取人脸 获取文件和源代码

    @param sourcePath: 图片源目录
    @param targetPath: 人脸目标目录
    @param *suffix: 图片后缀
    """

    ImagePaths=get_all_path(sourcePath, *suffix)
    count = 0
    face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_alt.xml')
    # 分类器
    for imagePath in ImagePaths:
        # 遍历所有图片
        img = cv2.imread(imagePath)
        if type(img) != str:
            faces = face_cascade.detectMultiScale(img, 1.1, 5)
            if len(faces):
                write_face(targetPath, faces)
    print ('Find '+str(count-1)+' faces to Destination '+targetPath)

获得了人脸的位置后,我们只需要将这部分位置写入到新的图片中即可:

def write_face(imagePath, targetPath, faces, count, img):
    """
    写入脸部图片到目标目录
    @param imagePath: 图片目录
    @param targetPath: 目标目录
    @param faces: 脸部数据
    @param count: 数目
    @param img: 图片数据
    """

    for (x, y, w, h) in faces:
        # 设置人脸宽度大于16像素,去除较小的人脸
        if w>=16 and h>=16:
            # 以时间戳和读取的排序作为文件名称
            listStr = [str(int(time.time())), str(count)]
            fileName = ''.join(listStr)
            # 扩大图片,可根据坐标调整
            X = int(x)
            W = min(int(x + w),img.shape[1])
            Y = int(y)
            H = min(int(y + h),img.shape[0])
            f = cv2.resize(img[Y:H, X:W], (W-X,H-Y))
            cv2.imwrite(targetPath+os.sep+'%s.jpg' % fileName, f)
            count += 1
            print (imagePath + "have face") 

怎么样,是不是特别简单?完整代码如下:

#-*-coding:utf8-*-
import os
import cv2
import time

def get_all_path(dirpath, *suffix):
    """
    获得所有路径

    @param dirpath: 目录
    @param *suffix: 后缀
    """

    PathArray = []
    for r, ds, fs in os.walk(dirpath):
        for fn in fs:
            if os.path.splitext(fn)[1] in suffix:
                fname = os.path.join(r, fn)
                PathArray.append(fname)
    return PathArray

def write_face(imagePath, targetPath, faces, count, img):
    """
    写入脸部图片到目标目录
    @param imagePath: 图片目录
    @param targetPath: 目标目录
    @param faces: 脸部数据
    @param count: 数目
    @param img: 图片数据
    """

    for (x, y, w, h) in faces:
        # 设置人脸宽度大于16像素,去除较小的人脸
        if w>=16 and h>=16:
            # 以时间戳和读取的排序作为文件名称
            listStr = [str(int(time.time())), str(count)]
            fileName = ''.join(listStr)
            # 扩大图片,可根据坐标调整
            X = int(x)
            W = min(int(x + w),img.shape[1])
            Y = int(y)
            H = min(int(y + h),img.shape[0])
            f = cv2.resize(img[Y:H, X:W], (W-X,H-Y))
            cv2.imwrite(targetPath+os.sep+'%s.jpg' % fileName, f)
            count += 1
            print (imagePath + "have face")

def read_pic_save_face(sourcePath, targetPath, *suffix):
    """
    提取图片中的人脸

    1.对list中图片逐一进行检查,找出其中的人脸然后写到目标文件夹下
    2.haarcascade_frontalface_alt.xml 为库训练好的分类器文件
    3.下载opencv,安装目录中可找到该xml文件
    或关注 Python实用宝典 公众号后台回复 电影提取人脸 获取文件和源代码

    @param sourcePath: 图片源目录
    @param targetPath: 人脸目标目录
    @param *suffix: 图片后缀
    """

    ImagePaths=get_all_path(sourcePath, *suffix)
    count = 0
    face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_alt.xml')
    # 分类器
    for imagePath in ImagePaths:
        # 遍历所有图片
        img = cv2.imread(imagePath)
        if type(img) != str:
            faces = face_cascade.detectMultiScale(img, 1.1, 5)
            if len(faces):
                write_face(imagePath, targetPath, faces, count, img)
    print ('Find '+str(count-1)+' faces to Destination '+targetPath)
 
if __name__ == '__main__':
    sourcePath = 'frames/greenbooks'
    targetPath1 = 'target/greenbooks'
    read_pic_save_face(sourcePath, targetPath1, '.jpg', '.JPG', 'png', 'PNG')

最后让我们来看看效果:

大部分提取都是正确的,当然不排除有些例外出现,这时候你就要手动去除了,比如说这个(汗):

您这也能分类成人脸???嗯???(不过仔细看还真挺像的)

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

开工第一天,先用Python戴个口罩

Python实用宝典终于复工啦(我咸鱼够了)!这些天,令人揪心的肺炎疫情一直闹得沸沸扬扬,口罩也被抢得断货,许多网友朋友们都只能开始给自己的头像戴口罩了(也挺好,为疫区省点医疗物资)

有个朋友(Prodesire)一早就预料到有这种情况,因此ta开发了一个工具,能让大家用一行语句就成功戴上口罩!

1.准备

老规矩,在开工前一定要安装好Python,如果还没安装请看这篇文章:超详细Python安装教程。安装完Python后我们就可以安装Prodesire开发的一个叫做face-mask的模块。

如果你是windows机器,请在 开始—运行 中输入cmd,执行
pip install face-mask

如果你是macOS机器,请command+空格,输入Terminal打开终端,执行
pip install face-mask

如果出现:CMake must be installed to build the following extensions: dlib 这样的错误,请先安装cmake:
pip install cmake

2.使用

同样地,打开cmd或终端,输入以下命令,就能在该图片的当前文件夹下生成一张戴着口罩的图片:

face-mask 该图片路径

比如说宽叔的这张图片:

输入命令 face-mask Downloads/2.jpg 即可生成戴口罩的图片:

类似的还有很多哦:

就不给大家一一尝试啦,总而言之,有基本脸部表情的,都可以戴的上这个口罩!

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 球队进球得分自动提醒

英超的比赛很多都会在当地时间周末的晚上举行,而很不巧这个时间在中国是凌晨4点左右,对中国观众非常不友好。或者有的时候是中国时间晚上8点或晚上10点开始,但是我们并不一定有时间看。

这些情况下如果你想查看比分,还得打开某个软件,点击国际足球——赛事——积分榜,非常麻烦。今天用Python告诉你怎样在你支持的足球队得分时给你发送短信,如果你原意,可以不编写任何代码哦!

1.准备

今天只在本地做部署和测试,实际上当项目运行起来的时候,应该是放在服务器上的,毕竟本地机器不太适合全天24小时开着嘛。

1.首先,你需要下载Python3环境,如果你还没下载,可以参考这篇文章:超详细Python下载安装指南

2.其次,你需要克隆一个名为footballNotifier的仓
https://github.com/carlos-menezes/footballNotifier

3.打开CMD或Terminal, 输入以下命令安装依赖:
pip install -r requirements.txt

2.配置你的主队

这一步,需要打开仓里的config.ini:

1.在Number处填入你的手机号,在TEAM处填入你的主队
如:Arsenal 阿森纳等。请注意要填写英文。

2.前往TextLocal注册一个短信发送账号:
https://www.textlocal.com/
邮箱验证后才能设置账号密码。

3.在下面的链接创建一个API_KEY
https://control.txtlocal.co.uk/settings/apikeys/

不需要填IP,直接保存。然后会刷新到上个页面,你能看到一个秘钥,复制这串秘钥,并相应填写到config.init中的API_KEY里:

配置完成后,在cmd或Terminal中输入以下命令就可以开始监控比分啦:
python app.py

3.源码分析

其实这个仓一共就两个文件,一个是scrapegoals.py,用于抓取实时的赛事结果,其实是一个非常简单的爬虫

还有一个是app.py,是程序的入口点,也就做两个事:

1.获取赛事结果。
2.如果是目标队伍进球,那就调用短信API发送短信。
#用While循环保持监控进程

其实是非常简单的一个开源项目,大家有兴趣可以自己做一个国内版的,并不复杂。

自动通知系列文章:

教你如何使用Python向手机发送通知(IFTTT)

Python 自动发送邮件详细教程

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 9行代码批量翻转壁纸的惊喜

今天在欣赏一些新的手机壁纸的时候,不小心把手机拿反了,但是却因此偶然看到了非常有特色的图片。因此突然有了推送的灵感——用Python批量翻转图片

其实原理很简单,用九行代码就能完成我们所需要的功能。

1.准备

为了能够翻转图片,我们需要先安装好PIL,也就是pillow,在CMD/Terminal输入:

pip install pillow

请记得先安装Python,才能够pip,如果你还没有安装Python,请看这篇文章: 超详细Python安装指南

2.编程

仅需要3个步骤:

1.获得图片文件夹下所有文件名

2.迭代所有图片

3.翻转保存到指定文件夹

#-*- coding: UTF-8 -*- 

from PIL import Image
import os

# 获得文件夹下所有文件
filePath = './imgs/'
filenames = os.listdir(filePath)

# 指定保存的文件夹
outputPath = './imgs_rotate/'

# 迭代所有图片
for filename in filenames:
    # 读取图像
    im = Image.open(filePath + filename)

    # 指定逆时针旋转的角度
    im_rotate = im.rotate(180)
    
    # 保存图像
    im_rotate.save(outputPath + filename) 

3.效果

嘻嘻,其实也是相当于壁纸分享了,当然,微信公众号会有压缩的现象,大家如果想下载原图请点击下方阅读原文,或者关注文章最下方Python实用宝典公众号,回复 翻转壁纸

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 监控文件增加、修改、删除等变化

现在有一个应用场景,需要对文件系统进行监控,发生变化时产生日志,对新增的文件做一些相应的操作。比如说应用到我们之前的高潮提取器:若当前文件夹下增加了一个音乐文件,监控器就调用高潮提取器提取该音乐文件的高潮部分。

这样的监控器写起来也不难,但是很花时间,有许多情况要考虑。不过幸好我们是写Python的,有许多轮子可以使用。

1.安装”看门狗”

“看门狗”模块就是用于监控文件事件变化的一个Python”轮子”,代码架构优秀,可以注册许多事件处理器,方便用户做自定义操作。如果你还没有安装Python,请看这篇文章《Python详细安装指南》,在终端输入以下命令即可安装看门狗:

pip install watchdog

2.基本使用

看门狗的使用其实不复杂,请认真看以下代码和注释:

import sys
import time
import logging
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler

if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO,
                        format='%(asctime)s - %(message)s',
                        datefmt='%Y-%m-%d %H:%M:%S')
    path = sys.argv[1] if len(sys.argv) > 1 else '.'

    # 生成事件处理器对象
    event_handler = LoggingEventHandler()

    # 生成监控器对象
    observer = Observer()
    # 注册事件处理器,配置监控目录
    observer.schedule(event_handler, path, recursive=True)
    # 监控器启动——创建线程
    observer.start()

    # 以下代码是为了保持主线程运行
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()

    # 主线程任务结束之后,进入阻塞状态,一直等待其他的子线程执行结束之后,主线程再终止
    observer.join()

可以看到代码中有几个关键步骤,1.配置各项信息;2.生成事件处理器、监控器;3.注册事件处理器、配置目录、递归执行(即同时监控子文件夹);4.启动。

其实,看门狗的observer是基于 threading.Thread 对象的,所以observer很多属性都继承了 threading.Thread 的属性。

如果你不带参数地运行该脚本,就是要监控脚本文件所在的文件夹,如果要监控其他文件夹,记得运行时带文件夹的路径参数,如:

python obserber.py /data/home/ckend/

我们来试着运行看看:

可以看到,我在当前文件夹下做的所有操作都被记录下来了。接下来我们就试试怎么自定义一些操作。

3.监控提取音乐高潮

如果你不知道怎么提取音乐文件的高潮部分,请看这篇文章:《Python自动提取音乐文件高潮》

要实现这样的功能,我们有几种方法,一个是在原来log的处理器上做一些新增修改,比如多增一个函数调用音乐高潮提取器。第二个是重新继承 FileSystemEventHandler 类,并做相应的修改。这里我们还是要保留log的样式,只是在log的时候顺便提取音乐高潮,因此采用第一个方法。

看看LoggingEventHandler源代码中的on_created,这就是当文件创建时监控器的操作:

class LoggingEventHandler(FileSystemEventHandler):
    """Logs all the events captured."""

    # ...省略其他源代码...

    def on_created(self, event):
        super(LoggingEventHandler, self).on_created(event)

        what = 'directory' if event.is_directory else 'file'
        logging.info("Created %s: %s", what, event.src_path)

我们仅需要继承这个类并对on_created进行修改,就能完成我们想要的功能:

# Python实用宝典
# 2019/12/29

import sys
import time
import logging
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler
from pychorus import find_and_output_chorus


class extractor(LoggingEventHandler):

    def on_created(self, event):
        super(LoggingEventHandler, self).on_created(event)
        what = 'directory' if event.is_directory else 'file'
        logging.info("Created %s: %s", what, event.src_path)
        NameExt = event.src_path.split('.')
        if NameExt[-1] == 'mp3':
            logging.info("mp3文件, 提取音乐高潮中...")
            output_path = "."+"".join(NameExt[:-1])+'_high.wav'
            find_and_output_chorus(event.src_path, output_path, 30)


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO,
                        format='%(asctime)s - %(message)s',
                        datefmt='%Y-%m-%d %H:%M:%S')
    path = sys.argv[1] if len(sys.argv) > 1 else '.'

    # 生成事件处理器对象
    event_handler = extractor()

    # 生成监控器对象
    observer = Observer()
    # 注册事件处理器
    observer.schedule(event_handler, path, recursive=True)
    # 监控器启动——创建线程
    observer.start()

    # 以下代码是为了保持主线程运行
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()

    # 主线程任务结束之后,进入阻塞状态,一直等待其他的子线程执行结束之后,主线程再终止
    observer.join() 

首先声明一个类,继承LoggingEventHandler,然后重载on_created函数,在这个函数中不仅记录文件事件变化,还要对mp3文件做一次音乐高潮提取。最后别忘了,生成事件处理器时要用我们新的类名。

看看效果,将小永远.mp3复制过来:

成功监控文件变化并提取到音乐高潮,生成高潮文件。

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

超方便的 Python 唤醒窗口自动截图脚本

利用Python自带的win32api和win32con、win32gui等模块,我们能执行许多windows下的自动化操作。比如两个窗口的自动点击操作,从软件中的窗口复制文本到txt中,甚至是截图操作。

截图的操作用途最为广泛,你可以用它配合定时工具,定时检测某个程序的运行情况;甚至可以根据截图做一些辅助性的决策,比如玩类似于《连连看》的游戏时,对相同类型的方块进行标记,辅助你玩游戏。

下面就讲讲如何使用 win32api 实现自动唤醒并截图的操作。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

pip install pypiwin32
pip install pillow

1.获取窗口左上角及右下角坐标

​通过 win32gui 的 FindWindow 函数,我们能轻易地找到任何进程的窗口:

import win32api, win32con, win32gui
def get_window_pos(name):
    name = name
    handle = win32gui.FindWindow(0, name)
    # 获取窗口句柄
    if handle == 0:
        return None
    else:
        return win32gui.GetWindowRect(handle)
x1, y1, x2, y2 = get_window_pos('暴雪战网')
print(x1,y1,x2,y2)

结果:

F:\push\20190929>python 1.py
(349, 83, 1549, 1013)

其中窗口信息(x1, y1, x2, y2),(x1, y1)是窗口左上角的坐标,(x2, y2)是窗口右下角的坐标。我们可以利用这个信息配合PIL进行截图。但是在这之前,我们还要解决两个问题:

  1. 该窗口并不在当前的界面上,被其他的软件覆盖到底层中,这时候需要高亮窗口
  2. 该窗口被最小化怎么办

2.win32gui 高亮窗口

为了使得被叠在底层的窗口能放到最上层显示,我们需要拿到窗口的handle,对其执行高亮操作,其实很简单,我们刚刚获得坐标信息的时候已经得到handle了,只需要做一下简单的更改即可。

import win32api, win32con, win32gui
def get_window_pos(name):
    name = name
    handle = win32gui.FindWindow(0, name)
    # 获取窗口句柄
    if handle == 0:
        return None
    else:
        # 返回坐标值和handle
        return win32gui.GetWindowRect(handle), handle
(x1, y1, x2, y2), handle = get_window_pos('暴雪战网')
text = win32gui.SetForegroundWindow(handle)

这样就能将被覆盖到底层的窗口放到最上层,如下图所示。

python 高亮窗口

3. 还原最小化窗口

还有一种特殊情况就是窗口被缩小了,这时候我们就需要还原最小化窗口,其实也非常简单,只要利用win32gui和win32con向该窗口发送一个信息即可。

import win32api, win32con, win32gui
def get_window_pos(name):
    name = name
    handle = win32gui.FindWindow(0, name)
    # 获取窗口句柄
    if handle == 0:
        return None
    else:
        # 返回坐标值和handle
        return win32gui.GetWindowRect(handle), handle
(x1, y1, x2, y2), handle = get_window_pos('暴雪战网')
win32gui.SendMessage(handle, win32con.WM_SYSCOMMAND, win32con.SC_RESTORE, 0)
# 发送还原最小化窗口的信息
win32gui.SetForegroundWindow(handle)
# 设为高亮 

效果如图所示:

python还原最小化窗口

4.截图

有了PIL模块和窗口的坐标后,我们想截图可非常简单。PIL 模块安装

pip install pillow

安装完就可以试一下我们的完整代码了,如下:

import win32api, win32con, win32gui

def get_window_pos(name):
    name = name
    handle = win32gui.FindWindow(0, name)
    # 获取窗口句柄
    if handle == 0:
        return None
    else:
        # 返回坐标值和handle
        return win32gui.GetWindowRect(handle), handle
(x1, y1, x2, y2), handle = get_window_pos('暴雪战网')
win32gui.SendMessage(handle, win32con.WM_SYSCOMMAND, win32con.SC_RESTORE, 0)
# 发送还原最小化窗口的信息
win32gui.SetForegroundWindow(handle)
# 设为高亮
from PIL import Image, ImageGrab
img_ready = ImageGrab.grab((x1, y1, x2, y2))
# 截图
img_ready.show()
# 展示 

效果如下:

python 截图

这个功能可好用了,比如说你需要监控一个窗口的运行状况,不可能时时刻刻都去观察它,你可以使用while循环不断调用这个窗口截图脚本,先截图进行保存。

你甚至可以配合定时任务做截图,见我们上篇文章:Schedule—简单实用的 Python 周期任务调度工具

截图后的图表信息还能够用于分析、辅助决策。举个游戏的例子:当你玩《连连看》的时候,可以截图检测每个方块是否相同,把相同的方块标记出来,提高你的连连看游戏效率。

我们的文章到此就结束啦,如果你喜欢今天的Python 实战教程,请持续关注Python实用宝典。原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python Django快速开发音乐高潮提取网(2)

上次第一部分我们用Django搭建了一个简易的文件上传网站,今天让我们来完善这个网站,增加一些细节部分的调整,并加入音乐高潮提取的API.

如果你还没有阅读过第一部分,建议先从第一部分开始阅读哦:Python Django快速开发音乐高潮提取网(1)

本文完整源代码,请在后台回复:音乐高潮提取网 获取

1.文件校验

首先,为了安全起见,同时也为了减小服务器的压力,我们必须确认用户上传的文件是正确的。因此需要在views.py接收用户请求时,对用户上传的文件判断格式和大小。

在上篇文章中,我们使用了 forms 类生成表单,后端使用 request.FILES[‘docfile’] 获得了文件,这个对象具备什么属性呢?能不能让我们获得文件的大小和格式呢?

在一番搜索后,我终于找到了它的属性,这是一个叫做UploadedFile的类文件对象,具备以下属性:

详细文档:https://docs.djangoproject.com/en/3.0/ref/files/uploads/

通过size属性能获得bytes单位的文件大小,通过content_type可以获得文件属性,太好了,接下来就可以编写我们的校验代码:

这里我们限定了文件大小为10M (从bytes到MB的计算方法:1024*1024*10 ) ,上传文件的格式限定为wav和mp3. 将这个函数用于校验,如图所示:

好了,现在你再试一下上传图片,会发现什么反应都没有,上传mp3格式的音乐会返回上传成功的提示。

2.提取音乐的高潮部分

这一部分其实很简单,不过如果你还没看过音乐的高潮部分提取的文章,建议阅读:Python 音乐高潮提取

首先,引入我们所需要的包(安装方法在Python Django快速开发音乐高潮提取网(1)) :

from pychorus import find_and_output_chorus 

然后要拿到音乐文件的路径,才能过进行音乐提取,还记得我们在上节的教程中,其实是用了一个模型来上传文件的吗:

现在这个模型派上用场了。我们仅需要在文件对象保存之后,通过“对象.file.path ” 的属性就能获得文件的绝对路径。

ilePath = newdoc.file.path 

不过,我们还需要设定音乐高潮部分提取完成后的输出位置,我的设定方法是在同目录下保存一个后缀为_high的文件:

不过要注意的是,由于该模块用到了一个名为SoundFile的包,这个包在输出文件的时候仅支持以下格式,为了方便处理,我们默认输出格式为wav.

3.返回音乐高潮部分给用户

接下来要返回提取完成的音乐高潮部分的文件,我们希望将文件作为附件给用户下载,让用户自行选择软件播放音乐,而不是在网站上直接收听音乐。

Django能非常容易地实现这一点:

将文件以二进制的形式打开,然后作为HttpResponse返回,设定 content_type 和 Content_Disposition 即可。

好了,再次运行项目:python manage.py runserver 上传一个音乐试一下:

https://pythondict-1252734158.file.myqcloud.com/home/www/pythondict/wp-content/uploads/2019/12/2019121315094465.wav

这样,我们就能成功地完成用户上传——提取音乐高潮——返回用户下载的逻辑了。不过还有一些细节需要改进:

1.前端太丑了,能不能改进一下?
2.用户上传文件错误时没有提醒。
3.能不能多加点功能,比如其他用户的音乐分享?

下一次教程,我们就来完整地完成这个网站并上线!关注下方公众号,后台回复  音乐高潮提取网  获得本文全部源代码!

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!

音乐相关教程:

Python 批量下载网易云音乐歌单

Python 制作音乐高潮副歌提取器

Python Django快速开发音乐高潮提取网(1)

Python Django快速开发音乐高潮提取网(2)

Python Django快速开发音乐高潮提取网(3)

Python 超方便超快速剪辑音乐

Python 提取音乐频谱并可视化


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 将网易云歌单迁移到QQ音乐

最近,网易云音乐越来越多的歌曲变灰了,许多我以前喜欢听的音乐都消失在云端,非常可惜。最近我还是想听回以前的歌曲,于是只能使用有那些歌曲版权的QQ音乐,麻烦的是,QQ音乐没有我在网易云音乐的歌单,两个软件之间互相切歌也是在太麻烦了。

上网摸索了一段时间,终于找到一个基于Python的开源项目 Denon/syncPlaylist 这是一个使用爬虫技术搭建的两端同步软件,它可以从网易同步歌单到QQ音乐,也可以从QQ音乐同步歌单到网易云音乐,非常方便。

想要实现这样的同步功能,一般都需要提供账号密码,普通软件让人恨不放心,因为你不知道它会不会把你的账号密码上传到软件作者自己的服务器,从而窃取你的账号。但使用这个项目你就不需要有这个困扰,因为它是开源项目,源代码全透明公开,不存在上传账号密码的操作。下面我们直接基于项目的Python源代码进行迁移操作。

1.下载源代码

你可以在项目的原网站点击 Clone or download—Download zip 下载完整源代码。

如果网络不允许,没关系,关注文章最下方的Python实用宝典公众号,后台回复 网易QQ音乐迁移 即可获得完整源代码。

2.安全检查

为了让大家放心使用作者的源代码,我们要对他的代码进行简单的分析,确保没有任何的请求发送账号密码到任何除网易和QQ之外的服务器中。

检索源代码中所有的url,看看有没有非qq或者网易的域名:

发现了一个陌生域名,不过没关系,这个是作者放着用来下载phantomjs的链接,phantomjs是一个用于爬虫的无头浏览器,没有安全威胁。

这是作者用于QQ登录的逻辑(真的是一行注释都不写啊我X),看了XPATH,和现在的QQ官网依然对应正确,登录逻辑没有太大的问题。

再仔细瞧瞧其他的py文件,如果看到了任何奇怪的东西都要注意。我扫了一遍,非常安全,如果你不信的话可以自己多看看几遍。

3.迁移歌曲

接下来,我们基于这个项目的源代码演示如何将网易云音乐的歌曲迁移到QQ音乐上。注意,你得确保你的电脑已经安装了Python的运行环境,如果没有的话推荐阅读这篇文章(由于该项目用的是Python2,推荐安装anaconda,能够在Python2和Python3之间创建环境自由切换):
https://blog.csdn.net/ITLearnHall/article/details/81708148

3.1 配置账号

在 config.json[account, password] 添加qq账户(account) 和 密码(password)

3.2 找到你想要移植的歌单

比如我想移植我喜欢的音乐:

然后输入到config.json中:

3.3 找到你想传入的QQ歌单

比如我想放到QQ的“我喜欢”歌单:

没错,这要先进入QQ音乐官网登录后,找到我的音乐——点击“我喜欢 ” ,才能拿到歌单地址,和刚刚一样,放入config.json的目标歌单中:

3.4 开始迁移

然后在当前文件夹中打开终端(windows: win+R 输入CMD; macOS: command+空格 输入终端):

首先安装依赖,以下命令会自动安装 requirements.txt 中的依赖:

pip install -r requirements.txt

然后运行命令:

python run.py

等待后即可完成音乐的迁移。

在这个过程中,由于大家的环境都不一样,你们可能会遇到各种各样的问题,如果有问题,欢迎在下方留言区留言,我们都会耐心解答的!

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!

音乐相关教程:

Python 批量下载网易云音乐歌单

Python 制作音乐高潮副歌提取器

Python Django快速开发音乐高潮提取网(1)

Python Django快速开发音乐高潮提取网(2)

Python Django快速开发音乐高潮提取网(3)

Python 超方便超快速剪辑音乐

Python 提取音乐频谱并可视化


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Blender, 用Python绘制宇宙飞船的3D建模软件

见过用Python进行3D建模操作的么?下面给你演示一下:

强不强?这就是Blender,一款能用Python进行建模的软件。

Blender是一个免费的开源3D计算机图形软件工具集,用于创建动画电影视觉效果,艺术品,3D打印模型,动态图形,交互式3D应用程序和计算机游戏

不仅如此,它还提供了一个Python与Blender交互的API: https://docs.blender.org/api/2.81/ ,使Python进行3D建模成为一种可能。

下面介绍一下这个宇宙飞船项目。这是一个比赛作品,作者用它参与了reddit的一个2016年6月的挑战赛。实现的原理并不复杂,就是从一个立方体开始建造船体,利用随机数增加船体的不确定性。然后慢慢地往船体增加细节,比如引擎、天线、炮塔、照明灯等等。

项目地址: https://github.com/a1studmuffin/SpaceshipGenerator

快来生成你的宇宙飞船

要想运行这个项目,你需要做如下准备:

1. 安装Blender 2.76以上:
https://www.blender.org/download/

2. 下载作者的生成代码(也就是已经和Blender做好API联调的代码)。
如果你访问不了Github, 可在公众号后台回复 宇宙飞船 下载这些代码。

3. 将下载好的代码( add_mesh_SpaceshipGenerator.zip, 以压缩包的形式)载入到blender中:

3.1 点击菜单栏里的 Edit — 选择Preferences.

3.2 选择左侧的Add-ons,然后点击install,选择刚刚下载下来的压缩包。

3.3 载入后记得勾选插件。

4. 使用快捷键shift+F5进入3D视图

5. 使用快捷键shift+A,这时候鼠标右键会弹出选项,在mesh中选择 Spaceship即可生成你的宇宙飞船!

怎么样,够不够帅?记得自己实践一下生成一个哦!

自己用Python进行DIY

如果你想自己再进行一下DIY,让飞船变得更帅气,那也是可以的!把下载下来的压缩包解压,里面会有一个文件叫spaceship_generator.py的,这个就是主要的模型生成代码。你能在里面看到作者的许多参数设置,稍微修改一下会有惊喜哦!

你也可以阅读完作者的这份源代码(也不多,就800行),自己学着做一个有别于宇宙飞船的3D模型!

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典