分类目录归档:生活智能化

Python 教你快速批量下载抖音去水印短视频

TikTokDownload 是由国人开源的抖音去水印视频下载工具。开源地址是:

https://github.com/Johnserf-Seed/TikTokDownload

对于某些做视频分析和研究的同学来说,这个工具非常有用,可以快速获取到视频资料。

下面就来介绍一下这个工具的使用方法。

1.准备

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

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

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

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

git clone https://github.com/Johnserf-Seed/TikTokDownload.git
cd TikTokDownload
pip install -r requirements.txt

如果你的网络环境无法访问Github,你可以在Python实用宝典公众号后台回复 TikTokDownload 下载最新源代码(2022-11-26)。

2.抖音去水印短视频下载方法

运行软件前先打开目录下 conf.ini 文件按照要求进行配置:

配置完成后,在 TikTokDownload 目录下新建一个py文件,填入以下代码即可使用:

# example.py
import TikTokDownload as TK
import Util

# 单视频下载
# TK.video_download(*TK.main())

# 批量下载
if __name__ == '__main__':
    # 获取命令行参数
    cmd = Util.Command()
    # 获取用户主页数据
    profile = Util.Profile()
    # 使用参数,没有则使用默认参数并下载
    profile.getProfile(cmd.setting())
	# 如果需要定时下载则注释这个input
    input('[  完成  ]:已完成批量下载,输入任意键后退出:')

效果如下:

​视频会被默认保存在当前目录的Download目录下。

单个视频链接,你可以通过 TK.video_download 下载

import TikTokDownload as TK
TK.video_download("视频链接", "yes")

video_download 第一个参数是视频的原始链接,第二个参数表明是否下载音乐原声,yes为下载。

3.常见错误

  1. 单个视频链接与用户主页链接要分清,软件闪退可以通过终端运行查看报错信息(一般是链接弄错的问题)如:
    • 链接一定要输入仔细,配置文件只支持用户主页
  2. 配置文件一定要注意编码格式(推荐Notepad++)

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

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

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


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

Yapf 又一个格式化代码的好帮手

大部分人使用Python中的代码格式化工具时都会选择autopep8之类的工具,这些工具可能有一定的局限性,比如不会重新格式化已经符合PEP 8指南的代码。

而本文即将介绍的Yapf,不仅能将代码格式化为符合PEP8指南的格式,还能格式化为符合Google指南的格式,可选项更多,让你的代码更加漂亮。

1.准备

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

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

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

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

pip install yapf

YAPF 支持 Python 2.7 和 3.6.4+。

2.Yapf 使用方法

你可以在命令行中直接使用 Yapf, 参数如下:

yapf [-h] [-v] [-d | -i | -q] [-r | -l START-END] [-e PATTERN]
            [--style STYLE] [--style-help] [--no-local-style] [-p]
            [-vv]
            [files ...]

必选参数:

files 需要被格式化的文件

可选参数:
-h, –help 显示帮助信息
-v, –version 显示程序的版本号
-d, –diff 打印格式化前后差异
-i, –in-place 格式化文件并替换
-q, –quiet 什么都不输出
-r, –recursive 在目录上递归运行
-l START-END, –lines START-END 重新格式化的行范围,基于一个
-e PATTERN, –exclude PATTERN 需要排除的文件
–style STYLE 指定格式化样式(例如“pep8”或“google”)
-p, –parallel 并行格式化(多个文件时有效)
-vv, –verbose 在处理时打印出文件名

举个例子,如果我们有以下的混乱格式代码 1.py :

x = {  'a':37,'b':42,

'c':927}

y = 'hello ''world'
z = 'hello '+'world'
a = 'hello {}'.format('world')
class foo  (     object  ):
  def f    (self   ):
    return       37*-+2
  def g(self, x,y=42):
      return y
def f  (   a ) :
  return      37+-+a[42-x :  y**3]

为了格式化它,我们可以在命令行中执行以下命令:

yapf -i 1.py

效果如下:

3.Yapf 作为模块使用

Yapf 不仅可以在命令行中使用,我们还可以在项目运行时使用。

一个比较常见的场景是用户在你的web网站上提交了python代码,你希望能一件格式化这些代码,那将yapf作为格式化的模块则再好不过。

Yapf 最主要的两个 API 是 FormatCodeFormatFile:

from yapf.yapflib.yapf_api import FormatCode

formatted_code, changed = FormatCode("f ( a = 1, b = 2 )")
print(formatted_code)
# 'f(a=1, b=2)\n'
print(changed)
# True

你还可以传递 style_config 决定使用哪种指南做格式化:

from yapf.yapflib.yapf_api import FormatCode

print(FormatCode("def g():\n  return True", style_config='pep8')[0])
# 'def g():\n    return True\n'

FormatFile,这个函数可以从文件中读取代码并格式化:

from yapf.yapflib.yapf_api import FormatFile 
print(open("foo.py").read())
# a==b
reformatted_code, encoding, changed = FormatFile("foo.py")
print(formatted_code)
# 'a == b\n'
print(encoding)
# 'utf-8'
print(changed)
# True

如果你添加in_place参数,它将把格式化后的代码写回文件中:

from yapf.yapflib.yapf_api import FormatFile 
print(FormatFile("foo.py", in_place=True)[:2])
# (None, 'utf-8')

print(open("foo.py").read()) 
# a == b

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

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

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


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

Keyboard — 这个牛逼的Python模块,能让你轻松模拟并记录键盘操作

模拟键盘操作执行自动化任务,我们常用的有 pyautowin 等自动化操作模块。但是这些模块有一个很大的缺点,编译的时候非常依赖 windows 的C语言底层模块。

今天介绍的这个模块叫做 keyboard 它有一个最大的优点:纯Python原生开发,编译时完全不需要依赖C语言模块。一行命令就能完成安装,非常方便。

1.准备

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

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

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

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

pip install keyboard

2.Keyboard 基本使用

按下并释放:模拟键盘按下某些键或组合键后释放,比如shift + S, 并增加空格:

import keyboard

keyboard.press_and_release('shift+s, space')

输入文字:

import keyboard

keyboard.write('Python 实用宝典')

等待触发按键并响应:

# 公众号:Python实用宝典
import keyboard

keyboard.add_hotkey('ctrl+shift+a', print, args=('宝典哥触发了热键'))
keyboard.wait()

这样程序就会监控 “ctrl+shift+a” 组合键的触发情况,一旦组合键触发,就会执行第二个参数的函数,并将第三个参数传入第二个函数的参数中。

等待触发某个按键:

# 公众号:Python实用宝典
import keyboard

keyboard.add_hotkey('ctrl+shift+a', print, args=('宝典哥触发了热键'))
keyboard.wait('esc')

这样,按下 ESC 就会终止等待,继续往下运行程序。

3.高级功能

记录功能:

# 公众号:Python实用宝典
import keyboard

recorded = keyboard.record(until='esc')
print(recorded)

可以看到,除非你按下esc,它会记录所有执行过的键盘操作。

重放操作:

# 公众号:Python实用宝典
import keyboard

recorded = keyboard.record(until='esc')
print(recorded)
keyboard.play(recorded, speed_factor=3)

play方法能完全模拟你刚记录下的所有键盘操作。

替换操作:

# 公众号:Python实用宝典
import keyboard

keyboard.add_abbreviation('@@', 'Python 实用宝典')
keyboard.wait('esc')

输入@@并按下空格,它会将你刚输入的@@替换为 Python 实用宝典.

怎么样,这个简单实用的Keyboard模块,你学会使用了吗?

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

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

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


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

Python 超强文献下载工具 Scihub-cn 又更新啦!

Scihub-cn 开发维护到现在已经2年多了,感谢各位朋友的使用和支持,尤其是那些参与开源贡献的朋友,本人工作比较繁忙,正是有这些朋友帮忙维护和改进项目,才给这个项目提供了长久的生命力,非常感谢他们。

本次升级主要是修复Scihub-cn下载的时候总是报 “scihub数据库不存在这篇论文!” 的错误,这个错误是由于scihub反爬及页面改版导致的。前几个月Scihub-cn一直处于无法使用的状态,现在你只要更新最新版代码就可以使用了。

接下来还是给大家正式介绍一下使用方式。

1.准备

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

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

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

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

pip install --upgrade scihub-cn

2.Scihub-cn 使用方法

2.1 使用DOI号下载论文

首先让我们来试试根据DOI号下载文献:

scihub-cn -d 10.1038/s41524-017-0032-0

下载的论文会自动生成在当前文件夹下:

你也可以选择将其下载到任意目录下,只需要添加 -o 参数:

scihub-cn -d 10.1038/s41524-017-0032-0 -o D:\papers

这将会把这篇论文下载到D盘的papers文件夹中。

2.2 根据关键词下载论文

使用 -w 参数指定一个关键词,可以通过关键词下载论文:

scihub-cn -w reinforcement

同样滴,它也支持-o参数指定文件夹。此外,这里默认使用的搜索引擎是百度学术,你也可以使用Google学术、publons、science_direct等。通过指定 -e 参数即可:

scihub-cn -w reinforcement -e google_scholar

为了避免Google学术无法连接,你还可以增加代理 -p 参数:

scihub-cn -w reinforcement -e google_scholar -p http://127.0.0.1:10808

访问外网数据源的时候,增加代理能避免出现Connection closed等问题。

此外,你还能限定下载的篇目, 比如我希望下载100篇文章:

scihub-cn -w reinforcement -l 100

2.3 根据url下载论文

给定任意论文地址,可以让scihub-cn尝试去下载该论文:

scihub-cn -u https://ieeexplore.ieee.org/document/26502

使用 -u 参数指定论文链接即可,非常方便。

3.批量下载论文

当然,之前花了几篇文章优化的批量下载模块这个版本肯定少不了!

而且还增加了几种新的批量下载方式:

1. 根据给出所有论文名称的txt文本文件下载论文。

2. 根据给出所有论文url的txt文件下载论文。

3. 根据给出所有论文DOI号的txt文本文件下载论文。

4. 根据给出bibtex文件下载论文。

比如,根据给出所有论文URL的txt文件下载论文:

scihub-cn -i urls.txt --url

可以看到,文件内有4个论文链接,而他也成功地下载到了这4篇论文。

再试试放了DOI号的txt文件的批量下载:

scihub-cn -i dois.txt --doi

你可以输入 scihub-cn –help 看到更多的参数说明:

$scihub-cn --help
... ...
optional arguments:
  -h, --help            show this help message and exit
  -u URL                input the download url
  -d DOI                input the download doi
  --input INPUTFILE, -i INPUTFILE
                        input download file
  -w WORDS, --words WORDS
                        download from some key words,keywords are linked by
                        _,like machine_learning.
  --title               download from paper titles file
  -p PROXY, --proxy PROXY
                        use proxy to download papers
  --output OUTPUT, -o OUTPUT
                        setting output path
  --doi                 download paper from dois file
  --bib                 download papers from bibtex file
  --url                 download paper from url file
  -e SEARCH_ENGINE, --engine SEARCH_ENGINE
                        set the search engine
  -l LIMIT, --limit LIMIT
                        limit the number of search result

大家如果有更多的想法,可以往我们这个开源项目贡献代码:

https://github.com/Ckend/scihub-cn

本文仅限参考研究,下载的论文请在24小时内阅读后删除,请勿将此项目用于商业目的。

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

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

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


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

TinyDB 一个纯Python编写的轻量级数据库

TinyDB 是一个纯 Python 编写的轻量级数据库,一共只有1800行代码,没有外部依赖项。目标是降低小型 Python 应用程序使用数据库的难度,对于一些简单程序而言与其用 SQL 数据库,不如就用TinyDB.

TinyDB的特点是:

  • 轻便:当前源代码有 1800 行代码(大约 40% 的文档)和 1600 行测试代码。
  • 可随意迁移:在当前文件夹下生成数据库文件,不需要任何服务,可以随意迁移。
  • 简单: TinyDB 通过提供简单干净的 API 使得用户易于使用。
  • 用纯 Python 编写: TinyDB 既不需要外部服务器,也不需要任何来自 PyPI 的依赖项。
  • 适用于 Python 3.6+ 和 PyPy3: TinyDB 适用于所有现代版本的 Python 和 PyPy。
  • 强大的可扩展性:您可以通过编写中间件修改存储的行为来轻松扩展 TinyDB。
  • 100% 测试覆盖率:无需解释。

1.准备

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

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

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

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

pip install tinydb

2.TinyDB 增删改查示例

初始化一个DB文件:

from tinydb import TinyDB
db = TinyDB('db.json')

这样就在当前文件夹下生成了一个名为 `db.json` 的数据库文件。

往里面插入数据

from tinydb import TinyDB
db = TinyDB('db.json')
db.insert({'type': 'apple', 'count': 7})
db.insert({'type': 'peach', 'count': 3})

可以看到,我们可以直接往数据库里插入字典数据,不需要任何处理。下面是批量插入的方法:

db.insert_multiple([
    {'name': 'John', 'age': 22},
    {'name': 'John', 'age': 37}])
db.insert_multiple({'int': 1, 'value': i} for i in range(2))

查询所有数据

from tinydb import TinyDB
db = TinyDB('db.json')
db.all()
# [{'count': 7, 'type': 'apple'}, {'count': 3, 'type': 'peach'}]

除了 .all() 我们还可以使用for循环遍历db:

from tinydb import TinyDB
db = TinyDB('db.json')
for item in db:
    print(item)
# {'count': 7, 'type': 'apple'}
# {'count': 3, 'type': 'peach'}

如果你需要搜索特定数据,可以使用Query():

from tinydb import TinyDB
db = TinyDB('db.json')
Fruit = Query()
db.search(Fruit.type == 'peach')
# [{'count': 3, 'type': 'peach'}]
db.search(Fruit.count > 5)
# [{'count': 7, 'type': 'apple'}]

更新数据:

from tinydb import TinyDB
db = TinyDB('db.json')
db.update({'foo': 'bar'})

# 删除某个Key
from tinydb.operations import delete
db.update(delete('key1'), User.name == 'John')

删除数据

删除数据也可以使用类似的条件语句:

from tinydb import TinyDB
db = TinyDB('db.json')
db.remove(Fruit.count < 5)
db.all()
# [{'count': 10, 'type': 'apple'}]

清空整个数据库:

from tinydb import TinyDB
db = TinyDB('db.json')
db.truncate()
db.all()
# []

3.高级查询

除了点操作符访问数据,你还可以用原生的dict访问表示法:

# 写法1
db.search(User.country-code == 'foo')
# 写法2
db.search(User['country-code'] == 'foo')

这两种写法是等效的。

另外在常见的查询运算符(==, <, >, …)之外,TinyDB还支持where语句:

from tinydb import where
db.search(where('field') == 'value')

这等同于:

db.search(Query()['field'] == 'value')

这种语法还能访问嵌套字段:

db.search(where('birthday').year == 1900)
# 或者
db.search(where('birthday')['year'] == 1900)

Any 查询方法:

db.search(Group.permissions.any(Permission.type == 'read'))
# [{'name': 'user', 'permissions': [{'type': 'read'}]},
# {'name': 'sudo', 'permissions': [{'type': 'read'}, {'type': 'sudo'}]},
# {'name': 'admin', 'permissions':
#        [{'type': 'read'}, {'type': 'write'}, {'type': 'sudo'}]}]

检查单个项目是否包含在列表中:

db.search(User.name.one_of(['jane', 'john']))

TinyDB还支持和Pandas类似的逻辑操作:

# Negate a query:
db.search(~ (User.name == 'John'))
# Logical AND:
db.search((User.name == 'John') & (User.age <= 30))
# Logical OR:
db.search((User.name == 'John') | (User.name == 'Bob'))

TinyDB的介绍就到这里,你还可以访问他们的官方文档,查看更多的使用方法:

https://tinydb.readthedocs.io/en/latest/usage.html

尤其是想基于TinyDB做些存储优化的同学,你们可以详细阅读 Storage & Middleware 章节。

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

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

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


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

教你如何在 Windows 下让崩溃的 Python 程序自动重启

我们用Python定时跑一些自动化程序的时候会出现程序崩溃的情况。此时如果你本人不在电脑面前,或者没有留意到程序的崩溃,没有及时重新拉起程序,会造成或大或小的损失。那么我们如何在 Windows 下让崩溃的 Python 程序自动重启呢?答案是通过 Supervisor-win.

本文将教你如何在 Windows 下使用 Supervisor-win 重新拉起崩溃的Python程序。

1.准备

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

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

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

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

pip install supervisor-win

如果你出现 “DLL load failed: 找不到指定的程序” 的报错,请重新安装pywin32:

pip install pywin32==223

2.Windows Python程序自动重启的配置

接下来,你需要编写一个让你的Python程序自动运行,遇到报错自动重启的配置:

[program:cancel]
command=G:\\Anaconda3\\envs\\tdx_easytrader\\python.exe D://CODE//tdx_easytrader//dataserver.py
    
[supervisord]
nodaemon=true

[supervisorctl]

前两行就是你的程序运行命令,在上面的例子中,program: 后面的关键词是你自定义的程序名,我的Python位于 G:\Anaconda3\envs\tdx_easytrader\python.exe,我想要自重启的脚本位于 D://CODE//tdx_easytrader//dataserver.py

此外,后面的三行是必须配置的,按我的默认写法即可。

编写完成后将配置命名为 supervisord.conf 保存于任何地方,可以是项目目录下,也可以是一个重要的配置目录文件夹。

然后执行以下命令启动 supervisord:

supervisord -c D:\CODE\tdx_easytrader\supervisord.conf

注意 -c 参数后就是你的 supervisord.conf 的绝对路径。启动完毕显示:

2022-06-27 19:58:54,809 INFO process group added: 'cancel'
2022-06-27 19:58:54,810 INFO supervisord started with pid 28472
2022-06-27 19:58:54,815 INFO Spawned: 'cancel' with pid 27220
2022-06-27 19:58:55,830 INFO success: cancel entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

意思是,supervisord 进程已经启动,pid为28472。我命名为cancel的Python进程也已经启动,pid为27220。我们在任务管理器中可以查看到这两个进程:

3.测试

接下来我们测试一下它能否自动重启,让我们强杀 27220 这个进程,观察终端:

2022-06-27 19:58:54,815 INFO Spawned: 'cancel' with pid 27220
2022-06-27 19:58:55,830 INFO success: cancel entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2022-06-27 20:02:58,077 INFO exited: cancel (exit status 1; not expected)
2022-06-27 20:02:58,590 INFO Spawned: 'cancel' with pid 16640
2022-06-27 20:02:59,603 INFO success: cancel entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

可以看到, 20:02:58秒的时候 cancel 程序意外退出(exit status 1; not expected),然后supervisord重新帮我们拉起了一个cancel程序,pid为16640:

测试成功,程序成功自重启。

Supervisor不仅会把日志输出到终端中,在你运行命令的目录中,它还会生成supervisord.log, 这里面也保存了所有运行日志:

当然,在上方我们supervisord的配置里,你也能配置日志输出位置、最大大小、分片数量等:

[supervisord]
logfile = /tmp/supervisord.log
logfile_maxbytes = 50MB
logfile_backups=10
loglevel = info
pidfile = /tmp/supervisord.pid

Supervisord 还有许多其他的功能,有兴趣的同学可以访问他们官网查询:

http://supervisord.org/introduction.html

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

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

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


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

Cpca 这个Python神器能帮你自动识别文字中的省市区并绘图

在做NLP(自然语言处理)相关任务时,经常会遇到需要识别并提取省、城市、行政区的需求。虽然我们自己通过关键词表一个个查找也能实现提取目的,但是需要先搜集省市区关键词表,相对而言比较繁琐。

今天给大家介绍一个模块,你只需要把字符串传递给这个模块,他就能给你返回这个字符串内的省、市、区关键词,并能给你在图片上标注起来,它就是 Cpca 模块。

1.准备

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

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

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

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

pip install cpca

注意,目前 cpca 模块仅支持Python3及以上版本。

在 windows 上可能会出现类似如下问题

Building wheel for pyahocorasick (setup.py) ... error

先去下载 Microsoft Visual C++ Build Tools 安装VC++构建工具,再重新 pip install cpca,即可解决问题

2.Cpca 基本使用

通过两行代码就能实现最基本的省市区提取:

# 公众号: Python 实用宝典
# 2022/06/23

import cpca

location_str = [
    "广东省深圳市福田区巴丁街深南中路1025号新城大厦1层",
    "特斯拉上海超级工厂是特斯拉汽车首座美国本土以外的超级工厂,位于中华人民共和国上海市。",
    "三星堆遗址位于中国四川省广汉市城西三星堆镇的鸭子河畔,属青铜时代文化遗址"
]
df = cpca.transform(location_str)
print(df)

效果如下:

     省     市     区                     地址  adcode
0  广东省   深圳市   福田区     巴丁街深南中路1025号新城大厦1层  440304
1  上海市  None  None                      。  310000
2  四川省   德阳市   广汉市  城西三星堆镇的鸭子河畔,属青铜时代文化遗址  510681

注意第三条的广汉市,cpca 不仅识别到了语句中的县级市广汉市,还能自动匹配到其代管市的德阳市,不得不说非常强大。

如果你想获知程序是从字符串的那个位置提取出省市区名的,可以添加一个 pos_sensitive=True 参数:

# 公众号: Python 实用宝典
# 2022/06/23

import cpca

location_str = [
    "广东省深圳市福田区巴丁街深南中路1025号新城大厦1层",
    "特斯拉上海超级工厂是特斯拉汽车首座美国本土以外的超级工厂,位于中华人民共和国上海市。",
    "三星堆遗址位于中国四川省广汉市城西三星堆镇的鸭子河畔,属青铜时代文化遗址"
]
df = cpca.transform(location_str, pos_sensitive=True)
print(df)

效果如下:

(base) G:\push\20220623>python 1.py
     省     市     区                     地址  adcode  省_pos  市_pos  区_pos
0  广东省   深圳市   福田区     巴丁街深南中路1025号新城大厦1层  440304      0      3      6
1  上海市  None  None                      。  310000     38     -1     -1
2  四川省   德阳市   广汉市  城西三星堆镇的鸭子河畔,属青铜时代文化遗址  510681      9     -1     12

它标记出了识别到省、市、区的关键位置(index),当然如果是德阳市这种特殊的识别会被标记为-1.

3.高级使用

它还可以从大段文本中批量识别多个地区:

# 公众号: Python 实用宝典
# 2022/06/23

import cpca

long_text = "对一个城市的评价总会包含个人的感情。如果你喜欢一个城市,很有可能是喜欢彼时彼地的自己。"\
    "在广州、香港读过书,工作过,在深圳买过房、短暂生活过,去北京出了几次差。"\
    "想重点比较一下广州、深圳和香港,顺带说一下北京。总的来说,觉得广州舒适、"\
    "香港精致、深圳年轻气氛好、北京大气又粗糙。答主目前选择了广州。"
df = cpca.transform_text_with_addrs(long_text, pos_sensitive=True)
print(df)

效果如下:

(base) G:\push\20220623>python 1.py
          省     市     区 地址  adcode  省_pos  市_pos  区_pos
0       广东省   广州市  None     440100     -1     44     -1
1   香港特别行政区  None  None     810000     47     -1     -1
2       广东省   深圳市  None     440300     -1     58     -1
3       北京市  None  None     110000     71     -1     -1
4       广东省   广州市  None     440100     -1     86     -1
5       广东省   深圳市  None     440300     -1     89     -1
6   香港特别行政区  None  None     810000     92     -1     -1
7       北京市  None  None     110000    100     -1     -1
8       广东省   广州市  None     440100     -1    110     -1
9   香港特别行政区  None  None     810000    115     -1     -1
10      广东省   深圳市  None     440300     -1    120     -1
11      北京市  None  None     110000    128     -1     -1
12      广东省   广州市  None     440100     -1    143     -1

不仅如此,模块中还自带一些简单绘图工具,可以在地图上将上面输出的数据以热力图的形式画出来:

# 公众号: Python 实用宝典
# 2022/06/23

import cpca
from cpca import drawer

long_text = "对一个城市的评价总会包含个人的感情。如果你喜欢一个城市,很有可能是喜欢彼时彼地的自己。"\
    "在广州、香港读过书,工作过,在深圳买过房、短暂生活过,去北京出了几次差。"\
    "想重点比较一下广州、深圳和香港,顺带说一下北京。总的来说,觉得广州舒适、"\
    "香港精致、深圳年轻气氛好、北京大气又粗糙。答主目前选择了广州。"
df = cpca.transform_text_with_addrs(long_text, pos_sensitive=True)
drawer.draw_locations(df[cpca._ADCODE], "df.html")

运行的时候可能会报这个错:

(base) G:\push\20220623>python 1.py
Traceback (most recent call last):
  File "1.py", line 12, in <module>
    drawer.draw_locations(df[cpca._ADCODE], "df.html")
  File "G:\Anaconda3\lib\site-packages\cpca\drawer.py", line 41, in draw_locations
    import folium
ModuleNotFoundError: No module named 'folium'

使用pip安装即可:

pip install folium

然后重新运行代码,会在当前目录下生成 df.html, 双击打开,效果如下:

怎么用,是不是感觉非常方便?以后地点的识别用这个模块就完全够了。

还有更多的细节你可以访问这个项目的Github主页阅读,该项目的README完全中文编写,非常容易阅读:

https://github.com/DQinYuan/chinese_province_city_area_mapper

如果你无法访问GitHub,也可以在Python实用宝典公众号后台回复:cpca 下载完整项目。

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

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

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


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

Python 通过阿里云日志服务上传日志并监控告警

在我们的日常生活工作中,经常会遇到需要上传日志的场景,比如多台机器运行同一个程序,并且需要记录每台机器程序产生的日志,根据相关关键词告警,或者进行无数据告警,如果自己搭建这套系统需要耗费不少时间,因此如果能使用市面上现成的系统会很方便。

本文将教你如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务。

1.准备

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

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

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

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

pip install aliyun-log-python-sdk

接下来,登陆阿里云控制台,进入日志应用,通过下面的步骤创建日志Project和Logstore:

点击Python – SDK 写入,再根据你的需要创建Project和Logstore:

随后会进入这个页面,直接点击确定即可:

2.使用阿里云SDK上传Python日志

为了使用阿里云SDK上传日志,我们需要先获取Access Token, 将鼠标移动到右上角头像上点击AccessKey管理:

然后点击创建AccessKey,输入相关验证信息就能获取 accessKeyId 和 accessKey:

编写Python代码,配置AccessKey和你在第一步骤创建的Project及logstore名称:

from aliyun.log import LogClient, PutLogsRequest, LogItem, GetLogsRequest, IndexConfig
import time

# 配置AccessKey、服务入口、Project名称、Logstore名称等相关信息。
# 阿里云访问密钥AccessKey。更多信息,请参见访问密钥。
# 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维。
accessKeyId = "你的AccessKey ID"
accessKey = "你的AccessKey"
# 日志服务的域名。更多信息,请参见服务入口。此处以广州为例,其它地域请根据实际情况填写。
endpoint = "cn-guangzhou.log.aliyuncs.com"

# 创建日志服务Client。
client = LogClient(endpoint, accessKeyId, accessKey)

# Project名称。
project_name = "aliyun-test-project"
#Logstore名称
logstore_name = "aliyun-test-logstore"
# 查询语句。
query = "*| select dev,id from " + logstore_name
# from_time和to_time表示查询日志的时间范围,Unix时间戳格式。
from_time = int(time.time()) - 3600
to_time = time.time() + 3600

然后我们就可以编写Python代码创建索引(日志的索引可以理解为MySQL中的数据库)和插入日志了:

# 向Logstore写入数据。
def put_logs():
    print("ready to put logs for %s" % logstore_name)
    log_group = []
    for i in range(0, 100):
        log_item = LogItem()
        contents = [
            ('dev', 'test_put'),
            ('id', str(i))
        ]
        log_item.set_contents(contents)
        log_group.append(log_item)
    request = PutLogsRequest(project_name, logstore_name, "", "", log_group, compress=False)
    client.put_logs(request)
    print("put logs for %s success " % logstore_name)
    time.sleep(5)

if __name__ == '__main__':
    # 向Logstore写入数据。
    put_logs()

运行程序后出现对应的提示,说明日志上传成功:

python test.py
# ready to put logs for tradingview
# put logs for tradingview success 

进入控制台对应的Project,你会看到刚刚上传的日志已经显示在上面:

3.配置日志告警

日志告警的配置也非常简单,输入你的查询条件,获得输出后点击上方另存为告警:

在查询统计中添加你需要监控并触发告警的条件,比如我设置出现一次该日志的时候触发告警:

效果如下,我这里文本配置得太简单了,你也可以在标注中配置复杂一点的文本:

用起来挺方便的,如果你有类似的多机器日志监控服务,比如分布式模型训练监控、交易服务监控等等,可以考虑使用这个日志服务。

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

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

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


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

程序员延寿指南

原文:https://github.com/geekan/HowToLiveLonger

术语

  • ACM: All-Cause Mortality / 全因死亡率

目标

  • 稳健的活得更久

关键结果

  • 降低66.67%全因死亡率
  • 增加~20年预期寿命
  • 维持多巴胺于中轴

分析

  • 主要参考:对ACM的学术文献相对较多,可以作为主要参考
  • 增加寿命与ACM关系非线性:显然增加寿命与ACM关系是非线性函数,这里假设 DeltaLifeSpan=(1/(1-ACM)-1)*10
  • 变量无法简单叠加:显然各个变量之间并不符合独立同分布假设,变量之间的实际影响也并不明确
  • 存在矛盾观点:所有的证据都有文献/研究对应,但注意到:有些文献之间有显著矛盾的观点(如对于碳水摄入比例的矛盾);有些文献存在较大争议(如认为22点前睡觉会提升43%全因死亡率)
  • 研究仅表达相关:所有文献表明的更多是相关而非因果,在阅读时要考虑文献是否充分证明了因果 —— 如某文献表明了日均>=7000步的人有显著低的全因死亡率。但步数少的人可能包含更多长期病患,如果没有合理的排除这块数据,那此文献调查失真

行动

  • 输入
    • 固体:吃白肉(-3%~-11% ACM)、蔬果为主(-17%~-26% ACM),多吃辣(-23% ACM),多吃坚果(-4%~-27% ACM),少吃蛋黄(否则+7% ACM/0.5颗/天),中量碳水、多吃植物蛋白(-10% ACM)
    • 液体:喝咖啡(-12%~-22% ACM),喝牛奶(-10%~-17% ACM),喝茶(-8%~15% ACM),少喝或不喝甜味饮料(否则每天一杯+7% ACM,+多巴胺),戒酒或每周100g(纯酒精量(g)=饮酒量(ml)×酒精浓度(%)×酒精密度0.8g/ml)内(否则+~50% ACM,无上限)
    • 气体:不吸烟(否则+~50% ACM,-11~-12年寿命)
    • 光照:晒太阳(-~40% ACM)
    • 药物:二甲双胍(糖尿病人相比正常人可以+3年)、复合维生素(-8%癌症风险)、亚精胺(-30%~-60% ACM)、葡萄糖胺(-39% ACM)
  • 输出
    • 运动:每周3次45分钟挥拍运动(-47% ACM)
    • 日常:刷牙(-25% ACM)
    • 睡眠:每天睡7小时全因死亡率最低;且22-24点间最好,早睡+43% ACM,晚睡+15% ACM
  • 上下文
    • 体重:减肥(-54% ACM)

证据

输入

固体
  • 热量限制
    • 怎么看待BBC《进食、断食与长寿》?
      • 限制卡路里动物实验:CR(热量限制,即少吃)延迟了恒河猴的多种疾病发病和死亡率,与CR动物相比,正常喂养的猴子的各种疾病患病风险增加2.9倍,死亡风险增加3.0倍。
  • 综合
    • 最强营养搭配!BMJ:这么吃,心血管疾病和死亡风险更低
      • 通过对这些参与者的数据进行分析,研究人员发现碳水化合物(糖、淀粉和纤维)和蛋白质的摄入与全因死亡率呈非线性关系,而脂肪则与全因死亡率呈线性相关。其中,较高的糖分摄入与全因死亡风险和患心血管疾病的风险较高均有关联,而较高的饱和脂肪酸摄入与全因死亡风险较高有关。
      • 图1:各种营养元素与全因死亡之间的关系
  • 图2:各种营养元素与心血管疾病之间的关系
    • 进一步研究表明,在所有的饮食模式中,全因死亡率风险最低的饮食方式为:10-30g高纤维、14-30%蛋白质、10-25%单不饱和脂肪酸、5%-7%多不饱和脂肪酸以及20%-30%淀粉摄入。
    • 最优能量来源配比:<24%淀粉,15%-17%蛋白质,>15%单不饱和脂肪酸,<15%糖,6%饱和脂肪酸,6%多不饱和脂肪酸,30g+高纤维
液体

气体
  • 吸烟
    • 即使是低强度吸烟,也增加死亡风险!
      • 研究发现:在42 416名男性和86 735名女性(年龄在35-89岁之间,以前没有患病)中,18 985名男性(45%)和18 072名女性(21%)目前吸烟,其中33%的男性吸烟者和39%的女性吸烟者并不每天吸烟。8866名男性(21%)和53 912名女性(62%)从不吸烟。在随访期间,与从不吸烟相比,每天<10支烟或每天≥10支烟的全因死亡率危险比分别为1.17(95%置信区间1.10-1.25)和1.54(1.42-1.67)。无论年龄或性别,危险比相似。与每日吸烟关系最密切的疾病是呼吸道癌症、慢性阻塞性肺病和胃肠道及血管疾病。在招募时已经戒烟的人的死亡率低于现在每天吸烟者。
      • 吸烟者平均减少寿命11-12年
    • 吸烟让人过瘾是什么原理?有节制的吸烟依旧有害吗?
光照
药物
  • 复合维生素
  • 葡萄糖胺
    • 神奇!氨糖降低心血管死亡率65%,与定期运动效果相当
    • 美国西弗吉尼亚大学最新研究发现 氨糖(软骨素) 可以降低心血管死亡率65%,降低总体死亡率39%,效果与坚持定期运动相对
    • 该研究使用1999年至2010年,16,686名成年人的国家健康和营养检查(NHANES)数据,参与者的中位追踪时间为107个月,而其中有648位参与者定期且每服用日500-1000毫克的葡萄糖胺/软骨素一年以上。
  • 亚精胺
    • Science:科学背书!从精液中发现的亚精胺,竟然有着抗衰老、抗癌、保护心血管和神经、改善肥胖和2型糖尿病等逆天神效
    • 亚精胺是最容易从人体肠道吸收的多胺。许多的食物中都含有大量的亚精胺,例如新鲜的青椒、小麦胚芽、花椰菜、西兰花、蘑菇和各种奶酪,尤其在纳豆等大豆制品、香菇和榴莲中含量更高。在本实验中,研究人员选择了829位年龄在45-84岁之间的参与者进行了为期20年的随访,分析了饮食中亚精胺摄入量与人类死亡率之间的潜在关联。
    • 研究发现,女性的亚精胺摄入量高于男性,并且摄入量都会随着年龄的增长而下降。亚精胺的主要来源是全谷物(占13.4%)、苹果和梨(占13.3%)、沙拉(占9.8%)、芽菜(占7.3%)和马铃薯(占6.4%)。研究根据亚精胺摄入量将人群分为三组,低摄入量组(<62.2 µmol / d)、中摄入量组(62.2–79.8 µmol / d)和高摄入量组(> 79.8 µmol / d)。随访期间共记录了341例死亡,其中血管疾病137例,癌症94例,其他原因110例。经计算低中高三组的粗略死亡率分别为40.5%、23.7%和15.1%,这些数据表明亚精胺摄入量与全因死亡率之间的负相关关系显著。随着逐步对年龄、性别和热量的比例进行调整,这种相关关系依然显著。
  • 综合

输出

挥拍运动
走路
刷牙
泡澡
  • 定期洗澡降低心血管疾病发作风险
    • 与每周一至两次泡澡或根本不泡澡相比,每天洗热水澡可以降低28%的心血管疾病总风险,降低26%的中风总风险,脑出血风险下降46%。而浴缸浴的频率与心源性猝死的风险增加无关。
做家务(老年男性)
  • Housework Reduces All-Cause and Cancer Mortality in Chinese Men
    • 72岁之后男性每周做重型家务可以减少29%平均死亡率
    • 重型家务:吸尘、擦地板、拖地、擦洗窗户、洗车、搬动家具、搬煤气罐等等。
    • 轻型家务:掸灰尘、洗碗、手洗衣服、熨烫、晾衣服、做饭、买日用品等等。
睡眠

上下文

情绪
  • 悲观情绪与更高的全因死亡率和心血管疾病死亡率有关,但乐观情绪并不能起到保护作用
    • 在1993-1995年间,一项针对50岁以上澳大利亚人健康的双胞胎研究中包括了生活取向测试(LOT),其中包含乐观和悲观的项目。平均20年后,参与者与来自澳大利亚国家死亡指数的死亡信息相匹配。在2,978名具有很多可用分数的参与者中,有1,068人死亡。生存分析测试了各种乐观因素和悲观情绪分数与任何原因,癌症,心血管疾病或其他已知原因的死亡率之间的关联。年龄调整后的悲观量表上的核心与全因和心血管疾病死亡率相关(每1个标准差单位的危险比,95%置信区间和p值1.134、1.065–1.207、8.85×10 –5和1.196、1.045–1.368、0.0093 ),但不会因癌症死亡。乐观得分与悲观得分之间的相关性很弱(年龄调整后的等级相关系数= − 0.176),但与总死亡率或特定原因死亡率没有显着相关性。反向因果关系(引起悲观情绪的疾病)是不可能的,因为在那种情况下,心血管疾病和癌症都会导致悲观情绪。
贫富
  • JAMA子刊:贫富差距真能影响寿命?这可能是真的!
    • 该研究使用1994-1996年第一次收集的数据,并通过生存模型来分析净资产和长寿之间的关联。结果显示,共收纳5414 名参与者,平均年龄为 46.7岁,包括 2766 名女性。较高的净资产与较低的死亡风险相关。特别是在兄弟姐妹和双胞胎中(n = 2490),在较高的净资产和较低的死亡率之间观察到类似的关联,表明拥有更多财富的兄弟姐妹或双胞胎比拥有更少财富的兄弟姐妹/双胞胎活得更久。
体重
  • JAMA子刊:减肥要趁早,才能有效降低死亡率风险
    • 对体重减轻的死亡率风险评估发现,体重从肥胖减轻到超重的成年人与稳定肥胖人群相比,全因死亡率降低了54%(危险比为0.46),然而从成年初期的超重减轻到中年以前的正常体重的人群的死亡率风险并未降低(风险比为1.12)。
新冠

超美!教你用 Python 拍摄游戏延时摄影

为什么要拍摄游戏延时摄影?这个时代,随着游戏引擎技术的快速发展,游戏画面越来越精美,许多人迷上了游戏内的角色、场景。尤其是端游,显卡技术能够支撑精美的游戏画面,最有名的莫过于《地平线》系列游戏。

很多玩家希望拍摄这些精美游戏中的画面,尤其是希望能拍摄到游戏内不同时刻的画面,为了满足这个需求,我们就需要用上延时摄影。游戏内的时间过得比现实世界更快,一个小时内可能你就能经历白天的夜晚的变化,这也为延时摄影提供了很好的环境。

那么究竟怎么在拍摄中实现延时的效果呢?方法大致有两种,最简单的可以先录制视频,然后用后期剪辑软件或者特效软件通过丢帧的方法实现,但这样一来便造成了巨大的浪费。拍几个小时的视频,如果通过丢帧实现延时效果,最后转换为几十分钟的片段,那么被丢掉的帧就要比最后留下的多得多。如果要实现更高速的画面运动,这种浪费无疑将会被更加扩大。

本篇教程介绍第二种方法,定时截图的形式,我们将结合前面Python实用宝典使用过的三个模块——moviepy、win32gui 及 PIL 为大家讲解如何使用Python在游戏中实现延时摄影,我还将教你如何将图片拼接成视频、添加背景音乐一条龙操作。

1.准备

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

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

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

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

pip install moviepy
pip install pypiwin32
pip install pillow

本文所有代码均开源在:https://github.com/Ckend/python-time-lapse-photo 仓库,如果你无法访问GitHub,也可以在Python实用宝典后台回复 延时摄影 下载。

2.游戏延时摄影—定时”拍摄”

为了实现定时拍摄的逻辑,我们需要用到pypiwin32模块和pillow模块,在之前的这篇文章中有介绍过:

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

分为三个步骤:

1. 获得游戏窗口界面

2. 获得游戏界面大小

3. 截图

每隔N秒定时循环执行以上三个步骤,代码如下:

# main.py
# Python实用宝典
# 2022-03-25
import time
import win32gui
from PIL import ImageGrab


def get_window_pos(name):
    name = name
    handle = win32gui.FindWindow(0, name)
    if handle == 0:
        return None
    else:
        return win32gui.GetWindowRect(handle), handle

while True:
    try:
        (x1, y1, x2, y2), handle = get_window_pos('极限竞速:地平线 4')
        win32gui.SetForegroundWindow(handle)
        img_ready = ImageGrab.grab((x1, y1, x2, y2))
        img_ready.save(f"./result/{time.time()}.jpg")
        time.sleep(5)
    except Exception as e:
        print(e)

请注意,”极限竞速:地平线 4″ 要改成你对应拍摄的游戏名称,这样,运行程序后就会自动在result文件夹下定时生成截图:

成功截取你想要的时间段的场景图片后,就可以进行下面的拼接和补充背景音乐部分。

3.拼接延时摄影视频

为了达到延时摄影的效果,我们在这一部分中将使用moviepy模块,拼接所有图片到一个视频中。

当然还要补充背景音乐,代码其实非常简单:

# jointer.py
# Python实用宝典
# 2022-03-25
import os
import moviepy
import moviepy.video.io.ImageSequenceClip
from moviepy.editor import *

def pics2video(frames_dir, video_dst, music, fps=10):
    """
    图片合成MP4

    Args:
        frames_dir (str): 图片目录
        video_dst (str): 目标目录
        fps (int, optional): 帧数. Defaults to 25.
    """
    frames_name = sorted(os.listdir(frames_dir))
    frames_path = [frames_dir+frame_name for frame_name in frames_name]
    clip = moviepy.video.io.ImageSequenceClip.ImageSequenceClip(frames_path, fps=fps)
    
    audio_clip = AudioFileClip(music).volumex(0.5)
    audio = afx.audio_loop( audio_clip, duration=clip.duration)
    final_video = clip.set_audio(audio)

    final_video.write_videofile(video_dst, codec='libx264')

music = '打上花火.mp3'
frames_dir = './result/'
video_dst = 'screenshots.mp4'
pics2video(frames_dir, video_dst, music)

1.将你的音乐放在当前目录下,修改music变量为对应的文件名。

2.调整你想要的fps参数—帧数,这个值越低,画面越顺畅。

运行此文件后就会在当前文件夹下生成 ‘screenshots.mp4’. 这个就是我们的处理结果了,双击打开试试吧。

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

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

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


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