分类目录归档:工具

Python 提取音乐频谱并可视化

你有没有经常好奇一些音乐软件的频谱特效是怎么做的,为什么做的这么好看?有没有想试试自己提取音乐频谱并可视化展现出来?今天,咱就结合上次的音乐剪辑操作:

Python 剪辑音乐就是这么简单

来可视化下面这首歌曲的频谱!

https://pythondict-1252734158.file.myqcloud.com/home/www/pythondict/wp-content/uploads/2020/04/2020040520354021.mp3

1.准备工作

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

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

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南

输入以下命令安装本文所需要的依赖模块:

pip install pydub
pip install librosa

看到 Successfully installed xxx 则说明安装成功。

2.频谱展示

使用librosa和matplot,我们可以用10行代码完整地展示整个频谱:

import matplotlib.pyplot as plt
import librosa.display

# 音乐文件载入
audio_path = 'Fenn.mp3'
music, sr = librosa.load(audio_path)

# 宽高比为14:5的图
plt.figure(figsize=(14, 5))
librosa.display.waveplot(music, sr=sr)

# 显示图
plt.show()

不过,这样的频谱是整段音乐的,看起来非常难看,接下来我们使用 pydub 切割频谱,以获得更佳的效果。我们细分到0到1秒的区段来查看频谱:

import matplotlib.pyplot as plt
import librosa.display
import numpy as np
from pydub import AudioSegment

# 1秒=1000毫秒
SECOND = 1000
# 音乐文件
AUDIO_PATH = 'Fenn.mp3'

def split_music(begin, end, filepath):
    # 导入音乐
    song = AudioSegment.from_mp3(filepath)
    
    # 取begin秒到end秒间的片段
    song = song[begin*SECOND: end*SECOND]
    
    # 存储为临时文件做备份
    temp_path = 'backup/'+filepath
    song.export(temp_path)

    return temp_path

music, sr = librosa.load(split_music(0, 1, AUDIO_PATH))

# 宽高比为14:5的图
plt.figure(figsize=(14, 5))
librosa.display.waveplot(music, sr=sr)
plt.show() 

这下细是细了,但是还是太复杂了,其实我们做频谱的展示,只需要正值即可:

然后我们还可以进一步放大,比如说0.9秒到1秒之间的频谱:

# 放大
n0 = 9000
n1 = 10000

music = np.array([mic for mic in music if mic > 0])
plt.figure(figsize=(14, 5))
plt.plot(music[n0:n1])
plt.grid()

# 显示图
plt.show() 

这样好看许多,不过如果要达成QQ音乐那种效果,还是需要进行大量改造。

比如用精美的图像元素来填充替代、然后零值如何处理?如何让频谱更加平稳?此外,我们是静态的图像,还需要根据事件动态地延续波段。

用于生产的代码肯定比我们这简易的代码更加复杂,而且也不应该是暴力去除负值绘制图像。这些有兴趣的读者可以自行研究啦。

音乐相关教程:

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

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

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

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

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

Python 超方便超快速剪辑音乐

Python 提取音乐频谱并可视化

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

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

实战教程!用 Python 制作抖音爆款视频!

前几天在抖音上刷到一个慢慢变老的视频,播放量居然有 30W+,当时就在想这视频 Python 可不可以做?

经过一番搜索,小编找到了腾讯云的人脸年龄变化 API,上面介绍说只要用户上传一张人脸图片,基于人脸编辑与生成算法,就可以输出一张人脸变老或变年轻的图片,并支持实现人脸不同年龄的变化

准备工作

获取 API 秘钥

第一步,在注册账号之后,打开 API 密钥管理页面(https://console.cloud.tencent.com/cam/capi)获取到 SecretId 和 SecretKey。

第二步,安装腾讯云的 SDK

pip3 install tencentcloud-sdk-python

人脸属性

在人脸年龄变化 API 中有一个 AgeInfo 参数,它包含了 Age 和 FaceRect 两个属性,其中 FaceRect 属性必须填人脸在照片中基于左上角的 X、Y 坐标和人脸的高度与宽度。所以先要调用人脸检测与分析 API 得到这些数据。

下面的示例图是在百度图片中截取的。

import json
import base64
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.iai.v20200303 import iai_client
from tencentcloud.iai.v20200303 import models as models03

sid = "xxx"
skey = "xxx"
try

    filepath = '/Users/imeng/Downloads/face/face.png'
    file = open(filepath, "rb")
    base64_data = base64.b64encode(file.read())

    cred = credential.Credential(sid, skey) 
    httpProfile = HttpProfile()
    httpProfile.endpoint = "iai.tencentcloudapi.com"

    clientProfile = ClientProfile()
    clientProfile.httpProfile = httpProfile
    client = iai_client.IaiClient(cred, "ap-beijing", clientProfile) 

    req = models03.DetectFaceAttributesRequest()
    params = {
        "MaxFaceNum":2,
        "Action":"DetectFace",
        "Version":"2018-03-01",
        "Image": base64_data.decode()
    }
    req.from_json_string(json.dumps(params))
    resp = client.DetectFaceAttributes(req) 

    faceDetailInfos = resp.FaceDetailInfos
    for faceDetailInfo in faceDetailInfos:
        faceRect = faceDetailInfo.FaceRect
        print(faceRect)
except TencentCloudSDKException as err: 
    print(err) 

示例结果

{"X"62"Y"13"Width"145"Height"230}
{"X"426"Y"113"Width"115"Height"139}

修改年龄

在上面已经得到了各个人脸的 X、Y、Width、Height 属性,加上变老的年龄 Age,就可以请求年龄变化 API 了。

这里需要注意的是 models 模块,人脸检测 models 模块是在 tencentcloud.iai.v20200303 包下,人脸年龄变化的 models 是在 tencentcloud.ft.v20200304 下,两个 models 模块并不兼容。

import json
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.ft.v20200304 import ft_client, models

cred = credential.Credential(sid, skey) 
httpProfile = HttpProfile()
httpProfile.endpoint = "ft.tencentcloudapi.com"
clientProfile.httpProfile = httpProfile
client = ft_client.FtClient(cred, "ap-beijing", clientProfile) 

req = models.ChangeAgePicRequest()

for age in range(7080):
params = {
    "Image": base64_data.decode(),
    "AgeInfos": [
        {
            "Age": age,
            "FaceRect": {
                "Y": faceDetailInfos[0].FaceRect.Y,
                "X": faceDetailInfos[0].FaceRect.X,
                "Width": faceDetailInfos[0].FaceRect.Width,
                "Height": faceDetailInfos[0].FaceRect.Height
            } 
        },
        {
            "Age": age,
            "FaceRect": {
                "Y": faceDetailInfos[1].FaceRect.Y,
                "X": faceDetailInfos[1].FaceRect.X,
                "Width": faceDetailInfos[1].FaceRect.Width,
                "Height": faceDetailInfos[1].FaceRect.Height
            } 
        }
    ],
    "RspImgType""base64"
}
req.from_json_string(json.dumps(params))
resp = client.ChangeAgePic(req) 
image_base64 = resp.ResultImage
image_data = base64.b64decode(image_base64)
file_path = '/Users/imeng/Downloads/face/{}.png'.format(age)
with open(file_path, 'wb'as f:
    f.write(image_data)
time.sleep(1)

示例结果

最后的视频可以将图片一张一张插入 PPT 幻灯片,点击保存为视频。

转自AirPython.

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

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

Python 批量转化彩色图片为黑白图片

最近遇到了一个新的情景,需要将彩色图片转化为黑白图片,如果手动地去转化一张一张图片,那就真的太原始人了。

用Python,咱只需要几行代码就可以在几秒内转化上千张图片。而且,这个功能的用途相当广泛,不仅能使图片变得深邃,而且还可以简化一些复杂模型的数学计算,具体可见第三部分的分析。

1.准备

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

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

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南

输入以下命令安装本文所需要的依赖模块:

pip install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

看到 Successfully installed xxx 则说明安装成功。

2.编写代码

首先写一下我们的彩色图转单色图的转化函数,接收两个参数,一个是输入文件的路径,一个是输出文件路径:

from PIL import Image

def colorful_to_single(input_img_path, output_img_path):
    """
    彩色图转单色图
    :param input_img_path: 图片路径
    :param output_img_path: 输出图片路径
    """

    img = Image.open(input_img_path)
    # 转化为黑白图片
    img = img.convert("L")
    img.save(output_img_path) 

(又是注释比代码长系列)

然后将你需要转化的图片放到一个文件夹中,我这里命名该文件夹为imgs,然后指定一个输出文件夹 output,如下:

dataset_dir = 'imgs'
output_dir = 'output'

# 获得需要转化的图片路径并生成目标路径
image_filenames = [(
    os.path.join(dataset_dir, file_dir),
    os.path.join(output_dir, file_dir)
) for file_dir in os.listdir(dataset_dir)]

# 转化所有图片
for path in image_filenames:
    colorful_to_single(path[0], path[1])

这里比较难理解的可能是image_filenames,用到了列表推导式,即遍历所有dataset_dir里的文件:

for file_dir in os.listdir(dataset_dir) 

并将其和我们指定的目录以路径的形式链接起来:

os.path.join(output_dir, file_dir) 

最终生成一个数组,第一个元素是输入路径,第二个元素是输出路径:

image_filenames = [(
    os.path.join(dataset_dir, file_dir),
    os.path.join(output_dir, file_dir)
) for file_dir in os.listdir(dataset_dir)]

3.效果及用途

黑白效果就是这样的:

用途当然也有很多了,比如:

1.在深度学习分类图像的时候,如果并不需要考虑颜色的维度,可以先将图片转化为黑白图,简化运算复杂度。

2.黑白图片有的时候比彩色图片更具备冲击力,能够更加突出主题。

3.黑白图片有些时候也有美颜的作用,因为此时注意力的重点在于脸型,如果那个人的脸型特别好看,但是肤色比较差,这时候黑白照片就很有效果。

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


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

Python 一键生成漂亮的生日快乐词云!

前段时间写了几篇关于生成词云的文章,其中包括:

Python 情人节超强技能 导出微信聊天记录生成词云

Python 绘制悼念的词云蜡烛

等等,但是这几篇文章的转化对象都必须是多词汇组成的,也就是说他们生成词云的条件是词组必须够多,只有一两个词的话无法生成完整词云。

最近遇到许多朋友有特殊的需求,他们只想把 【名字】和【生日快乐】两个词组在一起,祝他人生日快乐,不想弄太复杂的东西,基于前面两篇文章是无法做到的。今天我们就来说说如何用这么少的词汇生成漂亮的词云。

1.准备

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

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

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南

输入以下命令安装我们所需要的依赖模块:

pip install wordcloud==1.5.0
pip install scipy==1.1.0
pip install multidict==4.5.2
pip install matplotlib==2.2.4
pip install fire==0.2.1
pip install numpy==1.16.4

看到 Successfully installed xxx 则说明安装成功。或公众号后台回复生日快乐可获得本文全部代码,然后进入文件夹,输入一行命令安装所有依赖:

pip install -r requirements.txt

如果你不想折腾代码,安装完依赖后,输入以下命令就可以生成你的词云:

python birthday.py 图片位置 对象姓名 

如:

python birthday.py example.png 宝典哥

2.编写代码

首先是引入词云对象,并初始化【生日快乐】和对方姓名:

    words = multidict.MultiDict()
    # 生日快乐和姓名的权重必须先初始化两个最大权重的
    words.add('生日快乐', 10)
    words.add(name, 12) 

细心的读者可能发现了,我们在这里用了MultiDict,这主要是因为wordcloud只允许接受【字典】数据结构,而Python内置的字典不允许重复值,所以我们只能引入multidict模块。

然后是插入新的生日快乐词云和对方姓名:

    # 随意插入新的词语
    for i in range(1000):
        words.add('生日', numpy.random.randint(1, 5))
        words.add('快乐', numpy.random.randint(1, 5))
        words.add(name, numpy.random.randint(1, 5)) 

然后我们需要对图片进行一些处理,现在网络上的图片很多都包含一些杂色,因此需要把这些杂色去掉:

def transform_format(val):
    # 用于去除杂色
    if val[0] > 245 and val[1] > 245 and val[2] > 245:
        val[0] = val[1] = val[2] = 255
        return val
    else:
        return val 

然后引入图片,去除杂色:

    # 设定图片
    bimg = imread(file)
    for color in range(len(bimg)):
        bimg[color] = list(map(transform_format, bimg[color]))

    wordcloud = WordCloud(
        background_color='white', mask=bimg,
        font_path='simhei.ttf'
    ).generate_from_frequencies(words) 

生成词云并渲染:

    # 生成词云
    bimgColors = ImageColorGenerator(bimg)

    # 渲染词云
    plt.axis("off")
    plt.imshow(wordcloud.recolor(color_func=bimgColors))
    plt.savefig(name+'.png')
    plt.show() 

完整代码如下:

# coding:utf-8
# Python 实用宝典
# 2020/03/23
import numpy
import multidict
import matplotlib.pyplot as plt
from scipy.misc import imread
from wordcloud import WordCloud, ImageColorGenerator

def transform_format(val):
    # 用于去除杂色
    if val[0] > 245 and val[1] > 245 and val[2] > 245:
        val[0] = val[1] = val[2] = 255
        return val
    else:
        return val

def gen_happy_birthday_cloud(file, name):
    words = multidict.MultiDict()
    # 生日快乐和姓名的权重必须先初始化两个最大权重的
    words.add('生日快乐', 10)
    words.add(name, 12)

    # 随意插入新的词语
    for i in range(1000):
        words.add('生日', numpy.random.randint(1, 5))
        words.add('快乐', numpy.random.randint(1, 5))
        words.add(name, numpy.random.randint(1, 5))

    # 设定图片
    bimg = imread(file)
    for color in range(len(bimg)):
        bimg[color] = list(map(transform_format, bimg[color]))

    wordcloud = WordCloud(
        background_color='white', mask=bimg,
        font_path='simhei.ttf'
    ).generate_from_frequencies(words)

    # 生成词云
    bimgColors = ImageColorGenerator(bimg)

    # 渲染词云
    plt.axis("off")
    plt.imshow(wordcloud.recolor(color_func=bimgColors))
    plt.savefig(name+'.png')
    plt.show()

# gen_happy_birthday_cloud('p2.png', '宝典哥')

3.整合一句运行

接下来,我们使用上次提到的 一行命令实现功能 将这个功能打包成输入命令就能运行的程序,比如:

python birthday.py 图片 宝典哥

在完整代码最后面加一行语句就行了:

import fire
fire.Fire(gen_happy_birthday_cloud) 

当然,别忘了还要import fire模块。最后实验一下:

python birthday.py example.png 宝典哥

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


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

Python 超方便超快速剪辑音乐

你没看错,Python剪辑音乐,只需要3行语句就能瞬间完成,比如我要剪辑33秒到1分10秒的音乐片段:

from pydub import AudioSegment
song = AudioSegment.from_mp3("end_of_time.mp3")
song[33,[object Object],1000].export('end_of_time_slice.mp3')

运行这个脚本,我们能瞬间完成剪辑:

https://pythondict-1252734158.file.myqcloud.com/home/www/pythondict/wp-content/uploads/2020/03/2020032019051734.mp3

对于Python而言,这个功能简直太基本了,难以言语的快。这段时间里,你的Adobe Audition 可能还没成功打开 。下面再介绍点更高级的玩法。

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

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

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南

输入以下命令安装我们所需要的依赖模块:

pip install pydub

看到 Successfully installed xxx 则说明安装成功。你还需要安装ffmpeg, 这个网络上有许多教程,这里可以看我们上次的提取音乐高潮文章。公众号后台回复音乐剪辑可获得本文全部代码。

1.音量变化

我们还可以修改上面剪辑的这段音乐的入场音量大小和退场音量大小:

from pydub import AudioSegment

# 1秒=1000毫秒
SECOND = 1000
# 导入音乐
song = AudioSegment.from_mp3("end_of_time.mp3")

# 取33秒到70秒间的片段
song = song[33*SECOND:70*SECOND]

# 入场部分提高6分贝, 退场部分减少5分贝
ten_seconds = 10 * SECOND
last_five_seconds = -5 * SECOND
beginning = song[:ten_seconds] + 6
ending = song[last_five_seconds:] - 5

# 形成新片段
new_song = beginning + song[ten_seconds:last_five_seconds] + ending

# 导出音乐
new_song.export('end_of_time_slice.mp3') 

听听看:

https://pythondict-1252734158.file.myqcloud.com/home/www/pythondict/wp-content/uploads/2020/03/2020032019235655.mp3

效果和预期的一致,想想看,如果这个你用专业的音乐编辑器来做,得画段切片、设置音量,然后保存,细思极恐,太费时间了!Python可能在你打开软件的这段时间里就完成了。

2.重复片段

如何重复我们开头说到的33秒到70秒这段音乐片段?可简单了,你只要会做乘法就行:

from pydub import AudioSegment
song = AudioSegment.from_mp3("end_of_time.mp3")
(song[33*1000:63*1000])*2.export('end_of_time_slice.mp3')  
https://pythondict-1252734158.file.myqcloud.com/home/www/pythondict/wp-content/uploads/2020/03/2020032019313832.mp3

没错,在pydub中,片段和数量之间的运算里加法调音量,乘法调长度,你记住了吗?

3.渐进渐出

有时候我们的耳朵需要时间来适应音量的变化,尤其是在看短视频的时候,音量忽大忽小实在是太没有用户体验了,这时候渐进渐出的剪辑就尤为关键:

from pydub import AudioSegment

# 导入音乐
song = AudioSegment.from_mp3("end_of_time.mp3")

# 提取片段
song = song[33*1000:70*1000]

# 渐进渐出
awesome = song.fade_in(5000).fade_out(3000)

# 导出音乐  
awesome.export('end_of_time_fade.mp3') 
https://pythondict-1252734158.file.myqcloud.com/home/www/pythondict/wp-content/uploads/2020/03/2020032019420140.mp3

4.反转音乐

这可能是最有趣和最可能产生特别效果的操作,它会让你完全不认得这首歌:

from pydub import AudioSegment

# 导入音乐
song = AudioSegment.from_mp3("end_of_time.mp3")[33*1000:70*1000]

# 翻转音乐
backwards = song.reverse()

# 导出音乐
backwards.export("end_of_time_reverse.mp3") 
https://pythondict-1252734158.file.myqcloud.com/home/www/pythondict/wp-content/uploads/2020/03/2020032019484564.mp3

当然,反转音乐后会变得惨不忍睹,这也很正常,原来的“正向规律 ” 倒转后,音调节奏也变了(不排除有特殊口味的人喜欢这种感觉呢)。

把这首歌折腾了这么久,还是得把原曲放给大家听听的。是 K-391 / Alan Walker / Ahrix 的 End of Time(由于网站服务器有限,音质不会太好,建议大家到专业音乐播放器里搜索聆听) :

https://pythondict-1252734158.file.myqcloud.com/home/www/pythondict/wp-content/uploads/2020/03/2020032020554110.mp3

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

音乐相关教程:

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

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

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

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

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

Python 超方便超快速剪辑音乐

Python 提取音乐频谱并可视化


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

Python 编程的最好搭档—VSCode 详细指南

刚学Python的同学可能会觉得每次写Python的时候都得打开Cmd有点烦躁,直接上手Pycharm的同学可能会觉得这软件太笨重了,晦涩难用。那么有没有省去打开CMD的步骤,又能弥补Pycharm笨重的特点的软件呢?——答案是VSCode.

诞生于2015年的VSCode编辑器,现在可以说是目前最强的编辑器之一,在微软的背书下,比各位历史悠久的老大哥成长快得多,不到5年的时间里便坐到了市场占有率第一的位置。这么短的时间里,它是怎么成功的?答案是:简单,可扩展性强

编辑器,简单很重要。还记得我多年前第一次用Vim编辑器时搜索的第一个问题:怎么退出Vim?一个工具的学习曲线会直接影响该工具的受众数量,对于编辑器而言尤其如此。任何使用起来复杂的东西最终都会被更容易使用的东西替代掉,不过Vim有其在运维方面的独特优势,所以它暂时是不可替代的。

Vim的不可替代是在服务器层面,对于我们在桌面端编程而言,越简单好用的编辑器越好,不要搞骚操作,最终烦的是自己。这就是为什么VSCode越来越火爆,而且它不仅简单易用,还能覆盖几乎所有语言的编写,如果我有一个小项目需要涉及到前后端所有代码,用VSCode一个编辑器就能解决了,而不是前端切Webstorm,后端切Pycharm.

好了,接下来就让我们来上手VSCode.

1.安装

毕竟是微软大爷的产品,安装VSCode你几乎不会遇到问题,打开:
https://code.visualstudio.com/

选择适合自己系统的版本下载安装,一路默认即可:

2.使用

如果你看不惯英文版的编辑器,下面教你怎么装中文插件:

2.1 中文插件

1. 点击View – Command Palette (或输入 Ctrl + shift + P) 进入命令面板.

2. 输入 configure language, 选择Configure Display Language (配置显示语言)。

3. 检查有没有zh-cn的选项,如果有,直接选择zh-cn替换。然后按照提示重启vscode就能看到界面变回中文了。

如果没有zh-cn的选项,则选择install additional languages (添加其他语言选项),左边会弹出扩展窗口,扩展窗口找到中文简体,点击 install 安装,重复 第 1, 2 步骤 选择中文即可。

2.2 使用终端(Terminal)

这是用VSCode编写Python最核心的地方,你不用打开丑丑的CMD,直接在VSCode中就可以运行Python。

点击 【查看—终端 】 或直接快捷键 【Ctrl + ` 】 打开终端,会在下方产生一个CMD控制台:

在这里你做的最新修改都可以直接 python xx.py 运行:

不过要注意一下当前的文件夹是否和Python脚本文件处于同一个目录,如果不在同一个目录则要cd进去。

2.3 一键运行

很多同学都想一键运行Python,而非以命令的形式运行,这时候就需要Python扩展了,打开扩展页,输入Python,选择第一个进行安装 install 即可:

重新加载VSCode生效,在这后编辑完代码按F5即可运行(如果你不需要输入参数的话),初次运行可能会让你选环境,选择Python即可。

默认按F5后进入DEBUG模式,需要再按一次F5程序才会运行,如果要按F5马上运行需要将launch.json文件的 “stopOnEntry”: true,改为 “stopOnEntry”: false。 launch.json文件在设置中可以找到,如下图所示:

3.其他扩展

3.1 语法提示,配置flake8

写代码没有语法提示,其实是很难受的一件事情,IDE直接帮你做了这件事,不过VSCode需要你稍微配置一下:

1. 打开终端,输入 pip install flake8 安装flake8,我已经装过了,你的提示应该跟我的不一样:

2. 在settings.json文件中输入”python.linting.flake8Enabled”: true

3.2 自动格式化代码

Yapf是谷歌开源的一个用于格式化Python代码的工具,可以一键美化代码。支持两种规范:PEP8和Google Style,下面的步骤和3.1类似的就不再补图啦:

1. 打开终端

2. 输入 “pip install yapf” 安装yapf

3. 在settings.json文件中输入”python.formatting.provider”: “yapf”

4. 用一个看看, 按下快捷键 Alt+Shift+F 即可自动格式化代码。

3.3 文件及文件夹图标

默认的VSCode图标没有那么详细,只有几个重要文件类型的图标提示,可以安装vscode-icons解决,Mac的有vscode-icons-mac版本。如图所示:

之后的文件显示就详细多了:

3.4 生成注释格式

这个是我强烈推荐的插件,搜索docstring,目前排在第四位,由Nils Werner开发的autoDocstring,优秀的代表:

之后,你只需要在函数名后面输入三个双引号然后回车,即可生成docstring注释:

按Tab可以直接切换需要输入的位置,而不用鼠标去点击,加快了注释效率。不过,我有点不喜欢它comment出现的位置直接在三个双引号的后面,有点不太雅观,可能这就是东西方美感的差异?

3.5 更强大的自动补全

搜索Kite,安装下面这个插件:

然后需要安装一个叫 Kite Engine 的软件,直接前往官网下载对应的系统版本即可:

安装完成后,你可以不注册,一路下一步即可,然后返回VScode体验一下它的强大:

具有丝毫不逊色于Pycharm的代码补全功能。

VsCode系列文章:

Python 使用VS Code进行调试

VSCode 设置中文

Python 编程的最好搭档—VSCode 详细指南

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


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

这些 PyCharm 高效操作你知道吗?

熟话说,工欲善其事,必先利其器,PyCharm 作为最好用的 IDE 工具,有着各种各样的骚操作,这是高级开发工程师必须熟悉的基本技能。

pycharm 小技巧是很多的,今天就给大家推荐一些看似简单确非常高效的操作。让你脱离 CV 工程师走向更高一级台阶。

0x01 更换背景图

哈,每天的工作就是面对一堆代码有时候也是会觉得挺烦心的是吧,特别是找 bug 找好久依旧定位不到问题的时候,这时候就体现出男女搭配干活不累的好处了,通过更换 IDE 的背景图让你的程序员鼓励师每天不重样。

设置路径如下:Preferences -> Appearance -> Background Image

至于去哪里找程序员鼓励师的高清图片,我相信你们知道的肯定比我多,对吧。

0x02 打开最近打开的文件

有时候打开的文件实在是太多了,tab 栏就会被占满,想定位到自己想要的文件还是很麻烦的,这时候这个快捷键操作就派上用场了,「command + E」,可以直接打开自己最近编辑过的文件,方便快捷,按两下有惊喜哦。

0x03 查看源码

有时候代码一多,看起来很乱,根本不晓得这个变量是在哪里定义的,用来干嘛的,这时候就可以通过「command + B」来快速定位到定义变量的位置,亦或者在将光标定位到函数位置,按「command + B」可以直达函数的内部实现,看开源代码时特别方便。

0x04 开启新的一行

写程序我们经常需要换行,这都是常规操作,如果你还是先将光标定位到行尾或者行首,之后按 Enter 键来换行,效率就有点低了。如论你的光标在一行的哪个位置,都可以通过「shift enter」在本行后面开启新的一行,通过「command + option + enter」在本行前面开启新的一行。

0x05 快速返回

这个我一般会搭配「command + E」来一起使用,如果你想去的文件是刚编辑过的,那么可以直接使用 「command + option + 方向箭」来快速跳转到刚才编辑的位置,不仅仅局限于不同文件哦,在同一个文件内也是可以的。

0x06 查找类/文件

当你想快速搜索一个类或者文件时,可以双击 shift,直接输入你要搜索的内容即可。同时如果你确定搜索的是类的话,那么可以通过「command + o」来开启精准搜索,如果搜索的是文件,那么可以通过「command + shift + o」精准搜索。

0x07 自动清除没有引用的包

有时候看到那些变灰色的 import 很是烦人,难道只能一个一个删除么,当然不是,直接 「command + option + o」即可一键清除。

总结

今天给大家普及了一些 PyCharm 的高效操作,希望对小伙伴们的工作和学习有所帮助。

一行命令实现功能?Google工程师是这样做的

最近想尝试将一些做过的小工具打包在一起,合成Python实用宝典的常用工具盒以分享给大家,这个工具盒功能非常强大,包括但不限于:一行命令提取音乐的高潮部分、一行命令人脸识别、一行命令分类文本…等等,敬请期待!

不过,做这样的工具盒其实原理不复杂,就是将用户需要用到的自定义参数通过命令直接传入Python中运行,用户不需要管代码、也不需要理解代码、直接使用。不过,做工具盒的时候却发现这样的问题,现在常用的命令行传参工具实在是不够用。

比如下面这个argparse的简单例子, 它使得Python命令在运行的时候可以接受一个 -n 或者 –number 的数字,然后将该数字传入到Calculator的double中进行计算,以一行命令实现功能:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import argparse

class Calculator(object):
    """
      简单算算数.
    """

    def double(self, number):
        print(2 * number)

def main():
    parse = argparse.ArgumentParser()
    parse.add_argument("-n", "--number", type=float, help="用于传入number的值")
    args = parse.parse_args()
    Calculator().double(args.number)

if __name__ == '__main__':
    main()

使用:

$ python 1.py –number 2
4.0

看起来简单,但我还是嫌他太啰嗦了,如果我有许多个方法,岂不是要定义许多个参数?如果我有很多类方法,岂不是都得调用一遍?Google的工程师和我有一样的想法:简化它!他们开发了一个叫Fire的模块。这个模块完美地解决了我的问题,简化了不少代码,请往下看。

1.准备

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

安装完Python后,Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal).

进入我们刚下载好的文件夹,输入以下命令安装所需要的模块:

pip install fire 

看到Successfully installed fire 则说明安装成功。

2.练练手

这个包用起来可比argparse舒服太多了,比如我们将文章开头说的那个例子简化一下:

import fire


class Calculator(object):
    """
      简单算算数.
    """

    def double(self, number):
        print(2 * number)

if __name__ == '__main__':
    fire.Fire(Calculator)

$ python 1.py double 10
20

多简洁啊!你理解了吗?它能够将参数作为Fire指定对象的目标函数,而后的数据则是传入该函数的值,最后计算得到结果并输出。

也就是说,无论你有多少种“工具 ” ,都可以将它的调用函数放到一个类中实现以函数名作为参数的调用方式。这样,我们能节省很多parse.add_argument的重复性操作。

3.更简洁的玩法

什么,居然还有更简洁的玩法?小编可不要吹牛不打草稿啊。我那么善良,像是会吹牛的人吗:

import fire
english = 'Hello World'
chinese = '你好,世界'
fire.Fire() 
python 1.py english
Hello World
python 1.py chinese
你好,世界

也就是说,它可以用来直接调用变量,如果你的函数生成结果最后都在变量上的话,可以不带参数直接获取。

它也可以直接用在函数上,比如来对数字排个序:

import fire

def order_by_value(*items):
    """
    根据数字大小排序
    """
    sorted_items = sorted(items, key=lambda item: item)
    return sorted_items

if __name__ == '__main__':
    fire.Fire(order_by_value)

$ python 1.py 20 30 1
1
20
30

太舒服了,用这个工具我一天能做十个工具(禁止套娃),也希望大家把它应用在自己经常需要使用的工具上,并在留言区里分享出你的开源项目,一行命令得到想要的结果,难道不香吗?

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


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

Python 免登录微博数据爬虫(仅研究使用)

微博数据是非常有价值的数据,这些数据可以用作我们进行一些系统开发时的数据源, 比如前段时间发过的:Python 短文本识别个体是否有自杀倾向,在此文中,我们使用微博绝望树洞的数据,利用SVM做了一个简单的自杀倾向识别模型。

当然,微博数据的应用还不仅如此,如果你大胆详细,大胆猜测,将会有许多可以利用这些数据进行研究的机会。不过, 技术是把双刃剑,有好有坏,我不希望各位拿着这个爬虫去做一些违反道德、法律的事情,应用于好的事务,才是技术诞生的初衷。

本文讲的是以用户为单位的爬虫,如果你希望能够定制自己需要的爬虫,请看这篇教程:Python 爬取微博树洞详细教程

1.准备

其实免登录的原理很简单,就是通过手机版的微博绕过其登录验证,大家可以用手机网页打开这个网址,你会发现其实大部分微博在你不登录的情况下都是可见的:
https://m.weibo.cn/u/2075686772

可见即可爬。因此,我们只需要调用这个微博数据的json接口即可获取到数据。不过我们不要一上来就直接撸代码,要善于利用Python开源社区的特点,上网上找相关的现成的成熟轮子,而不是自己动手做一个半成熟版,这样能节省许多时间。

经过一番搜索,我找到了这个免Cookie版的微博爬虫,dataabc开发的:
https://github.com/dataabc/weibo-crawler

其代码思路与我想的差不多,只需要调用json的数据接口即可获取数据:

下载该开源项目,可以上该网页直接Download, 也可以使用git:

git clone https://github.com/dataabc/weibo-crawler.git

如果你两个都不会,没关系,Python实用宝典后台回复 微博采集工具 即可下载。

2.配置采集参数

在开始采集数据前,你需要确保电脑上已经安装了Python,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

安装完Python后,Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal).

进入我们刚下载好的文件夹,输入以下命令安装所需要的模块:

pip install -r requirements.txt

看到许多个 Successfully installed xxx 则说明安装成功。

2.1 找到你需要爬的用户ID

点开你希望爬取的用户主页,然后查看此时的url,你会发现有一串数字在链接中,这个就是我们要用到的userID, 复制即可。

如果不是一串数字,可以点开任一条微博评论的页面,这时候上面的链接一定会有串数字,如果还是没有,就上手机版的微博页面找,这种时候就需要耐心和多尝试了。

2.2 修改config.json

获得用户的userID后,需要将ID写入到config.json的user_id_list数组中,如图所示:

其他参数如:
filter:控制爬取范围,值为1代表爬取全部原创微博,值为0代表爬取全部微博(原创+转发)
since_date: 爬取该日期之后的时间
write_mode: 写入的文件格式

下面的分别是:是否下载原创微博图片、是否下载转发微博图片、是否下载原创视频、是否下载转发的视频,如果为1则是,为0则为否。再往后如果你需要写入数据库,还可以配置MySQL或MongoDB的连接参数。

3.开始采集

配置好了以后,采集就很简单了,你只需要用CMD或Terminal进入该文件夹,输入:

python weibo.py

即可进行数据采集。采集结束后,如果你设定的是保存为csv文件,则会在当前文件夹下的weibo文件夹里产生一个名为该微博用户名的数字.csv文件,如:

weibo\阿森纳足球俱乐部\2075686772.csv

这个文件里就是你想要的数据。

该开源模块设计的功能其实非常完善,你看看下面这个列表就知道了。

真的太贴心辣,必须得感谢这位开源作者,如果你喜欢的话,记得上去他的仓库给他点个star哦!

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


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

你的10W块放哪里能赚最多钱?

现在许多人都想学会理财并进行适当的投资,从而增加“睡后收入”,迈向财务自由。说到投资,最经典的当然是股市了,但股市对于大部分人而言是烫手山芋,无法从中获得稳定的收益。因此,对于大部分人而言,最好的投资产品还是基金。

​基金分为好几种,因此收益的计算公式也分许多种,我们这里介绍三种最常见的收益计算方式,从而找到收益最高的那种基金:

第一种是七日年化收益。最常见的是余某宝和一些理财基金。

第二种是每日万份收益。许多产品可能会用它作为指标。

第三种是定投基金。大多是一些股票投资组合基金,比理财基金风险高,但也是最值得投资的,请往后看。

1.余某宝

我们先尝试利用七日年化收益算算余某宝现在的收益,这可是这些年的明星产品啊,今天2020年2月27日的七日年化收益率为2.306%:

觉得我穷的就赞赏一个吧,嘻嘻

七日年化收益的计算方法是这样的:
当日收益 = 金额 X 7日年化 ÷ 360。

Python 计算代码计算最终收益:

假设我们投入10W元,放180天:

>> profit_7_days(100000, 0.023, 180)
(101156.60076153441, 1156.6007615344133)

最终利润为1156元,太少了,这个利润绝对跑不过CPI,要知道,2020年1月份CPI同比上涨5.4%哦。当然,还是比放银行活期好得多。

2.活期理财

市面上还有许多保守型活期/定期理财,我们选最高利率的一种来试一下,这一个采用万份收益来计算:

万份收益的计算公式如下:
当日收益 = 金额 ÷ 10000 X 当日万份收益。

Python代码如下:

假设我们投入10W元,放180天:

>> profit_10_thousand(100000, 1.0485, 180)
(101905.12125702304, 1905.1212570230418)

哎,比余额宝好不了多少嘛,那我还不如继续用余额宝。

3.定投基金

定投基金比较有意思,是我们今天的主角。它属于“保守版”的​高风险投资,因为分散投资能够有效规避风险,面对股市无常的变化,定投的基金并不会产生太大的影响,所以相对安全,收益也相对稳定。

它的计算公式如下:

M=a(1+b)[-1+(1+b)^n]/b

其中:
1. M表示定投n年后总金额(包括收益和本金);
2. a表示每年投入的金额(比如每月投入1200元,a=14400元);
3. b表示年收益率(比如年收益为50%,其b=0.5);
4. ^n表示n次方。

比如这一款基金,最近三年涨跌幅分别为:69.07%, 51.3%, 66.3%. 平均下来年涨跌幅为62%,非常可怕:

不过今年由于疫情影响,估计最终收益会低许多,我们算40%的年收益率吧。

Python代码如下:

假设我们每个月投一万块钱,持续一年:

>> profit_investment_plan(10000, 0.40, 1)
(167999.99999999994, 47999.99999999994, 0.8117274492919773)

没错,最终赚了约4.8W,其第一年真实的年化收益率为 81%,如果第一年结束取出来,其总利率达到了 47999/167999 = 28.5%.

原来,基金定投才是投资的最好姿势啊!不过,收益越高,风险越高,虽然基金定投能够很好地避免股市波动,但是它还是存在不小的风险的。

如果想获得稳健的收益,个人建议你需要将钱放在不同的篮子里以规避风险,比如每月收入的30%定投基金,20%理财基金,10%指数型基金,20%债券基金,20%活期基金(如余额宝之类)。当然,最适合的搭配要根据个人收入进行组合。

市面上有许多可靠的基金定投,只要选择那种最近几年没有负收益的,遇到市场形式较好的时候,基本上收益都能跑得过CPI,微X的某财通里就有很多,为了避免广告嫌疑,这里就不再多介绍啦。本文全部的计算代码,可在公众号后台回复 基金投资计算 获得。

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


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