分类目录归档:Python 办公

Python paddleseg 图像分割实战教程 — 眼底识别

在人工智能领域中,有一项非常关键的技术,那就是图像分割

图像分割是指将图像中具有特殊意义的不同区域划分开来, 这些区域互不相交,每个区域满足灰度、纹理、彩色等特征的某种相似性准则。

比如上图识别视盘。视盘是视网膜中的关键解剖学结构,其形状、面积和深度等参数是衡量眼底健康状况的重要指标,准确定位和分割视盘区域是眼底图像分析和处理的关键步骤。

在人工智能的辅助下,只需要数秒,即可初步判断被检者是否存在眼底疾病,这将有助缓解专业眼科医生不足的瓶颈,开启眼底疾病的基层筛查新模式。而图像分割就是实现这项功能的基础,可见其重要性。

下面就给大家讲讲如何基于 PaddlePaddle 平台,训练并测试一个视盘图像分割的基本模型。

1.Python 准备

为了实现这个实验,Python 是必不可少的,如果你还没有安装 Python,建议阅读我们的这篇文章:超详细Python安装指南

在安装前,确认自己需要的 PaddlePaddle 版本,比如 GPU版 或 CPU版,GPU 在计算上具有绝对优势,但是如果你没有一块强力的显卡,建议选择CPU版本。

(GPU版) 如果你想使用GPU版,请确认本机安装了 CUDA 计算平台及 cuDNN,它们的下载地址分别是:
https://developer.nvidia.com/cuda-downloads
https://developer.nvidia.com/cudnn-download-survey

具体 CUDA 和 cuDNN 对应的版本要求如下:

  • CUDA 工具包10.1/10.2配合cuDNN v7.6+
  • CUDA 工具包11.2配合cuDNN v8.1.1

CUDA安装流程很简单,下载exe程序,一路往下走。cuDNN安装流程复杂一些,你需要转移压缩包解压后的部分文件到CUDA中,具体可见这篇cuDNN的官方安装指引:
https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html

(CPU版)CPU版安装过程比较简单,直接按照下面 PaddlePaddle 的安装指引输入命令即可。


(通用)选择完你想要安装的版本,并做好基础工作后,接下来就是安装 PaddlePaddle 的具体步骤,打开安装指引流程页面:
https://www.paddlepaddle.org.cn/install/quick

根据你自己的情况选择这些选项,最后一个选项计算平台指的是 GPU 加速工具包或CPU,如果你不想用GPU,请选CPU版;想用GPU版的同学请按刚刚下载的CUDA版本进行选择。

选择完毕后下方会出现安装信息,输入安装信息里的命令即可安装成功,不得不说,PaddlePaddle 这些方面做的还是比较贴心的。

在页面下方还有具体的从头到尾的安装步骤,对 Python 基本的虚拟环境安装流程不了解的同学可以看着这些步骤进行安装。

2.初尝paddleseg图像分割

安装完 paddle 后,为了能够实现图像分割功能,我们还需要安装 paddleseg:

pip install paddleseg

并克隆 paddleseg的代码库(如果克隆不了,请在Python实用宝典公众号后台回复:图像分割 下载):

git clone https://github.com/PaddlePaddle/PaddleSeg.git

克隆完成,进入代码库文件夹:

cd PaddleSeg

执行下面命令,并在 PaddleSeg/output 文件夹中出现预测结果,则证明安装成功。

python predict.py \
       --config configs/quick_start/bisenet_optic_disc_512x512_1k.yml \
       --model_path https://bj.bcebos.com/paddleseg/dygraph/optic_disc/bisenet_optic_disc_512x512_1k/model.pdparams\
       --image_path docs/images/optic_test_image.jpg \
       --save_dir output/result

预测结果如下:

3.训练模型

前面只是利用了 PaddlePaddle 提前训练好的数据进行预测,下面我们要尝试自己训练一个模型。

为了训练模型,我们需要获得眼底训练集。事实上,在前面 初尝 Paddleseg 中,我们便获得了一份眼底训练集,其路径是 PaddleSeg\data\optic_disc_seg.

如果你没有进行 初尝 Paddleseg 这一节,也想要获取训练集数据的话,在Python实用宝典公众号后台回复:图像分割 下载。下载后解压数据集,得到一个optic_disc_seg文件夹,将其放到 PaddleSeg 代码库的 data 文件夹下。

配置化训练

PaddleSeg 提供了配置化驱动进行模型训练。他们在配置文件中详细列出了每一个可以优化的选项,用户只要修改这个配置文件就可以对模型进行定制。

所有的配置文件在PaddleSeg/configs文件夹下面

每一个文件夹代表一个模型,里面包含这个模型的所有配置文件。

在PaddleSeg的配置文件给出的学习率中,除了”bisenet_optic_disc_512x512_1k.yml”中为单卡学习率外,其余配置文件中均为4卡的学习率,因此如果你是单卡训练,则学习率设置应变成原来的1/4。

为了简化学习难度,我们继续以”bisenet_optic_disc_512x512_1k.yml”文件为例,修改部分参数进行训练,下面是这个配置的全部说明:

batch_size: 4  #设定batch_size的值即为迭代一次送入网络的图片数量,一般显卡显存越大,batch_size的值可以越大
iters: 1000    #模型迭代的次数

train_dataset: #训练数据设置
  type: OpticDiscSeg #选择数据集格式
  dataset_root: data/optic_disc_seg #选择数据集路径
  num_classes: 2 #指定目标的类别个数(背景也算为一类)
  transforms: #数据预处理/增强的方式
    - type: Resize #送入网络之前需要进行resize
      target_size: [512, 512] #将原图resize成512*512在送入网络
    - type: RandomHorizontalFlip #采用水平反转的方式进行数据增强
    - type: Normalize #图像进行归一化
  mode: train

val_dataset: #验证数据设置
  type: OpticDiscSeg #选择数据集格式
  dataset_root: data/optic_disc_seg #选择数据集路径
  num_classes: 2 #指定目标的类别个数(背景也算为一类)
  transforms: #数据预处理/增强的方式
    - type: Resize  #将原图resize成512*512在送入网络
      target_size: [512, 512]  #将原图resize成512*512在送入网络
    - type: Normalize #图像进行归一化
  mode: val

optimizer: #设定优化器的类型
  type: sgd #采用SGD(Stochastic Gradient Descent)随机梯度下降方法为优化器
  momentum: 0.9 #动量
  weight_decay: 4.0e-5 #权值衰减,使用的目的是防止过拟合

learning_rate: #设定学习率
  value: 0.01  #初始学习率
  decay:
    type: poly  #采用poly作为学习率衰减方式。
    power: 0.9  #衰减率
    end_lr: 0   #最终学习率

loss: #设定损失函数的类型
  types:
    - type: CrossEntropyLoss #损失函数类型
  coef: [1, 1, 1, 1, 1]
  #BiseNetV2有4个辅助loss,加上主loss共五个,1表示权重 all_loss = coef_1 * loss_1 + .... + coef_n * loss_n

model: #模型说明
  type: BiSeNetV2  #设定模型类别
  pretrained: Null #设定模型的预训练模型

你可以尝试调整部分参数进行训练,看看你自己训练的模型效果和官方给出的模型的效果的差别。

开始训练

(GPU版)在正式开启训练前,我们需要将CUDA设置为目前有1张可用的显卡:

set CUDA_VISIBLE_DEVICES=0 # windows
# export CUDA_VISIBLE_DEVICES=0 # linux

输入训练命令开始训练:

python train.py \
       --config configs/quick_start/bisenet_optic_disc_512x512_1k.yml \
       --do_eval \
       --use_vdl \
       --save_interval 500 \
       --save_dir output
训练参数解释
参数名用途是否必选项默认值
iters训练迭代次数配置文件中指定值
batch_size单卡batch size配置文件中指定值
learning_rate初始学习率配置文件中指定值
config配置文件
save_dir模型和visualdl日志文件的保存根路径output
num_workers用于异步读取数据的进程数量, 大于等于1时开启子进程读取数据0
use_vdl是否开启visualdl记录训练数据
save_interval_iters模型保存的间隔步数1000
do_eval是否在保存模型时启动评估, 启动时将会根据mIoU保存最佳模型至best_model
log_iters打印日志的间隔步数10
resume_model恢复训练模型路径,如:output/iter_1000None
keep_checkpoint_max最新模型保存个数5

见到如下的界面,说明你已经开始训练了:

4.训练过程可视化

PaddlePaddle 还提供了可视化分析工具:VisualDL,让我们的网络训练过程更加直观。

当打开use_vdl开关后,PaddleSeg会将训练过程中的数据写入VisualDL文件,可实时查看训练过程中的日志。记录的数据包括:

  1. loss变化趋势
  2. 学习率变化趋势
  3. 训练时间
  4. 数据读取时间
  5. mean IoU变化趋势(当打开了do_eval开关后生效)
  6. mean pixel Accuracy变化趋势(当打开了do_eval开关后生效)

使用如下命令启动VisualDL查看日志

# 下述命令会在127.0.0.1上启动一个服务,支持通过前端web页面查看,可以通过--host这个参数指定实际ip地址
visualdl --logdir output/

在浏览器输入提示的网址,效果如下:

如图所示,打开 http://127.0.0.1:8040/ 页面,效果如下:

5.模型测试评估

训练完成后,用户可以使用评估脚本val.py来评估模型效果。

假设训练过程中迭代次数(iters)为1000,保存模型的间隔为500,即每迭代1000次数据集保存2次训练模型。

因此一共会产生2个定期保存的模型,加上保存的最佳模型best_model,一共有3个模型,可以通过model_path指定期望评估的模型文件。

python val.py \
       --config configs/quick_start/bisenet_optic_disc_512x512_1k.yml \
       --model_path output/iter_1000/model.pdparams

在图像分割领域中,评估模型质量主要是通过三个指标进行判断,准确率(acc)、平均交并比(Mean Intersection over Union,简称mIoU)、Kappa系数。

  • 准确率:指类别预测正确的像素占总像素的比例,准确率越高模型质量越好。
  • 平均交并比:对每个类别数据集单独进行推理计算,计算出的预测区域和实际区域交集除以预测区域和实际区域的并集,然后将所有类别得到的结果取平均。在本例中,正常情况下模型在验证集上的mIoU指标值会达到0.80以上,显示信息示例如下所示,第2行的mIoU=0.8609即为mIoU。
  • Kappa系数:一个用于一致性检验的指标,可以用于衡量分类的效果。Kappa系数越高模型质量越好。

随着评估脚本的运行,最终打印的评估日志如下。

76/76 [==============================] - 6s 84ms/step - batch_cost: 0.0835 - reader cost: 0.0029
2021-06-05 19:38:53 [INFO]      [EVAL] #Images: 76 mIoU: 0.8609 Acc: 0.9945 Kappa: 0.8393
2021-06-05 19:38:53 [INFO]      [EVAL] Class IoU:
[0.9945 0.7273]
2021-06-05 19:38:53 [INFO]      [EVAL] Class Acc:
[0.9961 0.8975]

可以看到,我改了参数后的训练效果还是不错的。

6.效果可视化

除了分析模型的IOU、ACC和Kappa指标之外,我们还可以查阅一些具体样本的切割样本效果,从Bad Case启发进一步优化的思路。

predict.py脚本是专门用来可视化预测案例的,命令格式如下所示

python predict.py \
       --config configs/quick_start/bisenet_optic_disc_512x512_1k.yml \
       --model_path output/iter_1000/model.pdparams \
       --image_path data/optic_disc_seg/JPEGImages/H0003.jpg \
       --save_dir output/result

运行完成后,打开 output/result 文件夹。我们选择1张图片进行查看,效果如下。

我们可以直观的看到模型的切割效果和原始标记之间的差别,从而产生一些优化的思路,比如是否切割的边界可以做规则化的处理等。

大家也可以尝试自己标注一个数据集进行图像分割,你只要按照 PaddleSeg\data\optic_disc_seg 里面那样组织图片结构,就可以复用这些训练、评估的过程。

本文部分内容摘自: PaddleSeg官方文档

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

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

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

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

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

实用的 Python 汉字转拼音工具 — pypinyin 实战教程

Pypinyin 将汉字转拼音,可以用于批量汉字注音、文字排序、拼音检索文字等常见场景。

现在互联网上有许多拼音转换工具,基于Python的开源模块也不少,今天给大家介绍一个功能特性最多的模块: pypinyin,它支持以下特性:

  • 1. 根据词组智能匹配最正确的拼音。
  • 2. 支持多音字。
  • 3. 简单的繁体支持, 注音支持。
  • 4. 支持多种不同拼音/注音风格。
  • 5. 命令行工具一键转化

1.准备

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

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

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

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

pip install pypinyin

2.汉字转拼音 基本使用

最普通的拼音转化方法如下:

# Python实用宝典
from pypinyin import pinyin, lazy_pinyin, Style
pinyin('中心')
# [['zhōng'], ['xīn']]

识别多音字:

# Python实用宝典
from pypinyin import pinyin, lazy_pinyin, Style
pinyin('中心', heteronym=True)  # 启用多音字模式
# [['zhōng', 'zhòng'], ['xīn']]

设置输出风格,只识别首字母:

# Python实用宝典
from pypinyin import pinyin, lazy_pinyin, Style
pinyin('中心', style=Style.FIRST_LETTER)  # 设置拼音风格
# [['z'], ['x']]

修改音调输出位置,在相应字母的后面显示音调,或者拼音的最后显示音调:

# Python实用宝典
from pypinyin import pinyin, lazy_pinyin, Style

# TONE2 在相应字母的后面显示音调
pinyin('中心', style=Style.TONE2, heteronym=True)
# [['zho1ng', 'zho4ng'], ['xi1n']]

# TONE3 拼音的最后显示音调
pinyin('中心', style=Style.TONE3, heteronym=True)
# [['zhong1', 'zhong4'], ['xin1']]

不考虑多音字的情况:

# Python实用宝典
from pypinyin import pinyin, lazy_pinyin, Style
lazy_pinyin('中心')  # 不考虑多音字的情况
# ['zhong', 'xin']

不使用v来代替ü:

# Python实用宝典
from pypinyin import pinyin, lazy_pinyin, Style
lazy_pinyin('战略', v_to_u=True)  # 不使用 v 表示 ü
# ['zhan', 'lüe']

标记轻声:

# Python实用宝典
from pypinyin import pinyin, lazy_pinyin, Style
# 使用 5 标识轻声
lazy_pinyin('衣裳', style=Style.TONE3, neutral_tone_with_five=True)
# ['yi1', 'shang5']

使用命令行一键识别拼音:

# Python实用宝典
python -m pypinyin 音乐
# yīn yuè

3.Pypinyin 高级使用

自定义拼音显示风格

我们还可以通过 register() 来实现自定义拼音风格的需求:

from pypinyin import lazy_pinyin

from pypinyin.style import register

@register('kiss')
def kiss(pinyin, **kwargs):
    return '😘 {0}'.format(pinyin)

  
lazy_pinyin('么么', style='kiss')
# ['😘 me', '😘 me']

可以见到,通过定义一个 kiss 函数,使用 register 装饰器,我们生成了一个新的 style,这个 style 可以直接被用于拼音的转换参数,非常方便。

另外,所有模块自带的 style 及其效果如下:

@unique
class Style(IntEnum):
    """拼音风格"""

    #: 普通风格,不带声调。如: 中国 -> ``zhong guo``
    NORMAL = 0
    #: 标准声调风格,拼音声调在韵母第一个字母上(默认风格)。如: 中国 -> ``zhōng guó``
    TONE = 1
    #: 声调风格2,即拼音声调在各个韵母之后,用数字 [1-4] 进行表示。如: 中国 -> ``zho1ng guo2``
    TONE2 = 2
    #: 声调风格3,即拼音声调在各个拼音之后,用数字 [1-4] 进行表示。如: 中国 -> ``zhong1 guo2``
    TONE3 = 8
    #: 声母风格,只返回各个拼音的声母部分(注:有的拼音没有声母,详见 `#27`_)。如: 中国 -> ``zh g``
    INITIALS = 3
    #: 首字母风格,只返回拼音的首字母部分。如: 中国 -> ``z g``
    FIRST_LETTER = 4
    #: 韵母风格,只返回各个拼音的韵母部分,不带声调。如: 中国 -> ``ong uo``
    FINALS = 5
    #: 标准韵母风格,带声调,声调在韵母第一个字母上。如:中国 -> ``ōng uó``
    FINALS_TONE = 6
    #: 韵母风格2,带声调,声调在各个韵母之后,用数字 [1-4] 进行表示。如: 中国 -> ``o1ng uo2``
    FINALS_TONE2 = 7
    #: 韵母风格3,带声调,声调在各个拼音之后,用数字 [1-4] 进行表示。如: 中国 -> ``ong1 uo2``
    FINALS_TONE3 = 9
    #: 注音风格,带声调,阴平(第一声)不标。如: 中国 -> ``ㄓㄨㄥ ㄍㄨㄛˊ``
    BOPOMOFO = 10
    #: 注音风格,仅首字母。如: 中国 -> ``ㄓ ㄍ``
    BOPOMOFO_FIRST = 11
    #: 汉语拼音与俄语字母对照风格,声调在各个拼音之后,用数字 [1-4] 进行表示。如: 中国 -> ``чжун1 го2``
    CYRILLIC = 12
    #: 汉语拼音与俄语字母对照风格,仅首字母。如: 中国 -> ``ч г``
    CYRILLIC_FIRST = 13

处理特殊字符

默认情况下,对于文字中的特殊字符会不做任何处理,原样返回:

pinyin('你好☆☆')
# [['nǐ'], ['hǎo'], ['☆☆']]

不过如果你想对这些特殊字符做处理也是可以的,比如:

ignore : 忽略该字符

pinyin('你好☆☆', errors='ignore')
# [['nǐ'], ['hǎo']]

replace : 替换为去掉 \u 的 unicode 编码:

pinyin('你好☆☆', errors='replace')
# [['nǐ'], ['hǎo'], ['26062606']]

callable 对象 : 提供一个回调函数,接受无拼音字符(串)作为参数, 支持的返回值类型: unicode 或 list 或 None 。:

pinyin('你好☆☆', errors=lambda x: 'star')
# [['nǐ'], ['hǎo'], ['star']]

pinyin('你好☆☆', errors=lambda x: None)
# [['nǐ'], ['hǎo']]

返回值类型为 list 时,会自动 expend list

pinyin('你好☆☆', errors=lambda x: ['star' for _ in x])
# [['nǐ'], ['hǎo'], ['star'], ['star']]

# 指定多音字
pinyin('你好☆☆', heteronym=True, errors=lambda x: [['star', '☆'] for _ in x])
# [['nǐ'], ['hǎo'], ['star', '☆'], ['star', '☆']]

自定义拼音库

如果你觉得模块输出效果不合你意,或者你想做特殊处理,可以通过  load_single_dict() 或 load_phrases_dict() 以自定义拼音库的方式修正结果:

from pypinyin import lazy_pinyin, load_phrases_dict, Style, load_single_dict
hans = '桔子'
lazy_pinyin(hans, style=Style.TONE2)
# ['jie2', 'zi3']
load_phrases_dict({'桔子': [['jú'], ['zǐ']]})  # 增加 "桔子" 词组
lazy_pinyin(hans, style=Style.TONE2)
# ['ju2', 'zi3']

hans = '还没'
lazy_pinyin(hans, style=Style.TONE2)
# ['hua2n', 'me2i']
load_single_dict({ord('还'): 'hái,huán'})  # 调整 "还" 字的拼音顺序
lazy_pinyin('还没', style=Style.TONE2)
# ['ha2i', 'me2i']

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

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

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

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

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

用 Python 写的百度API文档批量翻译工具竟然这么好用

本文将给大家分享一个实用的 Python 办公自动化脚本 「 利用 Python 批量翻译英文 Word 文档并保留格式」,最终效果甚至比部分收费的软件还要好!先来看看具体的工作内容

一、需求描述

手上有大量外文文档(本案例以 份为例,分别命名为 test1.docx test2.docx 以此类推),其中一份如下:

基本需求「批量将这些文档的内容全部翻译成中文,并转存到新的文件中」,效果如下:

高级需求:基本需求满足的同时,要求 「保留原文档的格式」,效果如下:

二、批量翻译逻辑梳理

1. 翻译 API

本需求的核心是翻译,策略是利用网络的翻译 API,这里推荐百度翻译开放平台,不考虑并发数的话可以用标准版,免费使用不限字符量

百度翻译开放平台:http://api.fanyi.baidu.com/api/trans/product/index

在使用百度的通用翻译 API 之前需要完成以下工作:

  1. 使用百度账号登录百度翻译开放平台(http://api.fanyi.baidu.com);
  2. 注册成为开发者,获得APPID;
  3. 进行开发者认证(如仅需标准版可跳过);
  4. 开通通用翻译API服务:开通链接
  5. 参考技术文档和Demo编写代码

完成后在个人页面在即可看到 ID 和密钥,这个很重要!下面给出整理好的通用翻译 API 的 demo,已经对输出做简单修改,代码拿走就能用!

可以看到,测试内容准确的被翻译出来,注意如果需要多次访问 API,免费版有并发数和时间限制,可以用 time 模块睡眠一秒

2. 格式修改

高级需求的难点就是保留格式,简单来说原文档的页面格式和段落格式是什么,翻译后对应的部分就是什么。

基于上述的逻辑关系,只需要获取原文档的对应内容再赋值给新翻译的文档即可。(暂时只能满足页面设置和段落设置的统一,针对一段中特定词语的格式修改,保证精确性需要基于自然语言处理NLP,本文暂不涉及)

2.1 页面样式

页面样式只要包括边距、方向、高度、宽度等等,从原文档中可以看到,采取的是窄边距。但我们无需知道窄边距四个方向应该如何设置,只需要在代码中呈现新旧文档的变量传递即可,具体如下

2.2 段落样式

段落样式包括对齐、缩进、间距等等,原文档中采取了段后缩进,标题是居中对齐。这些设置在变量传递中能够很好完成。如果原文档中没有设置的变量值为 None

2.3 文字块样式修改

对于字号、加粗、斜体、颜色等样式调整,采取的策略是建立空列表,遍历原文档每一段每一个文字块,获取相应属性并放到各自的列表中,对同一段而言,其包含的文字块属性最多的选项赋值给翻译后文档的对应段落(如同一段全部或大部分的文字是加粗,则翻译后对应段落所有文字块均设置为加粗)
对NLP感兴趣的读者可自行尝试如何高度还原英文文档中某些特定词语的样式修改,并在翻译后的文档中体现出来

上面的代码不包含对字体的设置,因为没必要把英文的字体传递给中文文档。对中文字体的设置之前的文章有提到过,比较复杂,直接见代码:

from docx.oxml.ns import qn

run.font.name = '微软雅黑'
r = run._element.rPr.rFonts
r.set(qn('w:eastAsia'), '微软雅黑')

3. 整体实现步骤

现在每个部分操作均以完成,考虑到本例中有多个文档均需要翻译,故全部逻辑如下:

  1. 利用 glob 模块批处理框架可获取某个文件的绝对路径
  2. python-docx 完成 Word 文件实例化后对段落进行解析
  3. 解析出的段落文本交给百度通用翻译 API,解析返回的 Json 格式结果(上面的修改 demo 中已经完成了这一步)并重新写入新的文件
  4. 同个文件全部解析、翻译并写入新文件后保存文件

三、代码实现 – 实战教程

导入需要的模块,除翻译 demo 中需要的库外还需要 glob 库批量获取文件、python-docx 读取文件、time 模块控制访问并发。为什么要 os 模块见下文:

import requests
import random
import json
from hashlib import md5
import time
from docx import Document
import glob
import os

对原 demo 的部分内容进行保留,涉及到 query 参数的代码需要移动到后面的循环中。保留的部分:

效果如下

获取到段落文本后,可以将段落文本赋值给 query 参数,调用 API demo 的后续代码。输出结果的同时用 add_paragraph 将结果写入新文档:

最后保存成新文件,期望命名为 原文件名_translated 的形式,可用 os.path.basename 方法获取并经字符串拼接达到目的:

wordfile_new.save(path + r'\\' + os.path.basename(file)[:-5] + '_translated.docx')

单个文件操作完成后将读取和创建文件的代码块放到批处理框架内:

完成了上面的内容后,基本需求就完成了。根据我们梳理的对样式的修改知识,再把样式调整的代码加进来就行了,最终完整代码如下:

代码运行完毕后得到五个新的翻译后文件

翻译效果如下,可以看到英文被翻译成中文,并且样式大部分保留!

至此,所有文档都被成功翻译,当然这是机器翻译的,具体应用时还需要对关键部分进一步人工调整,不过整体来说还是一次成功的 Python 办公自动化尝试!

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

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

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

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

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

Jupyter 中 IPython 可以用的12个方便命令

我在日常编程中一般都会用到两个工具——Pycharm和Jupyter,在刷算法、写爬虫时会用到前者,因为我习惯用Pycharm里的Debug功能调试,很容易找出代码中的Bug。而进行数据分析、机器学习时就会用到后者,因为Jupyter编译器利用的IPython是一种交互式计算和开发环境,而且有许多方便命令。
Jupyter对数据的可视化十分友好,这类单元格的形式每一步都有运行结果,便于整理自己思路,并且很大程度上节约了运行时间,在调试的时候只需要运行出错的部分代码,而不是全部。

IPython中有一些特有的魔法命令,如果能合理的利用这些魔法命令,会省去很多不必要的操作,为编程带来很大程度的便利,下面就来安利十二个常用的魔法命令。

方便命令的基础常识

  • ?和?? ->例:%matplotlib?、%matplotlib??

后缀为?可以获取一个对象的相关信息,比如描述一个方法该怎么用;后缀为??可以获取该对象更加详细的信息,比如源码。这个对象可以是IPython中自带的、也可以是导入的、也可以是自己定义的。

  • %和%% ->例:%time、%%time

前缀为%被称作行魔法命令(line magics),只能在单个输入行上运行;前缀为%%被称作单元格魔法命令(cell magics),可以在多个输入行上运行。

1.%Ismagic和%magic

如果你还不了解IPython的魔法命令,那这两个魔法命令一定是最重要的,记牢这两个命令之后慢慢了解剩下的。%lsmagic的作用就是列出所有存在的行魔法命令和单元格魔法命令,部分截图如下:

%magic的作用就是给出所有魔法命令的详细介绍,比如介绍、样例等等,比较考验英语功底,耐下心慢慢了解。

2.%pdb

输入这个命令并且运行之后,如果后面的代码出现了异常,这个指令就会主动进入调试器,几十行几百行代码难免会有几个或一堆Bug。可能比较笨的方法就是找断点然后print,最后还要把print删掉,而%pdb调试找到Bug后直接退出就好,相对前者更方便些。

比如两个数相加,不小心把一个整数定义成字符型,在调用函数计算时会发生报错,然后就可以进入调试器进行调试,切记最后要通过exit()退出,不能直接终止单元格运行。

3.%debug

%debug的作用与%pdb几乎是一样的,不同之处就是%pdb在遇到异常自动进入调试器,而%debug是人遇到报错主动输入指令进入调试器,仍然是上面那个例子,调试界面如下:
主动和被动两种调试方式大家可以靠自己喜好选择,我个人比较喜欢%debug。

4.%who和%whos

代码一多变量可能就会变多,变量一多可能就会混淆,或者在删除单元格的时候不小心把变量定义的单元格也删掉了,%who和%whos这两条命令就起到大作用了。
%who给出的信息只有全局变量的名称,而%whos给出的信息更加详细,包括变量名称、类型、和数据。

5.%time和%timeit

这两条命令都是用来输出代码的执行时间,比如可以用来粗略的比较两种算法在相同的问题上执行时间哪一个更少,不同点在于%time只执行一次就输出执行时间,而%timeit是执行多次然后计算平均时间再输出。
比如这里%timeit命令输出中有7 runs代表共执行7次,这两个命令都为行命令,%%time和%%timeit为单元格命令,区别同上。

6.%store

如果你在一个文件中花了很长的时间清理了一些数据,比如对原始数据缺失值填充呀、降维呀、转换呀等等,然后在另一个文件中需要用到同样的数据,笨一点方法就是将数据保存然后在新文件中调用,但这种操作一条%store命令就能完成,我们先在一个文件中利用%store保存一个变量。
然后在另一个文件中调用这个变量:
可以看到直接调用是会报错的,但利用了%store -r命令之后就可以成功调用被%store保存的变量,所以%store用来保存,%store -r用来读取。

7.%xdel和%reset

这条命令的作用就是删除变量,并且删除其在IPython中的对象上的一切引用。平时在数据清洗时,从原始数据到清洗后的数据中间要经过很多步骤,我们不可能全程用一个变量名称,所以中间步骤很容易为数据起一些类似的名称,而利用%xdel就可以将无用的单个变量名称删掉,防止混淆。
%reset的作用就是删除所有变量名。

8.%cls

在数据清洗时候,通常都是做一步然后输出一次数据集,观察一下变化,我们都知道展示数据集是很占网页的,久而久之,这个notebook就特别长,再想查看文件前面的内容不仅需要滚动很长时间滑轮,而且数据间很容易混淆,所以每当输出一次数据集后可以利用%cls命令清除一次,使notebook看起来更整洁。
可以看到正常的话data之后会打印数据集,但利用%cls之后数据集的输出被清除了。

9.%%writefile

如果我们想写一个函数,例如去除中文符号的函数,这样的函数在很多情景下都可以利用,所以我们可以将这个函数写入一个单独文件,想用的时候直接调用,这个操作可以利用%%writefile命令进行写入。

10.%run

%run命令的作用就是运行脚本文件,不仅可以直接使用脚本文件中的代码,脚本文件也可以使用IPython环境中的变量,仍用上面的例子,可以用%run命令直接运行。

11.%psource

如果你在notebook定义了一个函数,但隔了比较久需要用到这个函数,但是可能忘记了这个函数需要传入哪些参数、或者传入参数的类型应该是什么,这种情况下就不得不往前翻寻找这个函数的代码,但利用%psource可以偷懒,这个命令就是输出源代码。
前面提及的??也有相同的作用,但是输出的形式没有%psource直观,还混有其它的信息在里面。

12.%hist

%hist的作用就是打印所有命令行输入的历史记录,方便查看之前输入的代码信息。
这个命令允许设置查询的区间,也就是命令行输入对应的序号。
这些魔法命令有一部分能被常用的代码语句代替,但是却没有魔法命令简单明了,只是个人习惯的问题,如果可能尽量改掉自己的思维定式,用更加便捷的代码处理问题。
转自Python编程时光。

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

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

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

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

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

对比Excel数据透视表,学习pandas pivot_table

Excel的数据透视表非常有用,但是Pandas也有这个功能你知道吗?今天我们来对比Excel数据透视表,学习pandas pivot_table

1.Excel中做数据透视表

① 选中整个数据源;

 

② 依次点击“插入”—“数据透视表”

 

③ 选择在Excel中的哪个位置,插入数据透视表

 

④ 然后根据实际需求,从不同维度展示结果

 

⑤ 结果如下

2. pandas 用 pivot_table 做数据透视表

1)语法格式
pd.pivot_table(data,index=None,columns=None,
               values=None,aggfunc='mean',
               margins=False,margins_name='All',
               dropna=True,fill_value=None)

2)对比excel,说明上述参数的具体含义

 

参数说明:

  • data 相当于Excel中的”选中数据源”;

  • index 相当于上述”数据透视表字段”中的行;

  • columns 相当于上述”数据透视表字段”中的列;

  • values 相当于上述”数据透视表字段”中的值;

  • aggfunc 相当于上述”结果”中的计算类型;

  • margins 相当于上述”结果”中的总计;

  • margins_name 相当于修改”总计”名,为其它名称;

     

下面几个参数,用的较少,记住干嘛的,等以后需要就百度。

  • dropna 表示是否删除缺失值,如果为True时,则把一整行全作为缺失值删除;

  • fill_value 表示将缺失值,用某个指定值填充。

3. 案例说明

1)求出不同品牌下,每个月份的销售数量之和

 

① 在Excel中的操作结果如下

 

② 在pandas中的操作如下

df = pd.read_excel(r"C:\Users\黄伟\Desktop\pivot_table.xlsx")
display(df.sample(5))

df.insert(1,"月份",df["销售日期"].apply(lambda x:x.month))
display(df.sample(5))

df1 = pd.pivot_table(df,index="品牌",columns="月份",
                     values="销售数量",aggfunc=np.sum)
display(df1)

结果如下:

 

2)求出不同品牌下,每个地区、每个月份的销售数量之和

 

① 在Excel中的操作结果如下

 

② 在pandas中的操作如下

df = pd.read_excel(r"C:\Users\黄伟\Desktop\pivot_table.xlsx")
display(df.sample(5))

df.insert(1,"月份",df["销售日期"].apply(lambda x:x.month))
display(df.sample(5))

df1 = pd.pivot_table(df,index="品牌",columns=["销售区域","月份"],
                     values="销售数量",aggfunc=np.sum)
display(df1)

结果如下:

 

3)求出不同品牌不同地区下,每个月份的销售数量之和

 

① 在Excel中的操作结果如下

 

② 在pandas中的操作如下

df = pd.read_excel(r"C:\Users\黄伟\Desktop\pivot_table.xlsx")
display(df.sample(5))

df.insert(1,"月份",df["销售日期"].apply(lambda x:x.month))
display(df.sample(5))

df1 = pd.pivot_table(df,index=["品牌","销售区域"],columns="月份",
                     values="销售数量",aggfunc=np.sum)
display(df1)

结果如下:

 

4)求出不同品牌下的“销售数量之和”与“货号计数”

 

① 在Excel中的操作结果如下

 

② 在pandas中的操作如下

df = pd.read_excel(r"C:\Users\黄伟\Desktop\pivot_table.xlsx")
display(df.sample(5))

df.insert(1,"月份",df["销售日期"].apply(lambda x:x.month))
display(df.sample(5))

df1 = pd.pivot_table(df,index="品牌",columns="月份",
                     values=["销售数量","货号"],
                     aggfunc={"销售数量":"sum","货号":"count"},
                     margins=True,margins_name="总计")
display(df1)

结果如下:

本文转自凹凸数据。

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

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

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

点击下方阅读原文可获得更好的阅读体验

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

整理的关于 pip 的 15 个使用小技巧

 

本文转载自公众号【 Python大数据分析】

认识pip

众所周知,pip可以对python的第三方库进行安装、更新、卸载等操作,十分方便。

pip的全称:package installer for python,也就是Python包管理工具。

可能有些人用了很久pip,但还不清楚包管理工具是个啥。

我们先从Python这门语言说起,Python之所以受欢迎不光是因为它简单易学,更重要的是它有成千上万的宝藏库。

这些库相当于是已经集成好的工具,只要安装就能在Python里使用。它们可以处理各式各样的问题,无需你再造轮子,而且随着社区的不断更新维护,有些库越来越强大,几乎能媲美企业级应用。

那么这些工具库怎么下载安装呢?它们被放在一个统一的“仓库”里,名叫PyPi(Python Package Index),所有的库安装都是从这里调度。

有了仓库之后,还需要有管理员,pip就是这样一个角色。pip把库从PyPi取出来,然后安装到Python里,还可以管理安装好的库,比如更新、查看、搜索、卸载等等。

总的来说,pip的Python第三方库的大管家,搞懂它,会让你省很多事。

下面总结了30个pip使用过程中的常识和技巧,供大家参考。

「注:因为pip是一个命令行程序,所以pip一般都在命令行中执行各种操作」

1、安装pip

从Python 3.4开始,pip已经内置在Python中,所以无需再次安装。

如果你的Python版本没有pip,那可以使用下面两种方法安装。

(1) 命令行中输入easy_install pip,非常快捷

(2) 在下面网址中下载pip安装文件,然后解压到python scripts目录中,执行python setup.py install安装即可

下载网址:https://pypi.org/project/pip/#files

下载文件:

2、查看pip版本

pip --version

3、升级pip

如果pip的版本太低,可以升级当前版本
pip install --upgrade pip

4、获取帮助

想了解如何使用pip,以及pip有哪些功能,执行下面语句可以获取详细教程:
pip help

5、安装库

使用pip安装第三方库,执行下面语句
pip install package_name

指定package版本:
pip install package_name==1.1.2

比如说,我要安装3.4.1版本的matplotlib
pip install matplotlib==3.4.1

6、批量安装库

如果一个项目需要安装很多库,那可以批量安装:
pip install -r e:\\requirements.txt

requirements.txt文件内容格式如下:

7、使用wheel文件安装库

这种方法适合离线安装,wheel文件是库的源文件,可以下载后放到本地安装。

步骤如下:

(1) 在下面网站里找相应库的.whl文件
https://www.lfd.uci.edu/~gohlke/pythonlibs/

(2) 下载.whl文件,注意对应的版本

(3) 在.whl所在文件夹内,按Shift键+鼠标右键,打开CMD窗口或者PowerShell

(4) 输入命令:
pip install matplotlib‑3.4.1‑cp39‑cp39‑win_amd64.whl
即可完成安装

8、卸载库

安装好的库可以再卸载:
pip uninstall package_name

9、升级库

对当前库进行版本升级:
pip install --upgrade package_name

10、查看库信息

pip show -f package_name

11、查看已安装的库

列出所有已安装的第三方库和对应版本
pip list

12、将库列表保存到指定文件中

把已经安装的库信息保存到到本地txt文件中:
pip freeze > requirements.txt

13、查看需要升级的库

目前已经安装的库中,看哪些需要版本升级
pip list -o

14、检查兼容问题

验证已安装的库是否有兼容依赖问题
pip check package-name

15、下载库到本地

将库下载到本地指定文件,保存为whl格式
pip download package_name -d "要保存的文件路径"

附:更换pip源

很多人抱怨pip安装库有些时候太慢了,那是pip源的问题。

前面说过pip从PyPi中下载库文件,但由于PyPi服务器在国外,访问起来很慢。

但国内提供了很多镜像源,用来替代PyPi,像清华源、豆瓣源、阿里云源等。

这些镜像源备份了PyPi里的数据,由于服务器在国内,速度会快很多。

但镜像源数据有滞后性,比如说清华源的pypi 镜像每 5 分钟同步一次。

使用镜像源有两种方式,以清华源为例:

(1) 临时使用

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

除了matplotlib是要安装的库名外,其他都是固定格式

(2) 设为默认

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

设为默认后,以后安装库都是从清华源下载,而且无需再加镜像源网址

附主流镜像源地址

清华:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
华中理工大学:http://pypi.hustunique.com/
山东理工大学:http://pypi.sdutlinux.org/
豆瓣:http://pypi.douban.com/simple/

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

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

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

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

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

Pandas实战教程:将Excel转为html格式

大家谈及用Pandas导出数据,应该就会想到to.xxx系列的函数。

这其中呢,比较常用的就是pd.to_csv()pd.to_excel()。但其实还可以将其导成Html网页格式,这里用到的函数就是pd.to_html()

读取Excel

今天我们要实现Excel转为html格式,首先需要用读取Excel中的表格数据。

import pandas as pd
data = pd.read_excel('测试.xlsx')

查看数据

data.head()

下面我们来学习把DataFrame转换成HTML表格的方法。

生成Html

to_html()函数可以直接把DataFrame转换成HTML表格,只需一行代码即可实现:

html_table = data.to_html('测试.html')

运行上面代码后,工作目录中多了测试.html文件,使用网页浏览器打开它,显示内容如下👇

print(data.to_html())

通过print打印,可以看到DataFrame的内部结构被自动转换为嵌入在表格中的<TH>,<TR>,<TD>标签,保留所有内部层级结构。

调整格式

我们还可以自定义修改参数,来调整生成HTML的格式。

html_table = data.to_html('测试.html',header = True,index = False,justify='center')

再次打开新生成的测试.html文件,发现格式已经发生了变化。

如果想对格式进行进一步调整(增加标题、修改颜色等),就需要一些HTML知识了,可以对生成的测试.html文件中的文本进行调整。

对于有些小伙伴可能需要进行页面展示,就要搭配Flask库来使用了。

小结

Pandas提供read_html()to_html()两个函数用于读写html格式的文件。这两个函数非常有用,一个轻松将DataFrame等复杂的数据结构转换成HTML表格;另一个不用复杂爬虫,简单几行代码即可抓取Table表格型数据,简直是个神器!

今天篇幅很短,主要讲了Pandas中to_html()这个函数。使用该函数最大的优点是:我们在不了解html知识的情况下,就能生成一个表格型的HTML。本文转自快学Python

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

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

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

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

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

阿里Python 自动化工具 tidevice 使用指南

1. 前言

最近,阿里内部开源了一个 iOS 端由 Python 编写的自动化工具,即:tidevice

它是一款跨平台的自动化开源工具,不依赖 Xcode 就可以启动 WebDriverAgent( WDA ),这也就意味着 Windows 可以直接运行 iOS 自动化脚本

项目地址:

https://github.com/alibaba/taobao-iphone-device

2. 准备

进入到虚拟环境,先安装 tidevice 的依赖包

# 安装依赖包
pip3 install -U "tidevice[openssl]" 

# 查看tidevice版本,检查是否安装成功
tidevice version

3. 常见功能

将 iPhone 设备连接到电脑上,就可以使用 tidevice 提供的功能了

3-1  查看设备列表

# 二选一
tidevice list

# json数据显示
tidevice list --json

3-2  安装、卸载应用

安装对应的关键字为:「 install

tidevice 同时支持安装本地 ipa 包和远链下的 ipa 应用包

另外,tidevice 可以使用「 –udid 」参数将应用安装到某一台设备中

# 安装本地应用
tidevice install example.ipa

# 根据udid参数,指定设备安装应用
tidevice --udid $UDID install https://example.org/example.ipa
tidevice install https://.....ipa

卸载对应的关键字为:「 uninstall

通过应用包名可以卸载设备上的某一个应用

# 卸载应用(通过包名)
# 比如:知识星球App包名为:com.unnoo.quan
tidevice uninstall com.unnoo.quan

3-3  启动、关闭应用

启动应用对应的关键字为:「 launch

关闭应用对应的关键字为:「 kill

# 打开应用
tidevice launch com.unnoo.quan

# 停止杀死应用
tidevice kill com.unnoo.quan

3-4  已安装应用及名称、版本

使用「 tidevice applist 」命令,可以查看设备上已经安装的应用、应用名称、应用版本号

# 查看设备应用信息列表
localhost:tidevice_demo xingag
 
nbsp;tidevice applist
com.tencent.xin WeChat 8.0.2
com.ss.iphone.ugc.Aweme 抖音 13.4.0
com.tencent.mttlite QQ浏览器 10.8.3
com.panasonic.jp.imageapp Image App 1.10.17
com.unnoo.quan 知识星球 4.20.2
co.visualsupply.cam VSCO 189
com.ucweb.iphone.lowversion UC浏览器 13.1.5
com.niksoftware.snapseedforipad Snapseed 2.19.5
com.autonavi.amap 高德地图 10.76.0
com.lagou.education 拉勾教育 1.4.9
com.xunmeng.pinduoduo 拼多多 5.37.0
com.tencent.QQMusic QQ音樂 10.5.5
io.ideamp.feelcab Feelca B 1.6.0
com.chinaunicom.mobilebusiness 手机营业厅 8.00.01
com.feiyu-tech.vico Vicool 1.2.26
com.ss.iphone.article.News 今日头条 7.9.3
com.sogou.sogouinput 搜狗输入法 10.18.1
org.geekbang.GeekTime 极客时间 2.9.2
com.burbn.hyperlapse Hyperlapse 1.3.4
com.apple.itunesu iTunes U 3.8

3-5  设备信息

利用「 tidevice info 」可以查看设备信息,比如:设备序列号、系统版本、CPU、本机号码、时间戳、蓝牙地址、MAC 地址等信息

# 查看设备信息
localhost:~ xingag
 
nbsp;tidevice info
MarketName:       iPhone SE (1st generation)
DeviceName:       xingag
ProductVersion:   14.4
ProductType:      iPhone8,4
ModelNumber:      MP892
SerialNumber:     ...
CPUArchitecture:  arm64
ProductName:      iPhone OS
ProtocolVersion:  2
RegionInfo:       ZP/A
TimeIntervalSince1970: 1616979424.235399
TimeZone:         Asia/Shanghai
WiFiAddress:      58:e2:8f:68:4c:b0
BluetoothAddress: 58:e2:8f:68:4c:b1
BasebandVersion:  10.40.01
...

如果要查看设备的电池信息,可以使用关键字 「 –domain + 应用包名 」来获取

# 查看设备电池信息
localhost:~ xingag
 
nbsp;tidevice info --domain com.apple.mobile.battery --json
{
    "BatteryCurrentCapacity"54,
    "BatteryIsCharging"true,
    "ExternalChargeCapable"true,
    "ExternalConnected"true,
    "FullyCharged"false,
    "GasGaugeCapability"true,
    "HasBattery"true
}

3-6  重启及截图

重启对应的关键字为:「 reboot

截图对应的关键字为:「 screenshot

# 重启设备
tidevice reboot

# 截图并保存到文件 screenshot.jpg 中
tidevice screenshot screenshot.jpg

3-7  系统日志及更多帮助

查看系统日志的命令为:「 tidevice syslog 」,当然也可以配置 grep 参数进行过滤 

# 查看系统日志
tidevice syslog

# 更多帮助
tidevice -h

4. 自动化步骤

要完成 iOS 端的自动化,我们还需要做一些准备工作

4-1 安装 WDA

我们需要将 WebDriverAgent 安装到 iOS 设备上,通过它驱动手机进行一系列自动化操作

PS:由于 Facebook WDA 很长时间没有更新了,这里建议直接使用 Appium WDA

https://github.com/appium/WebDriverAgent

下载项目后,使用 Xcode 打开,Scheme 选择 WebDriverAgentRunner,设备选择真机

然后配置开发者证书,可以参考下面链接进行配置

https://testerhome.com/topics/7220

最后,Xcode 选择 Project 下的 Test 将项目运行到真机设备上

注意:第一次运行 WDA 可能运行失败,需要手动在设置中对证书添加信任

4-2  运行 WDA

真机设备安装完 WDA 后,就可以脱离 Mac,使用 Windows 进行自动化操作了

使用「 tidevice wdaproxy 」命令可以运行 WDA 和端口转发

 # 运行 WDA
# 端口转发到8100
# 应用包名:com.facebook.WebDriverAgentRunner.xingag23.xctrunner
idevice wdaproxy -B com.facebook.WebDriverAgentRunner.xingag23.xctrunner --port 8100

PS:由于 Xcode 设置证书的时候,更改过 bundle_id,所以这里的包名是一个变量

4-3  编写自动化脚本

接下来,就可以使用 Appium 或 facebook-wda 编写脚本并运行到 iOS 设备上了

以 facebook-wda 为例

首先,我们安装对应的依赖

# 安装facebook-wda依赖
pip3 install -U facebook-wda

接着,编写自动化脚本并运行测试

import wda
import time

# 连接设备
c1 = wda.USBClient()

# c1 = wda.Client("http://10.3.209.175:8100")
print(c.info)

# 极客时间
bundle_id = 'org.geekbang.GeekTime'

# 通过app的bundleId启动App
s = c1.session(bundle_id)

# 休眠5s
s.sleep(5)

# 截图保存到本地
c1.screenshot('sc.png')

# 回到桌面
s.home()

5. 最后

阿里这款 iOS 端自动化工具的主要优点是启动速度快,内存占用低;更重要的是,它是跨平台,稳定性相对较高

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

本文转自Airpython.

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

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

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

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

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

只需 10 行代码,Python 教你自制屏幕翻译工具,高效办公

1. 场景

大家如果平常遇到不认识的英文,相信大部分的人都会复制内容后,使用翻译软件,或者拷贝到网站上去执行翻译。

当然,对于 IDE、浏览器可以装一些插件来翻译,有道也有划词翻译。

但是,经常会有一些解析对话框,没法拷贝文本内容,上面的方式都就变得束手无策。

今天教大家利用 10 行 Python 代码制作一个翻屏软件,随处翻译,高效办公。

2. 实现步骤

首先,我们使用 PIL 依赖库剪切板读取图片,然后下载到本地。

# 安装PIL依赖
# 从剪切板读取图片
img = ImageGrab.grabclipboard()

# 保存到本地
image_result = './temp.png'

img.save(image_result)

接着,使用 pytesseract 依赖库的 OCR 功能,识别图片中的英文内容。

# OCR识别
# 识别图片中的英文
content_eng = pytesseract.image_to_string(Image.open(image_result), lang='eng')

然后,就是翻译上面识别的英文内容了。

为了保证英文翻译的准确性,这里利用 Google 翻译的简易依赖库:googletrans

# 翻译
# Google翻译
translator = Translator(service_urls=['translate.google.cn'])

# 翻译成中文
content_chinese = translator.translate(content_eng, src='en', dest='zh-cn').text

最后,使用 Python 自带的 GUI tkinker,将识别后的中文显示出来。

# 初始化
root = Tk()
root.withdraw()

# 显示翻译后的结果,以对话框的形式
tkinter.messagebox.showinfo('翻译结果', content_chinese)

3. 简化步骤

为了加快翻译的步骤,先将上面的脚本保存到本地,然后设置快捷键执行脚本。

PC 端,可以打包成 EXE 后设置快捷键,或者利用 WinHotKey 设置脚本执行。

MAC OSX,使用自动操作( 运行 Shell 脚本 )+ 键盘快捷键(服务),即可以快速执行脚本。

如此,后面只需要截图 + 快捷键,两步快速执行翻译操作。

本文转自AirPython.

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

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

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

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

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

Folium — 可能是 Python 最强的绘制地图神器

今天给大家介绍一个非常 NB 的Python 库,专门用来绘制地图的,它叫 Folium.

1. Folium简介

Folium是一个基于leaflet.js的Python地图库,其中,Leaflet是一个非常轻的前端地图可视化库。

即可以使用Python语言调用Leaflet的地图可视化能力。它不单单可以在地图上展示数据的分布图,还可以使用Vincent/Vega在地图上加以标记。

Folium可以让你用Python强大生态系统来处理数据,然后用Leaflet地图来展示。

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

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

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

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

2. Folium的使用

地图的生成

img

folium.folium.Map()详解

folium.folium.Map(location=None, width='100%', height='100%', left='0%', top='0%', position='relative', tiles='OpenStreetMap', attr=None, min_zoom=0, max_zoom=18, zoom_start=10, min_lat=-90, max_lat=90, min_lon=-180, max_lon=180, max_bounds=False, crs='EPSG3857', control_scale=False, prefer_canvas=False, no_touch=False, disable_3d=False, png_enabled=False, zoom_control=True, **kwargs)

参数说明

  • location (tuple or list, default None):纬度和经度

  • width (pixel int or percentage string (default: ‘100%’)):地图宽度

  • height (pixel int or percentage string (default: ‘100%’)):地图高度

  • tiles (str, default ‘OpenStreetMap’) :瓦片名称或使用TileLayer classass.

  • min_zoom (int, default 0):地图可缩放的最小级别

  • max_zoom (int, default 18):地图可缩放的最大级别

  • zoom_start (int, default 10) :地图的初始缩放级别

  • attr (string, default None):当使用自定义瓦片时,传入自定义瓦片的名词

  • crs (str, default ‘EPSG3857’) :投影坐标系标识

  • EPSG3857: Web墨卡托投影后的平面地图,坐标单位为米。大部分国外地图使用的时该标准。

  • EPSG4326: Web墨卡托投影后的平面地图,但仍然使用WGS84的经度、纬度表示坐标。

  • EPSG3395: 墨卡托投影,主要用于航海图

  • Simple: 简单的x,y匹配,用于自定义瓦片(比如游戏地图)

  • control_scale (bool, default False) :是否在地图上显示缩放标尺

  • prefer_canvas (bool, default False):强制使用Canvas渲染

  • no_touch (bool, default False) :是否允许触摸事件

  • disable_3d (bool, default False) :强制使用CSS 3D效果

  • zoom_control (bool, default True) :是否要限制zoom操作

  • **kwargs:Leaflets地图类的其他参数: https://leafletjs.com/reference-1.5.1.html#map

“tiles”参数可选值:

  • “OpenStreetMap”

  • “Mapbox Bright” (Limited levels of zoom for free tiles)

  • “Mapbox Control Room” (Limited levels of zoom for free tiles)

  • “Stamen” (Terrain, Toner, and Watercolor)

  • “Cloudmade” (Must pass API key)

  • “Mapbox” (Must pass API key)

  • “CartoDB” (positron and dark_matter)

“tiles”的自定义设置:

 

img

地球上同一个地理位置的经纬度,在不同的坐标系中,会有少量偏移,国内目前常见的坐标系主要分为三种:

  • 地球坐标系——WGS84:常见于GPS设备,Google地图等国际标准的坐标体系。

  • 火星坐标系——GCJ-02:中国国内使用的被强制加密后的坐标体系,高德坐标就属于该种坐标体系。

  • 百度坐标系——BD-09:百度地图所使用的坐标体系,是在火星坐标系的基础上又进行了一次加密处理。

所以在设置“tiles”时需要考虑目前手中得经纬度属于那种坐标系。

由于投影坐标系中没有GCJ-02和BD-09对应的标识,所以在自定义瓦片时主要经纬度能匹配上,crs中的设置可保持不变。更多详情介绍请看:瓦片坐标系学习

如果需要将地图保存,只需执行:m.save(“map.html”) 即可。

添加点、线、面要素

添加点

import folium
m = folium.Map(location=[39.917834116.397036], zoom_start=13, width='50%',height='50%', zoom_control='False',
               tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}&ltype=6',attr='AutoNavi')

tooltip ='请点击我查看该点信息'
folium.Marker([39.937282,116.403187], popup='南锣鼓巷',tooltip=tooltip).add_to(m)
folium.Marker([39.917834,116.397036], popup='故宫',tooltip=tooltip).add_to(m)
folium.Marker([39.928614,116.391746], popup='北海公园', tooltip=tooltip, icon=folium.Icon(color='red')).add_to(m)
folium.Marker([39.942143,116.382590], popup='后海公园', tooltip=tooltip, icon=folium.Icon(color='green', prefix='fa', icon='taxi')).add_to(m)

m

 

img

Folium.Icon类可以设置color, icon_color, icon, angle, prefix这5个参数:

  • color的可选项包括:[‘red’, ‘blue’, ‘green’, ‘purple’, ‘orange’, ‘darkred’, ‘lightred’, ‘beige’, ‘darkblue’, ‘darkgreen’, ‘cadetblue’, ‘darkpurple’, ‘white’, ‘pink’, ‘lightblue’, ‘lightgreen’, ‘gray’, ‘black’, ‘lightgray’] ,或者HTML颜色代码

  • icon_color同上

  • icon可以在Font-Awesome网站中找到对应的名字,并设置prefix参数为’fa’

  • angle以度为单位设置

其他:

m.add_child(folium.LatLngPopup()) #显示鼠标点击点经纬度
m.add_child(folium.ClickForMarker(popup='Waypoint')) # 将鼠标点击点添加到地图上

添加圆

folium.Circle(
    radius=300,
    location=[39.928614,116.391746],
    popup='北海公园',
    color='crimson',
    fill=False,
).add_to(m)
folium.CircleMarker(
    location=[39.942143,116.382590],
    radius=50,
    popup='后海公园',
    color='#3186cc',
    fill=True,
    fill_color='#3186cc'
).add_to(m)

 

img

Circle和CircleMarker的不同:CircleMarker的radius一个单位是像素,Circle的一个单位时米

添加线段

folium.PolyLine([
    [39.917834,116.397036],
    [39.928614,116.391746],
    [39.937282,116.403187],
    [39.942143,116.382590]
],color='red').add_to(m)

 

img

添加多边形

folium.Marker([39.917834,116.397036], popup='故宫').add_to(m)
folium.Marker([39.928614,116.391746], popup='北海公园').add_to(m)
folium.Marker([39.937282,116.403187], popup='南锣鼓巷').add_to(m)
folium.Marker([39.942143,116.382590], popup='后海公园').add_to(m)

folium.Polygon([
    [39.917834,116.397036],
    [39.928614,116.391746],
    [39.942143,116.382590],
    [39.937282,116.403187],
],color='blue', weight=2, fill=True, fill_color='blue', fill_opacity=0.3).add_to(m)

 

img

Folium的其他高级应用

在地图上显示前200条犯罪数据

import folium
import pandas as pd

san_map = folium.Map(location=[37.77-122.42], zoom_start=12,width='50%',height='50%')

# cdata = pd.read_csv('https://cocl.us/sanfran_crime_dataset')
cdata = pd.read_csv('Police_Department_Incidents_-_Previous_Year__2016_.csv'#犯罪数据,包含犯罪所在经纬度

# get the first 200 crimes in the cdata
limit = 200
data = cdata.iloc[0:limit, :]
# Instantiate a feature group for the incidents in the dataframe
incidents = folium.map.FeatureGroup()
# Loop through the 200 crimes and add each to the incidents feature group
for lat, lng, in zip(cdata.Y, data.X):
    incidents.add_child(
        folium.CircleMarker(
            [lat, lng],
            radius=7# define how big you want the circle markers to be
            color='yellow',
            fill=True,
            fill_color='red',
            fill_opacity=0.4
        )
    )

san_map.add_child(incidents)

 

img

统计区域犯罪总数

from folium import plugins

# let's start again with a clean copy of the map of San Francisco
san_map = folium.Map(location=[37.77-122.42], zoom_start=12,width='50%',height='50%')

# instantiate a mark cluster object for the incidents in the dataframe
incidents = plugins.MarkerCluster().add_to(san_map)

# loop through the dataframe and add each data point to the mark cluster
for lat, lng, label, in zip(data.Y, data.X, cdata.Category):
    folium.Marker(
        location=[lat, lng],
        icon=None,
        popup=label,
    ).add_to(incidents)

# add incidents to map
san_map.add_child(incidents)

 

img

以热力图的方式呈现

from folium.plugins import HeatMap

san_map = folium.Map(location=[37.77-122.42], zoom_start=12,width='50%',height='50%')

# Convert data format
heatdata = data[['Y','X']].values.tolist()

# add incidents to map
HeatMap(heatdata).add_to(san_map)

san_map

 

img

在地图上呈现GeoJSON边界数据

import json
import requests

# url = 'https://cocl.us/sanfran_geojson'
url = 'san-francisco.geojson'
san_geo = f'{url}'
san_map = folium.Map(location=[37.77-122.42], zoom_start=12,width='50%',height='50%')
folium.GeoJson(
    san_geo,
    style_function=lambda feature: {
        'fillColor''#ffff00',
        'color''blue',
        'weight'2,
        'dashArray''5, 5'
    }
).add_to(san_map)

san_map

 

img

在GeoJSON上绘制Choropleth分级着色图

# Count crime numbers in each neighborhood
disdata = pd.DataFrame(cdata['PdDistrict'].value_counts())
disdata.reset_index(inplace=True)
disdata.rename(columns={'index':'Neighborhood','PdDistrict':'Count'},inplace=True)

san_map = folium.Map(location=[37.77-122.42], zoom_start=12,width='50%',height='50%')

folium.Choropleth(
    geo_data=san_geo,
    data=disdata,
    columns=['Neighborhood','Count'],
    key_on='feature.properties.DISTRICT',
    #fill_color='red',
    fill_color='YlOrRd',
    fill_opacity=0.7,
    line_opacity=0.2,
    highlight=True,
    legend_name='Crime Counts in San Francisco'
).add_to(san_map)

san_map

 

img

3. 各地图提供商瓦片服务地图规则

高德地图

目前高德的瓦片地址有如下两种:

  • http://wprd0{1-4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scl=1&style=7&ltype=1

  • http://webst0{1-4}.is.autonavi.com/appmaptile?style=7&x={x}&y={y}&z={z}

前者是高德的新版地址,后者是老版地址。

高德新版的参数:

  • lang:可以通过zh_cn设置中文,en设置英文

  • size:基本无作用

  • scl:瓦片尺寸控制,1=256,2=512

  • style:设置影像和路网,style=6为卫星图,style=7为街道图,style=8为标注图

  • ltype:线性控制,增加后,只对地图要素进行控制,没有文字注记,要素多少,是否透明

这些规律并不是绝对的,有可能有的组合某些参数不起作用。

谷歌地图

目前谷歌的瓦片地址也存在两种:

  • 国内:http://mt{0-3}.google.cn/vt/lyrs=m&hl=zh-CN&gl=cn&x={x}&y={y}&z={z}

  • 国外:http://mt{0-3}.google.com/vt/lyrs=m&hl=zh-CN&gl=cn&x={x}&y={y}&z={z}

参数详解:

  • lyrs = 类型

  • h = roads only 仅限道路

  • m = standard roadmap 标准路线图

  • p = terrain 带标签的地形图

  • r = somehow altered roadmap 某种改变的路线图

  • s = satellite only 仅限卫星

  • t = terrain only 仅限地形

  • y = hybrid 带标签的卫星图

  • gl = 坐标系

  • CN = 中国火星坐标系

  • hl = 地图文字语言

  • zh-CN = 中文

  • en-US = 英文

  • x = 瓦片横坐标

  • y = 瓦片纵坐标

  • z = 缩放级别 卫星图0-14,路线图0-17

百度地图

百度当前的瓦片地址:

  • http://online{0-4}.map.bdimg.com/onlinelabel/?qt=tile&x={x}&y={y}&z={z}&styles=pl&udt=202004151&scaler=2&p=0

  • http://api{0-3}.map.bdimg.com/customimage/tile?&x={x}&y={y}&z={z}&udt=20180601&scale=1

  • http://its.map.baidu.com:8002/traffic/TrafficTileService?level={z}&x={x}&y={y}&time=1373790856265&label=web2D&;v=017

备注:瓦片地址中的x和y对应的并不是经纬度值,而是瓦片编号,中国主要地图商的瓦片编号流派:

目前百度的瓦片编号比较特殊,Folium暂不支持。

其他参考资料:

  • https://github.com/geometalab/pyGeoTile

  • https://github.com/anzhihun/OpenLayers3Primer/blob/master/ch05/05-03.md

  • http://www.winseliu.com/blog/2018/01/30/map-started-guide/

  • https://github.com/CntChen/tile-lnglat-transform

腾讯地图

腾讯地图的瓦片地图URL格式:

  • http://rt1.map.gtimg.com/realtimerender?z={z}&x={x}&y={y}&type=vector&style=0

由于腾讯地图使用的瓦片编码时TMS,所以使用时需要额外的设置。具体如下:

 

其他底图

 

  • {0,1,2,3}代表了url的subDomain,在请求时会随机的在url中使用mt0、mt1、mt2、mt3。{z}代表zoom,即缩放级别,{x}代表列号,{y}代表行号。

  • GeoQ 官网有公开的多个基于 ArcGIS 的地图服务,均可使用,详见https://map.geoq.cn/arcgis/rest/services

4. 参考链接:

  • https://leafletjs.com/

  • https://python-visualization.github.io/folium/

  • http://openwhatevermap.xyz/

作者:钱魏Way
原文:https://www.biaodianfu.com/folium.html

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

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

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

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

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