左手用R右手Python系列——任务进度管理

一直觉得运行代码的时候,如果有一个提示任务运行进度的进度条提示就好,很多时候我们的程序运行时间普遍较长,如果程序运行没有任何提示,那简直是一场噩梦,根本不知道到底是程序在偷懒还是真的卡住了,而如果再代码里写print函数,循环较多的话,你的屏幕会被打印的提示文本瞬间刷屏。

后来经过搜索,还真让我发现了解决方法。今天给大家介绍两个包,这两个包可以做任务任务处理、进程处理工作,编写一些简易的交互界面。

这里仅介绍简单的用法,仅仅满足我们日常任务进度提示即可。

library("tcltk")
library("tcltk2")

主要掌握以下两个主要函数:

设置进度条的格式

tkProgressBar(
    title = "R progress bar",   #任务进度名称
    label = "",                 #任务进度标签
    min = 0,                    #初始进度
    max = 1,                    #末尾进度
    initial = 0,                #起始位置
    width = 300                 #进度条宽度
    )

开启进度条

setTkProgressBar(
    pb,              #可用进度条
    value,           #进度值
    title = NULL,    #标题
    label = NULL     #标签
    )
library("rvest")
library("downloader")
url<-"https://www.zhihu.com/question/35931586/answer/206258333"
link<- read_html(url)%>% html_nodes("div.RichContent-inner>span")%>% html_nodes("img")%>%html_attr("data-original") %>% na.omit   
link<-link[seq(1,length(link),by=2)] %>% sample(size=10)                
Name<-sub("https://pic\\d.zhimg.com/v2-","",link)    
dir.create("D:/R/Image/zhihu0807")            
setwd("D:/R/Image/zhihu0807")
plot.new()
pb<-tkProgressBar("进度","已完成 %",0,100)     
for(i in 1:length(link)){
    info <- sprintf("已完成 %d%%",round(i*100/length(link)))
    setTkProgressBar(pb,i*100/length(link),sprintf("进度 (%s)",info),info)
    download(link[i],Name[i], mode = "wb")
    Sys.sleep(0.5)
} 
close(pb)  
#关闭进度条(这个要等任务完成再写,不要写在函数里哈)

而tcltk2包则可以自定义更多的进度条属性和外观界面,使得进度条更具个性化。

library("tcltk2")
###开启进度条
root <- tktoplevel()
l1   <- tk2label(root)
pb1  <- tk2progress(root,length=300)
tkconfigure(pb1,value=0,maximum=9)
tkgrid(l1, row = 0)
tkgrid(pb1,row = 1)
plot.new()
for(index in 1:length(link)){
    download(link[i],Name[i], mode = "wb")
    Sys.sleep(0.5)    
    ###进度管理:
    tkconfigure(l1, text = paste("Index",index))
    tkconfigure(pb1,value=index-1)
    Sys.sleep(0.5)
}
tkdestroy(root)   
#关闭进度条

是不是很人性化呀~~~以后运行大型程序,再也不会心里没底儿啦,看着进度条就可以知道你的程序到底运行到多少啦。

既然R语言可以执行进度管理,相比Python里面肯定也可以实现的,我找了一些,但是大部分都是基于Py2的,而且代码量都不小,看到大块的代码我就害怕,最后找到一个代码量算少的,简单介绍一些,希望能给大家打来帮助。

import os
import re
import time
import sys
import urllib 
import requests
import random 
from bs4 import BeautifulSoup
url="https://www.zhihu.com/question/35931586/answer/206258333"
header = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36'}
page=requests.get(url,headers=header)
soup=BeautifulSoup(page.text,'lxml')
link_list=[pip.get('data-original') for pip in soup.select("div[class='RichContent-inner'] span img")]
link_list=random.sample(link_list,10)  
os.makedirs("D:/Python/zhihu0807")
os.chdir('D:/Python/zhihu0807')
for i in range(len(link_list)):
    name=re.findall(r"v2-.*?\.jpg",link_list[i])[0]
    urllib.request.urlretrieve(link_list[i],name)
    sys.stdout.write('\r')
    sys.stdout.write("%s%% |%s" %(int(i%len(link_list)), int(i%len(link_list))*'#'))
    sys.stdout.flush()
    time.sleep(0.5)

要想制作出专业美观的任务进度管理程序,有很多第三方包可以用,甚至可以自己写带有弹出功能的工具条,只是那样就失去简便性了, 感兴趣的可以自行探索!

往期案例数据请移步本人GitHub: https://github.com/ljtyduyu/DataWarehouse/tree/master/File

原文发布于微信公众号 - 数据小魔方(datamofang)

原文发表时间:2017-10-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏葡萄城控件技术团队

Wijmo 更优美的jQuery UI部件集:通过jsFiddle测试Wijmo Gauges

Wijmo 的巨大优势之一就是,它们是非常流行的jQuery UI部件。这将意味着它们的基础类库具有很多支持者。具有众多的支持者同时也意味着更多好用的工具。这些...

22980
来自专栏Material Design组件

Human Interface Guidelines —— Edit Menus

14460
来自专栏james大数据架构

使用脚本操作UpdatePanel中控件的问题

假设有一个脚本(用js或者jQuery等类似手段编写),为UpdatePanel中的一个普通的TextBox赋值。如果你以为这样写: <head runat="...

234100
来自专栏IT大咖说

2018年1月份最热门的JavaScript开源项目

本篇文章为大家盘点了1月份最热门的 JavaScript 项目,让我们一起来看下吧! 一、编辑器tui.editor https://github.com/nh...

31280
来自专栏程序员同行者

html基础+常用标签

20910
来自专栏DeveWork

WordPress 网站开发“微信小程序”实战(二)

本文是“WordPress 开发微信小程序”系列的第二篇,本文记录的是开发“DeveWork极客”小程序v1.1 的过程。一如既往,目标读者为了解WordPre...

32670
来自专栏我和我大前端的故事

入门微信小程序 (二)语法篇

路由在项目开发中一直是个核心点,小程序路由方面经过很好的封装,提供了几个基本的跳转方法(这三个基本够用)

1.4K20
来自专栏武军超python专栏

2018年8月7号升级飞机大战的总结

今天学到的新单词: indentation  n缩进 transform  v改变,变换 collide v碰撞 recursion  n递归

13420
来自专栏Fundebug

微信小程序开发BUG经验总结

小程序开发越来越热,开发中遇到各种各样的bug,在此总结了一些比较容易掉进去的坑分享给大家。

583120
来自专栏ROBOTEDU

OMRONFZ系列视觉与ABB机器人的通信

ABB与OMRON之间的通信,本例采用以太网TCP无协议模式通信。通过以太网由ABB机器人程序控制ONRON视觉的场景切换,拍照判断及其判断数据的 接收。 ?...

53750

扫码关注云+社区

领取腾讯云代金券