分类目录归档:工具

编程利器!有道词典命令行快速翻译

在编程时经常会遇到需要将中文词汇翻译成英文的情况。

比如变量名的定义、取一个合适的函数名等情况。

遇到不会翻译的词汇时,往往都需要借助有道词典等翻译工具。

但无论是下载客户端、还是打开翻译网站页面,都感觉非常麻烦。

现在,有一个小伙伴帮我们制作了一个在命令行输入词汇,就能即时翻译的工具,实在非常方便!

比如翻译hello world, 你只需要在终端输入:

youdao hello world

项目地址是:WangXin93/youdao_dict

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda

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

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

pip install youdao_dict

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

2.使用

当你遇到不会翻译的词汇,只需要在下方编辑器,轻轻敲击:

youdao 你不会翻译的词汇

比如说,“微醺”的英文:

当然,也可以英文翻译为中文,比如standalone:

3.源码分析

这个模块的原理非常简单,就是调用了有道翻译网页版的API,这个API拥有自动检测语言的功能:

然后再根据页面HTML结构及其分布,爬取不同释义:

Python就是一门能用如此简单的代码,给你带来巨大方便的语言,体会到了吗?

如果你有类似的需求,也可以学着做一个类似地、能够提高生活效率的第三方库,上传到GitHub,然后在【Python实用宝典】公众号后台留言,我会帮你宣传并分享给大家。

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

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

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


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

Python moviepy 一个快速视频剪辑编辑神器

你知道吗,用moviepy一行代码就能够快速剪辑视频中某个区间的片段:

clip = VideoFileClip("videoplayback.mp4").subclip(50,60)

这一段代码,能够在3秒内将videoplayback.mp4的50秒-60秒的视频片段提取出来,非常方便。

https://pythondict-1252734158.file.myqcloud.com/home/www/pythondict/wp-content/uploads/2020/06/2020062216500711.webm

不仅如此,moviepy还支持添加字幕、调整音量、片段链接等功能。下面看看详细的操作方法。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda

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

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

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

pip install moviepy

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

2.视频剪辑

剪辑个视频,多大点事,比起下载PR,用Python 写3行代码,3秒剪辑不香吗?

from moviepy.editor import *

# 剪辑50-60秒的音乐 00:00:50 - 00:00:60
video = CompositeVideoClip([VideoFileClip("videoplayback.mp4").subclip(50,60)])

# 写入剪辑完成的音乐
video.write_videofile("done.mp4")

3.视频拼接

“哦?Python?哼,那你肯定很难进行拼接工作吧,PR多方便,拖拽即可完成拼接。”

那你可真是太小看Python了,moviepy几行代码随随便便就能拼接许多片段:

from moviepy.editor import VideoFileClip, concatenate_videoclips
clip1 = VideoFileClip("myvideo.mp4")

# 结合剪辑,你甚至能够完全自动化剪辑拼接视频的操作
clip2 = VideoFileClip("myvideo2.mp4").subclip(50,60)

clip3 = VideoFileClip("myvideo3.mp4")
final_clip = concatenate_videoclips([clip1,clip2,clip3])
final_clip.write_videofile("my_concatenation.mp4")

结合剪辑,你甚至能够完全自动化剪辑拼接视频的操作。

4.逐帧变化

“那你能完成针对每一帧图像的快速图像处理吗?PR可是做得到的哦”

我擦,你简直是在侮辱Python,教你如何反转视频每一帧的绿色和蓝色通道:

from moviepy.editor import VideoFileClip
my_clip = VideoFileClip("videoplayback.mp4")

def scroll(get_frame, t):
    """
    处理每一帧图像
    """
    frame = get_frame(t)
    frame_region = frame[:,:,[0,2,1]]
    return frame_region

modifiedClip = my_clip.fl(scroll)
modifiedClip.write_videofile("test.mp4")

5.导出GIF

哇,听起来好像挺牛逼的,那用来导出到GIF吗

当然可以:

from moviepy.editor import *

# 剪辑50-60秒的音乐 00:00:50 - 00:00:60
video = CompositeVideoClip([VideoFileClip("videoplayback.mp4").subclip(50,60)])

my_clip.write_gif('test.gif', fps=12)

扫描下方二维码,可以加入我们的Python互助群哦:

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


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

Python 多种音乐格式转换(批量)实战教程

Pydub是一个基于ffmpeg的Python音频处理模块,封装了许多ffmpeg底层接口,因此用它来做音乐歌曲文件格式转换会非常方便,如果你阅读过我们之前的文章:Python 超方便超快速剪辑音乐 你就知道它有多么强大了。

今天给大家介绍它的音乐文件格式转换功能,几乎支持所有音乐音频格式,非常强大。

1.安装

安装Pydub前需要先安装ffmpeg:

Mac (打开终端(Terminal), 用 homebrew 安装):

brew install ffmpeg --with-libvorbis --with-sdl2 --with-theora

Linux:

apt-get install ffmpeg libavcodec-extra

Windows:

1. 进入 http://ffmpeg.org/download.html#build-windows,点击 windows 对应的图标,进入下载界面点击 download 下载按钮,
2. 解压下载好的zip文件到指定目录
3. 将解压后的文件目录中 bin 目录(包含 ffmpeg.exe )添加进 path 环境变量中

上述ffmpeg安装成功后就可以打开命令提示符(cmd),安装pydub:

pip install pydub

1.mp3转wav或其他格式

将单个mp3音频文件转化为wav音频格式:

from pydub import AudioSegment
def trans_mp3_to_wav(filepath):
    """
    将mp3文件转化为wav格式

    Args:
        filepath (str): 文件路径
    """
    song = AudioSegment.from_mp3(filepath)
    filename = filepath.split(".")[0]
    song.export(f"{filename}.wav", format="wav")

可以继续封装该函数,将单个mp3文件转化为任意其他音乐音频格式:

from pydub import AudioSegment
def trans_mp3_to_any_audio(filepath, audio_type):
    """
    将mp3文件转化为任意音频文件格式

    Args:
        filepath (str): 文件路径
        audio_type(str): 文件格式
    """

    song = AudioSegment.from_mp3(filepath)
    filename = filepath.split(".")[0]
    song.export(f"{filename}.{audio_type}", format=f"{audio_type}")

如ogg格式:

trans_mp3_to_any_audio("Alone.mp3", "ogg")

只要是ffmpeg支持的音乐音频格式,它都可以转换,支持的格式长达几十个,我简单列一些:

wavavimp4flv
oggflacapemp2
aiffvocau

2.更加通用的转换函数

刚刚是mp3转任意音频格式,我希望把它写成任意音频格式转任意音频格式:

from pydub import AudioSegment
def trans_any_audio_types(filepath, input_audio_type, output_audio_type):
    """
    将任意音频文件格式转化为任意音频文件格式

    Args:
        filepath (str): 文件路径
        input_audio_type(str): 输入音频文件格式
        output_audio_type(str): 输出音频文件格式
    """

    song = AudioSegment.from_file(filepath, input_audio_type)
    filename = filepath.split(".")[0]
    song.export(f"{filename}.{output_audio_type}", format=f"{output_audio_type}")

比如将ogg音乐音频格式转化为flv音乐音频格式:

trans_any_audio_types("Alone.ogg", "ogg", "flv")

或者MP4格式,总之,一般而言你需要的格式它都能满足。

trans_any_audio_types("Alone.ogg", "ogg", "mp4")

3.批量转化音频格式

现在,尝试将一个文件夹下的所有非mp3音频格式的文件转化为mp3音频格式:

def trans_all_file(files_path, target="mp3"):
    """
    批量转化音频音乐格式

    Args:
        files_path (str): 文件夹路径
        target (str, optional): 目标音乐格式. Defaults to "mp3".
    """

    for filepath in os.listdir(files_path):
        # 路径处理
        modpath = os.path.dirname(os.path.abspath(sys.argv[0]))
        datapath = os.path.join(modpath, files_path + filepath)

        # 分割为文件名字和后缀并载入文件
        input_audio = os.path.splitext(datapath)
        song = AudioSegment.from_file(datapath, input_audio[-1].split(".")[-1])

        # 导出
        song.export(f"{input_audio[0]}.{target}", format=target)

只要输入文件夹名称,即可全部转化该文件夹下的音乐文件格式为mp3格式:

trans_all_file("F:\\push\\20200607\\music\\")

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


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

Python 开发任天堂Switch程序??奉上教程!

用Python开发Switch程序,在你的Switch上运行Python代码,你需要用到一个名为PyNX的开源工具,操作流程如下:

1.用读卡器将SD卡插入开发设备(电脑or笔记本)中

2.将PyNX的Zip版本的内容复制到SD卡的/switch目录下

3.编辑main.py文件, 将你的代码逻辑写入该文件中

4.将SD卡插入Switch

5.在Homebrew菜单中运行PyNX

听起来挺简单,不过其中第5步的Homebrew菜单你需要通过特殊的方法来绕过Switch的限制,这里不过多描述,可以看这篇文章:
https://switch.homebrew.guide/

1.准备

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

如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda

当然,我更推荐大家用VSCode编辑器,写代码可惬意了:Python 编程的最好搭档—VSCode 详细指南。

按照流程,接下来你需要下载源代码的Zip版本:

https://github.com/nx-python/PyNX/archive/master.zip

无法下载请在Python实用宝典后台回复: Switch 获取​网盘链接。​

解压后将其复制到SD卡的/switch目录下。

2.编写简单的备份工具

接下来就可以编写该源代码中的main.py文件了,这个就是我们DIY程序的主要代码。

首先,需要导入一些库以开始在我们的自制应用程序上工作,主要用到了作者的nx包。此外,我们还想向用户显示选择菜单,因此我们也应该导入AnsiMenu:

import nx
from nx.utils import AnsiMenu

接下来,创建常量来存储《塞尔达传说:狂野的呼吸》和《超级马里奥·奥德赛》的名称ID:

# title IDs are hexadecimal numbers
BOTW_TITLE_ID = 0x01007EF00011E000
SMO_TITLE_ID = 0x0100000000010000

创建两个列表,将其用于菜单栏。用户可以选择的标题名称在中title_nametitle_ids用于以相同顺序存储游戏ID:

title_names = ["The Legend of Zelda - Breath of the Wild", "Super Mario Odyssey"]
title_ids = [BOTW_TITLE_ID, SMO_TITLE_ID]

设置完列表后就可以使用AnsiMenu实用程序类创建菜单。此菜单将允许用户选择将保存数据备份的游戏名称:

select_title_menu = AnsiMenu(title_names)

每个Python程序的主要执行流程最好进行如下包装:

if __name__ == '__main__':

现在可以使用其query方法呈现查询菜单:

selected_index = select_title_menu.query()

query方法返回用户选择的索引(index),该索引现在存储在selected_index变量中。由于我们先前创建的两个列表的顺序相等,因此我们可以使用索引从title_ids列表中获取游戏ID :

selected_title_id = title_ids[selected_index]

selected_title_id现在包含所选的游戏ID。现在,我们可以使用此游戏ID创建一个功能Title对象:

selected_title = nx.titles[selected_title_id]

现在,我们需要备份所选择的游戏数据。为此,我们需要挂载游戏的savedata。这需要通过selected_title对象的savedata来完成:

with selected_title.savedata as savedata:
    savedata.backup()

这将创建数据备份/backups/savedata/{title_id}/。当然你还可以提供自己的备份路径,如下所示:

with selected_title.savedata as savedata:
    savedata.backup('/savedata_backups/{}/'.format(title_names[selected_index]))

完整代码如下:

import nx
from nx.utils import AnsiMenu


# title IDs are hexadecimal numbers
BOTW_TITLE_ID = 0x01007EF00011E000
SMO_TITLE_ID = 0x0100000000010000
title_names = ["The Legend of Zelda - Breath of the Wild", "Super Mario Odyssey"]
title_ids = [BOTW_TITLE_ID, SMO_TITLE_ID]

select_title_menu = AnsiMenu(title_names)

if __name__ == '__main__':
    selected_title = select_title_menu.query()

    selected_title = title_ids[selected_title]
    selected_title = nx.titles[selected_title]

    with selected_title.savedata as savedata:
        savedata.backup('/savedata_backups/{}/'.format(title_names[selected_index]))

恭喜,你已使用Python创建了第一个Switch自制程序!

文章增删改自作者的tutorial, 感谢他:
https://nx-python.readthedocs.io/en/latest/getting_started/tutorial.html

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


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

Python 任意系统找回wifi密码

经常遇到这样一种情况:家里来了客人,问你要wifi密码。

尴尬的是,你忘了wifi密码。

不过你的其他设备已经连接过WiFi,这时候你怎么利用这些设备重新获取WiFi密码呢?

有一种方法是登录路由器管理页面,但是如果你连路由器密码也忘了,那就非常尴尬。

还有一种方法是通过iCloud钥匙串,但这个方法非常麻烦,需要通过备份获取。

今天告诉大家一个最简单的方法:通过Python来找回当前使用的wifi密码。

1.准备

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

如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda.

此外,你需要一台已经连接了Wifi的电脑,macOS和windows都可以。

2.原理解析

实质上,获取密码是使用命令的方式,比如Windows下获取WiFi密码:

netsh wlan show profile name=Wifi名称 key=clear | findstr 关键内容

macOS下获取WiFi密码:

sudo security find-generic-password -l wifi名称 -D 'AirPort network password' -w

Linux下获取WiFi密码:

sudo cat /etc/NetworkManager/system-connections/wifi名称| grep psk=

通过这三种命令就可以获取得到当前使用的WiFi名称。

3.代码编写

首先封装命令:

def fetch_password(system, wifi_name):
    """
    用于获取命令

    Arguments:
        system {str} -- 系统类型
        wifi_name {str} -- wifi名

    Returns:
        str -- 密码

    Author: Python 实用宝典
    """

    if system == "linux":
        command = f"sudo cat /etc/NetworkManager/system-connections/{wifi_name}| grep psk="
    elif system == "macos":
        command = f"sudo security find-generic-password -l{wifi_name} -D 'AirPort network password' -w"
    elif system == "windows":
        command = f"netsh wlan show profile name={wifi_name} key=clear | findstr 关键内容"
    result = fetch_result(system, command)
    return result

其中,fetch_result 用于执行命令获得数据:

def fetch_result(system, command):
    """
    用于执行命令获取结果

    Arguments:
        system {str} -- 系统类型
        command {str} -- 命令

    Returns:
        str -- 解码后的密码

    Author: Python 实用宝典
    """
    result, _ = subprocess.Popen(
        command, stdout=subprocess.PIPE, shell=True
    ).communicate()
    return decode_result(system, result)

decode_result用于解码命令:

def decode_result(system, result):
    """
    解码密码

    Arguments:
        system {str} -- [系统类型]
        result {str} -- [输出]

    Returns:
        [str] -- [解码后的密码]
        
    Author: Python 实用宝典
    """

    if system == "windows":
        # cmd命令得到的结果是bytes型,需要decode
        result = result.decode("gb2312")
    result = result.strip('\r|\n')
    if result != "":
        result = result.replace(" ", "")
        result = result[result.find(":") + 1:]
    result = result[result.find("=") + 1:]
    return result

大功告成,你只需要执行:

print(fetch_password('系统类型', 'wifi名称'))

即可获得密码。

如果你的电脑连接过其他wifi,并且没有删除过相关的网络配置,实际上也可以使用该函数获取其他wifi的密码。以上就是完整源代码,如果你懒得再打一遍,可访问github链接获取:
https://github.com/Ckend/pythondict-tools/tree/master/2.wifi-password

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

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

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

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

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

Python 8行代码模拟鼠标自动删除微信收藏

上回我们提到了用 pyuserinput 进行模拟键盘鼠标操作,结果发现很多同学都回复无法安装成功,即便安装成功了还是存在很多问题。确实,pyuserinput存在不少问题,包括其安装的pymouse可能会有DLL加载失败的情况。因此,今天我们将换一个模块进行模拟鼠标操作,那就是pyautogui.

PyAutoGUI和PyUserInput有很大的不同,在windows系统上,它并不需要win32扩展,而是采用ctypes来调用动态链接库函数的功能模块的方式,因此安装起来非常方便!

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda

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

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

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

pip install pyautogui

看到 Successfully installed xxx 则说明安装成功。安装过程中如果提示缺少某些模块,pip install 缺少的模块即可。

2.基础使用

其实它与pymouse和pykeyboard差别不大,就是函数名变了。比如说移动鼠标到屏幕中央:

import pyautogui
screenWidth, screenHeight = pyautogui.size()
pyautogui.moveTo(screenWidth / 2, screenHeight / 2)

鼠标点击:

pyautogui.click()

鼠标移动,第一个参数是移动的x轴偏移量,第二个参数是y轴偏移量,第三个参数是移动耗时:

pyautogui.moveRel(xOffset, yOffset, duration=num_seconds)

右击、中键、双击、三击任意位置:

pyautogui.rightClick(x=moveToX, y=moveToY)
pyautogui.middleClick(x=moveToX, y=moveToY)
pyautogui.doubleClick(x=moveToX, y=moveToY)
pyautogui.tripleClick(x=moveToX, y=moveToY)

当然,还有很多其他有用的函数,相关的其他函数请见pyautogui的中文文档(没错,还有中文文档)。

3.删除微信收藏

虽然你可能觉得删除的过程中你无法再用电脑做任何事情,这样的删除没有意义,但是,你可以找一个不需要用到电脑的时间来做这个操作,启动脚本后去喝杯奶茶不香吗?

首先我们要找到操作目标的x,y值,用上回我们提到的看鼠标软件(软件下载:mousexy,也可在Python实用宝典公众号后台回复:看鼠标 下载)进行位置信息的采集:

然后找到右键后相关操作的位置:

最后还有一个确认选项的位置:

我们只需要将这系列操作连续起来自动化运行:

# Python实用宝典
# 2020/05/14
import pyautogui
import time
pyautogui.rightClick(706, 281)
time.sleep(0.5)
pyautogui.click(733, 351)
time.sleep(0.5)
pyautogui.click(768, 647)

没错,就是这么简单,演示一下:

然后我们再优化代码,让其可设定删除的条数:

# Python实用宝典
# 2020/05/14
import pyautogui
import time
DELETE = 5
delete_num = 0
while delete_num < DELETE:
    pyautogui.rightClick(706, 281)
    time.sleep(0.5)
    pyautogui.click(733, 351)
    time.sleep(0.5)
    pyautogui.click(768, 647)
    delete_num += 1

效果如下:

当然,你也可以 while 1 直接删除所有收藏哦。怎么样,学到了吗?如果有收获的话,记得点一下右下角的在看/赞哦,感谢各位。

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

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

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

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

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

Python Black一键格式化美化代码(详细配置教程)

复制别人的代码进行使用的时候,最烦的就是看到编辑器上显示的各种红色的、橙色的线吧?尤其是那些不遵守PEP8规则的代码,等号两边的空格会加到你手软…真希望哪天全世界写Python的小伙伴们都能统一代码规范啊!

没事,现在有black这个神器,我们可以在终端中输入一句命令就自动格式化代码!而且对于初学者来说,用Black来学习代码规范也是一个非常不错的选择。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda

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

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

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

pip install black

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

安装完成之后,你有两种使用black的方式,一种是直接在命令里输入:

black 你的文件路径.py

它就会自动格式化该Python文件,如果你是使用VSCode,我推荐使用这种方法来格式化。

如果你使用Pycharm,那么需要这么设置:

在PyCharm菜单 File->Setting->Tools->External Tools->单击按钮“+”号:

在弹出窗口里的Name中输入一个名字作为在以后在Pycharm菜单->Tools->External Tools中显示的名字,作为方便的工具入口,例如在此输入名字为BlackFormatter:

在Programs中输入black安装后的black.exe文件所在目录。该目录在Windows的cmd窗口中通过命令where black查找到,在Linux中用命令which black查找。

例如我的路径是:C:\Users\Ckend\Anaconda3\Scripts\black.exe,将此包含balck.exe文件名的全路径填入到Programs框中。在Arguments中填入$FilePath$,在Working Directory中填入$ProjectFileDir$。然后单击OK即可。

2.使用

如前所述,两种使用方法,先介绍Vscode的,比如说下面这个糟糕的格式:

真的各种线条都出现了,不过你只需要在终端中输入:

black test.py

就能一键美化到符合PEP8标准的代码格式:

使用Pycharm的话则更方便了(当然前提是你配置好了),你只需要按 Tools->External Tools -> BlackFormatter(你刚配置时输入的名称) 即可直接格式化当前文件。

Pycharm下方如图所示则说明格式化成功:

当然,Pycharm也可以使用命令的方式格式化,在Terminal里输入即可,因为它其实和Vscode的终端是一个东西,注意black安装的环境和你终端使用的虚拟环境是一致的就行。

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

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

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

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

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

人人都能懂的 Python 自动发送邮件详细实战教程

自动发送邮件能应用于许多场景中,比如我想要知道股票策略中的股票池是否有实时的更新,这时候如果再拉一遍数据,跑一遍脚本,实在是太浪费时间了。为什么不把这一套流程放到服务器上,然后到点自动运行并发送邮件呢?

类似的应用场景还有很多,不仅仅是在股票策略提醒上,比如定时向某些人发送邮件;还比如网站宕机了,实时发送邮件提醒;又比如网站负载过高,发送邮件提醒……等等。

下面就来讲讲怎么用Python构建一个自动发送邮件的脚本。

1.开启SMTP服务

为了实现自动发送邮件的目的,我们需要在邮箱中开启SMTP服务:

这点很关键,别忘了去开启SMTP, 别忘了去开启SMTP,否则邮件是无法发送成功的 。然后你还需要点击下面生成授权码,这个授权码才是使用Python发送邮件时的真正密码。

邮箱设定成功后,就可以开始脚本开发了。

2.准备

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda

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

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

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

pip install yagmail

看到 Successfully installed xxx 则说明安装成功。本文全部源代码可在公众号后台回复:自动发送邮件 获得。

3.编写脚本

今天需要用到的模块是yagmail,一个非常方便的Python邮件发送模块,用这个模块,你甚至能一行命令发送邮件:

yag = yagmail.SMTP(
    host='smtp.qq.com', user='你的邮箱',
    password='你的授权码', smtp_ssl=True
).send('发送对象', '主题', '内容')

为了让这个发送邮件的方法更加具备可用性,我们将其封装到一个类中:

import yagmail 
class Mail:
    """
    邮件相关类
    """ 
    def sendmail(self, msg, title, receivers):
        """
        发送邮件
        
        Arguments:
            msg {str} -- 邮件正文
            title {str} -- 邮件标题
            receivers {list} -- 邮件接收者,数组
        """

        yag = yagmail.SMTP(
            host='smtp.qq.com', user='你的邮箱',
            password='你的鉴权码', smtp_ssl=True
        )

        try:
            yag.send(receivers, title, msg)
            print("邮件发送成功")

        except BaseException as e:
            print (e)
            print("Error: 无法发送邮件") 

这个类里还可以封装很多其他东西,比如log函数,用于显示时间:

import time
class Mail:
    """
    邮件相关类
    """

    def log(self, content):
        now_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        print(f'{now_time}: {content}')

这样,需要显示时间的时候只需要调用self.log即可,可将sendmail函数改成如下所示:

    def sendmail(self, msg, title, receivers):
        """
        发送邮件
        
        Arguments:
            msg {str} -- 邮件正文
            title {str} -- 邮件标题
            receivers {list} -- 邮件接收者,数组
        """

        yag = yagmail.SMTP(
            host='smtp.qq.com', user='你的邮箱',
            password='你的鉴权码', smtp_ssl=True
        )

        try:
            yag.send(receivers, title, msg)
            self.log("邮件发送成功")

        except BaseException as e:
            print (e)
            self.log("Error: 无法发送邮件")

发送成功时显示:

PS D:\CODE\stock\api> python .\sendmail_yagmail.py
2020-04-22 00:51:34: 邮件发送成功

4.小例子

将刚刚编写完的类保存为sendmail.py,接下来就可以尝试一个小例子。我们用一个自动监控网站是否宕机的小脚本做示例:

import time
import requests
from sendmail import Mail

while True:
    response = requests.get('https://pythondict.com')

    # 根据状态码判断网站是否正常
    if response.status_code != 200:
        Mail().sendmail(
            '哥, pythondict挂了', 'Python实用宝典网站异常监控', ['你的邮箱']
        )

    time.sleep(600)

通过requests.get请求网站,使用response.status_code即可得到状态码,200为正常,其他情况均为异常。这个检测每十分钟运行一次,因此 time.sleep(600).

就这样,我们构建起了一个非常简单的网站异常监控脚本,如果你真的要在服务器上运行这个脚本,请记得使用nohup让其在后台运行:

nohup python test.py &

总之,自动发送邮件的用途非常广泛,不亚于手机自动通知,具体使用就要看各位自身的需求啦。

自动通知系列文章:

让Python自动提醒你:阿森纳进球啦!

Python 自动发送邮件详细教程

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

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

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

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

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

Python 使用tablib库快速导出数据

Tablib是一个Python的第三方数据导出模块,它支持以下文件格式的导出:

  • Excel
  • JSON
  • YAML
  • Pandas DataFrames
  • HTML
  • Jira
  • TSV
  • ODS
  • CSV
  • DBF

这个工具能做到的东西,Pandas都能做到,但是有时候Pandas实在是过重了,如果我们只想实现轻量数据的导出,而非上千万级别的数据导出,该工具更能体现它的优势。

1.准备

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

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

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

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

pip install tablib

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

2.基本使用

这一块,官方文档已经有详细介绍,这里转载自xin053的翻译与介绍,有部分修改。

创建Dataset对象

import tablib
headers = ('first_name', 'last_name')
data = [
    ('John', 'Adams'),
    ('George', 'Washington')
]
data = tablib.Dataset(*data, headers=headers)

这样相当于构造了一张表:

first_namelast_name
JohnAdams
GeorgeWashington

其中最重要的就是Dataset对象,当然该对象的创建也可以不输入参数,直接

data = tablib.Dataset()

创建出一个Dataset对象,然后通过

data.headers = ['first_name', 'last_name']

设置表头,当然也可以使用

data.headers = ('first_name', 'last_name')

因为不管是用列表还是元组,tablib都会自动帮我们处理好,我们可以通过

data.append(['Henry', 'Ford'])

或者

data.append(('Henry', 'Ford'))

来向表中添加一条记录。

我们可以通过data.dict来查看目前表中的所有数据:

>>> data.dict
[OrderedDict([('First Name', 'John'), ('Last Name', 'Adams')]), OrderedDict([('First Name', 'George'), ('Last Name', 'Washington')]), OrderedDict([('First Name', 'Henry'), ('Last Name', 'Ford')])]

也可以通过print(data)显示更人性化的输出:

>>> print(data)
First Name|Last Name 
----------|----------
John      |Adams     
George    |Washington
Henry     |Ford 

Dataset属性

data.height输出当前记录(行)总数
data.width输出当前属性(列)总数

>>> print(data)
First Name|Last Name|age
----------|---------|---
John      |Adams    |90
Henry     |Ford     |83
>>> data.height
2
>>> data.width
3 

常用方法

详情可见官方文档:
https://tablib.readthedocs.io/en/stable/api/#tablib.Dataset.remove_duplicates

lpop(),lpush(row, tags=[]),lpush_col(col, header=None)
是对列的相关操作
pop(),rpop(),rpush(row, tags=[]),rpush_col(col, header=None)
是对行的相关操作
remove_duplicates() 去除重复的记录
sort(col, reverse=False) 根据列进行排序
subset(rows=None, cols=None) 返回子Dataset
wipe() 清空Dataset,包括表头和内容

新增列

>>> data.append_col((90, 67, 83), header='age')

这样表就变成了:

first_namelast_nameage
JohnAdams90
GeorgeWashington67
HenryFord83
>>> print(data)
First Name|Last Name |age
----------|----------|---
John      |Adams     |90
George    |Washington|67
Henry     |Ford      |83 

对记录操作

>>> print(data[:2])
[('John', 'Adams', 90), ('George', 'Washington', 67)]
>>> print(data[2:])
[('Henry', 'Ford', 83)]

对属性操作

>>> print(data['first_name'])
['John', 'George', 'Henry']

>>> print(data)
First Name|Last Name |age
----------|----------|---
John      |Adams     |90
George    |Washington|67
Henry     |Ford      |83
>>> data.get_col(1)
['Adams', 'Washington', 'Ford'] 

删除记录

>>> del data[1]
>>> print(data)
First Name|Last Name|age
----------|---------|---
John      |Adams    |90
Henry     |Ford     |83 

可见记录也是从0开始索引的

删除记录操作也支持切片

删除属性

del data['Col Name']

导入数据

imported_data = tablib.Dataset().load(open('data.csv').read())

导出数据

csv

>>> data.csv
'First Name,Last Name,age\r\nJohn,Adams,90\r\nHenry,Ford,83\r\n'
>>> print(data.csv)
First Name,Last Name,age
John,Adams,90
Henry,Ford,83 
>> f = open('data.csv', 'w', encoding='utf-8')
>> f.write(data.csv)
>> f.close() 

这样便可成功将数据导出为csv文件。

json

>>> data.json
'[{"First Name": "John", "Last Name": "Adams", "age": 90}, {"First Name": "Henry", "Last Name": "Ford", "age": 83}]'
>>> print(data.json)
[{"First Name": "John", "Last Name": "Adams", "age": 90}, {"First Name": "Henry", "Last Name": "Ford", "age": 83}] 
>> f = open('data.json', 'w', encoding='utf-8')
>> f.write(data.json)
>> f.close()  

yaml

>>> data.yaml
'- {First Name: John, Last Name: Adams, age: 90}\n- {First Name: Henry, Last Name: Ford, age: 83}\n'
>>> print(data.yaml)
- {First Name: John, Last Name: Adams, age: 90}
- {First Name: Henry, Last Name: Ford, age: 83} 
>> f = open('data.yaml', 'w', encoding='utf-8')
>> f.write(data.yaml)
>> f.close()   

excel

>>> with open('people.xls', 'wb') as f:
...     f.write(data.xls) 

注意要以二进制形式打开文件

dbf

>>> with open('people.dbf', 'wb') as f:
...     f.write(data.dbf) 

高级使用

动态列

可以将一个函数指定给Dataset对象

import random

def random_grade(row):
    """Returns a random integer for entry."""
    return (random.randint(60,100)/100.0)

data.append_col(random_grade, header='Grade')

>>> data.yaml
- {Age: 22, First Name: Kenneth, Grade: 0.6, Last Name: Reitz}
- {Age: 20, First Name: Bessie, Grade: 0.75, Last Name: Monke} 

函数的参数row传入的是每一行记录,所以可以根据传入的记录进行更一步的计算:

def guess_gender(row):
	"""Calculates gender of given student data row."""
	m_names = ('Kenneth', 'Mike', 'Yuri')
	f_names = ('Bessie', 'Samantha', 'Heather')
	name = row[0]
	if name in m_names:
		return 'Male'
	elif name in f_names:
		return 'Female'
	else:
		return 'Unknown'
>>> data.yaml
- {Age: 22, First Name: Kenneth, Gender: Male, Last Name: Reitz}
- {Age: 20, First Name: Bessie, Gender: Female, Last Name: Monke}

tag

可以给记录添加tag,之后通过tag来过滤记录:

students = tablib.Dataset()
students.headers = ['first', 'last']
students.rpush(['Kenneth', 'Reitz'], tags=['male', 'technical'])
students.rpush(['Bessie', 'Monke'], tags=['female', 'creative'])
>>> students.filter(['male']).yaml
- {first: Kenneth, Last: Reitz}

3.举个小例子

现在有一个场景,我们需要将一份股票数据csv文件转化为json数据:

你只需要这样操作:

import tablib

data = tablib.Dataset().load(open('1.csv').read())

with open('data.json', 'w', encoding='utf-8') as f:
    f.write(data.json)

即可将其转化为json格式,它的特点在于轻量、简单。Pandas如果用来做这样的转化,则有些大材小用。

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

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

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

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

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

Python 数据分析与挖掘好帮手—Anaconda

用Python进行数据分析的时候,你会不会烦恼要安装那么多的模块?比如Pandas、Numpy、matplotlib、scipy等等,而当你接手的项目是由不同的Python版本编写的时候你又得下载那个Python版本,然后安装所需要的依赖,非常麻烦。

而使用Anaconda则能减少许多这样的烦恼,因为Anaconda具有以下特点:

1.自带180多个科学包,包括conda、numpy、scipy、pandas等。

2.极其方便的环境管理工具,可以创建**任意**版本的Python虚拟环境

为什么第2点的任意要加粗呢?其他的虚拟环境管理工具,如virtualenv是无法随意选择Python版本构建虚拟环境的,它们只能使用目前电脑上已有的Python版本构建虚拟环境。而Anaconda的环境管理工具则可以任意选择Python版本,它会自动下载相应的Python版本到虚拟环境中,免去用户自己手动下载安装Python的麻烦。

1.安装Anaconda

首先,前往Anaconda官方下载地址:
https://www.anaconda.com/distribution/#download-section

选择最新版本的Anaconda进行下载,要注意选择 64-Bit Graphical Installer. 当然这里指的只是Anaconda的默认Python版本,安装成功后,你可以创建任意版本的Python虚拟环境。

安装的过程中一路默认即可,不过如果是Windows用户,建议不要将Anaconda装在C盘,否则随着安装的包越来越多,会出现C盘空间不足的情况。

Windows用户注意:如果在 “Advanced Installation Options”中没有勾选“Add Anaconda to my PATH environment variable.”(添加Anaconda至我的环境变量),则无法在CMD或者powershell中使用conda命令,需要打开菜单中的 Anaconda Prompt 才能使用conda命令,因此请各位根据自己的情况选择勾不勾选。如果没勾选,但是后来又反悔了,可以通过配置环境变量来解决这个问题:

此处借用了别人的图,请注意路径要换成自己的路径。

相比之下,macOS系统就没有这么多繁琐的操作了,在终端(Terminal)中即可使用conda命令。

2.修改镜像源

这点很关键,由于conda默认镜像源是国外的,因此你 pip install 或者 conda install 安装模块的时候可能会等待非常久,如果你不想装个包比敲代码花费的时间还长,请一定要修改镜像源。

首先,在CMD(Windows)或Terminal(macOS)中,输入:

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes

Windows用户前往目录 C:\Users<你的用户名> 下显示隐藏文件会看到配置文件.condarc .

macOS用户则是在 ~/.condarc 中,可以在终端中用 sudo open ~/.condarc 打开。

然后会看到文件内容类似:

channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
  - defaults
show_channel_urls: true

– defaults 就是原来的源,我们可以直接把它去掉(建议去掉),只用清华源。然后保存,重启终端即可。

3.使用及切换环境

到这里,我们就可以开始使用conda环境了,默认情况下,现在Python命令都是基于conda的,因此你的终端或CMD前都会带有(base)的字样:

如果没有的话,可能是你在安装的时候把 “Register Anaconda as my default Python 3.7”去掉了。没关系,我们也可以用以下命令切换环境,Windows下在CMD中使用:

activate base

可切换到Anaconda默认环境, macOS和Linux则是:

conda activate base

其实两者是一样的原理,均通过conda来控制环境的使用。因为Windows中,输入完activate base后,它会自动补全一句conda.bat activate base, 如下图所示​:

在base环境下,默认自带pandas等180+个科学工具包,因此如果没有特别的需求,在这个环境下进行数据分析的开发即可。

4.创建虚拟环境

理想情况下,一直在base环境下开发是美滋滋的,但有时候我们会遇到开发的项目需要特别的版本,甚至是上古时期的2.x版本,这个时候anaconda强大之处也体现出来了,比如我的项目是 old_git, 需要Python2.7版本:

conda create --name old_git python=2.7

这时候便创建了一个python2.7的环境,叫做old_git,通过调用

activate old_git
# macOS/Linux则输入: conda activate old_git 

即可切换到这个环境,不过注意,这个新的环境是没有自带180+个科学工具包的,你需要自行安装所需模块。

5.其他命令

最常用的是显示已创建环境:

conda info --envs

其次是删除环境:

conda remove --name 环境名 --all

(由于我这里环境都比较重要就不演示了)

最后是安装包:

conda install xxx

其实conda install 和 pip install 都能达到安装包的效果,区别在于,前者使用conda的镜像源,后者使用pip镜像源。一般而言,推荐pip install,因为包更全一点。

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

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

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

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

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