安装python包时,如果指定包的版本,为什么用到的是两个等号,而不是一个等号?

用anaconda创建虚拟环境时,会用到conda create -n env-name python=3.6,其中-n是什么意思,如果是参数的话,为什么不是–n,还有就是为什么python=3.6是一个等于号,而在安装包时,比如pip install pymysql==0.7时,用到的是两个等于号。

Anaconda中的命令有两种参数类型,一种是简写,比如题主说到的 -n,还有一种是全称 –name,即-n对应的全称。

pip的==是版本匹配运算符,是PEP 440定义的,见这个文档:PEP 440 – 版本标识和依赖性规范

至于conda的create指定版本的时候用Python = 3.5而不是Python == 3.5,个人猜测是第一个包含“模糊”版本,而第二个包含精确版本。模糊版本将匹配版本> = 3.5和<3.6中的Python包。而==将匹配Python包如3.5,3.5.0,3.5.0.0等这样的精确版本。确实没必要细化到那么细的版本号。

python 小文件下载、大文件下载、异步批量下载 代码

[download_code]

原文:python 小文件下载、大文件下载、异步批量下载 教程

按照不同的情况,python下载文件可以分为三种:

  1. 小文件下载
  2. 大文件下载
  3. 批量下载

python 小文件下载

流程:使用request.get请求链接,返回的内容放置到变量r中,然后将r写入到你想放的地方。

Python小文件下载流程
Python小文件下载流程

以下载上述流程图为例子:

# 例1
import requests
def request_zip(url):
    r = requests.get(url) 
    # 请求链接后保存到变量r中
    with open("new/名字.png",'wb') as f:
        # r.content写入至文件
        f.write(r.content)
request_zip('https://pythondict.com/wp-content/uploads/2019/08/2019082807222049.png')

运行完毕后,它将会被保存到当前文件夹的new文件夹里。

python 大文件下载

我们在小文件下载的时候,是将文件内容暂存到变量里,大家想想,下载大文件的时候还这样做会有什么问题? 很简单,如果你的内存只有8G,结果要下载文件却有10G那么大,那就肯定无法下载成功了。而且本机软件运行占的内存也比较大,如果你的内存只有8G,实际上剩余可用的内存可能低于2G-4G. 这种情况下怎么下载大文件呢?

流式分块下载

原理:一块一块地将内存写入到文件中,以避免内存占用过大。

Python大文件下载流程

当设置了request.get(stream=True)的时候,就是启动流模式下载,典型特征:在r变量的content被调用的时候才会启动下载。代码如下:

# 例2
import requests
def request_big_data(url):
    name = url.split('/')[-1]
    # 获取文件名
    r = requests.get(url, stream=True)
    # stream=True 设置为流读取
    with open("new/"+str(name), "wb") as pdf:
        for chunk in r.iter_content(chunk_size=1024):
            # 每1024个字节为一块进行读取
            if chunk:
                # 如果chunk不为空
                pdf.write(chunk)
request_big_data(url="https://www.python.org/ftp/python/3.7.4/python-3.7.4-amd64.exe")

Python 批量文件下载

所谓批量下载,当然不是一个一个文件的下载了,比如说我们要下载百度图片,如果一个一个下载会出现两种负面情况:

  1. 如果某个请求堵塞,整个队列都会被堵塞
  2. 如果是小文件,单线程下载太慢

我们的解决方案是使用异步策略。如果你会用scrapy框架,那就轻松许多了,因为它结合了twisted异步驱动架构,根本不需要你自己写异步。不过我们python实用宝典讲的可是教程,还是跟大家说一下怎么实现异步下载

我们需要使用到两个包,一个是asyncio、一个是aiohttp. asyncio是Python3的原装库,但是aiohttp则需要各位使用cmd/Terminal打开,输入以下命令安装:

pip install aiohttp

注意asyncio是单进程并发库,不是多线程,也不是多进程,单纯是在一个进程里面异步(切来切去运行),切换的地方用await标记,能够切换的函数用async标记。比如下载异步批量下载两个图片的代码如下:

 

# 例3
import aiohttp
import asyncio
import time
async def job(session, url):
    # 声明为异步函数
    name = url.split('/')[-1]
    # 获得名字
    img = await session.get(url)
    # 触发到await就切换,等待get到数据
    imgcode = await img.read()
    # 读取内容
    with open("new/"+str(name),'wb') as f:
        # 写入至文件
        f.write(imgcode)
    return str(url)

async def main(loop, URL):
    async with aiohttp.ClientSession() as session:
        # 建立会话session
        tasks = [loop.create_task(job(session, URL[_])) for _ in range(2)]
        # 建立所有任务
        finished, unfinished = await asyncio.wait(tasks)
        # 触发await,等待任务完成
        all_results = [r.result() for r in finished]
        # 获取所有结果
        print("ALL RESULT:"+str(all_results))

URL = ['https://pythondict.com/wp-content/uploads/2019/07/2019073115192114.jpg',
       'https://pythondict.com/wp-content/uploads/2019/08/2019080216113098.jpg']
loop = asyncio.get_event_loop()
loop.run_until_complete(main(loop, URL))
loop.close()

 

注意: img = await session.get(url)
这时候,在你请求第一个图片获得数据的时候,它会切换请求第二个图片或其他图片,等第一个图片获得所有数据后再切换回来。从而实现多线程批量下载的功能,速度超快,下载超清大图用这个方法可以一秒一张

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

你应该用Python3.x而非Python2.x的20个理由

最近小编在知乎上经常遇到这样的问题:《现在开始学习python的话,是学习python2.x还是学习python3.x比较好?》,这也是许多初学者会遇到的问题,我们的答案是python 3.x. 为了帮助大家消除疑惑,在这里统一告诉大家原因

1. Python3.1,io模块是使用Python语言实现的,比2.x快5~10倍

2. Python3.1,str.format()支持自动编号:

python3.1,str.format()支持自动编号
python3.1,str.format()支持自动编号

3. Python 3.1,64位版的int快了27%~55%

4. Python 3.2,对全局解释器锁(GIL)进行了重大升级,显著改进了Python处理多线程的方式

5. python3.3,用C语言重写了decimal模块,比以前快12倍(数据操作)~120倍(高密度计算)。

6. Python3.3,utf-8编码快了2~4倍,utf-16编码的encode最多快了10倍

7. python3.4,优化pickle模块,性能提升好几倍。

8. python3.4,python解释器的启动快了30%

9. Python3.4, 新增tracemalloc模块。一个调试工具,用于追踪、统计python的内存分配。

10.Python3.4, 新增enum模块,提供枚举。好多人抱怨python没有枚举,现在有了,虽然是以模块的方式实现的。

11. Python 3.5,使异步变得不那么棘手,async和await关键字成为语言语法的一部分。

12. Python3.5,新的语法:Type hints和typing模块。方便代码阅读。

Python3.5,新的语法:Type hints和typing模块
Python3.5,新的语法:Type hints和typing模块

13. Python3.5,UTF-8、UTF-16、LATIN-1编码的decode速度是以前的2~4倍。

14. Python3.5,新增.hex()函数,可以直接把bytes类型转为16进制

python hex()
python hex()

15.python3.5, 新增os.scandir()函数,更快、更省内存的遍历文件夹。在POSIX系统上比以前快3~5倍,在Windows系统上快7~20倍。os.walk()目前也在使用此函数。

16. Python3.6, 用C语言实现asyncio.Future类和asyncio.Task类,asyncio程序的性能快了25%~30%

17. Python3.6, glob模块的glob()函数和iglob()函数现在使用os.scandir()函数。快了3~6倍

18. Python3.6,pathlib.Path模块的glob()函数现在使用os.scandir()函数。快了1.5~4倍

19. Python3.6, 新增secrets模块,生成强随机数。以前的random模块只能生成伪随机数,官方推荐在涉及安全问题时不再使用random模块

20. Python3.7,time模块新增6个可以访问纳秒的函数,如time.time_ns()、time.perf_counter_ns()等等。

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


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

Vscode 设置中文

如果你刚下载VSCode,发现界面全是英文的,不要急,下面就来教你怎么改成中文。

1. 首先打开vscode界面,点击View – Command Palette (或输入 Ctrl + shift + P)进入命令面板.

打开命令面板
打开命令面板

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

Configure Display Language
Configure Display Language

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

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

install additional languages
install additional languages

VsCode系列文章:

Python 使用VS Code进行调试

VSCode 设置中文

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

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


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

Pycharm 代码左边的数字是什么?

代码左边的数字
代码左边的数字

这个是Pycharm的书签功能

去除:

删除书签,将光标移至书签所在行,按快捷键F11即可消除。

添加:

在所在行按快捷键Ctrl+Shift+任意数字或者快捷键Ctrl+F11 即可添加,就可以插入一个标签了。

使用:

要将光标跳转到某个书签,只需要Ctrl+对应的标签数字。

如果想要查看所有书签位置:Shift + F11。

了解更多

更多有趣的Python教程欢迎关注公众号:Python实用宝典

或者访问网站:Python实用宝典

为什么Python这么适合AI和机器学习?4位专家给你答案

Python是机器学习的最佳编程语言之一,其迅速地在学术界和相关研究领域威胁到甚至超过了R的主导地位。为什么Python在机器学习领域如此受欢迎呢?为什么Python对AI有好处?

Mike Driscoll采访了4位Python专家和机器学习社区人士,讨论了Python在AI和相关研究领域中如此受欢迎的原因。

编程是一种社会活动——Python的社区已经透彻认识到了这一点

Glyph Lefkowitz
Glyph Lefkowitz

Glyph Lefkowitz (@glyph)是Python网络编程框架Twisted(一个能用于Python异步开发的)的创始人,他在2017年获得了PSF的社区服务奖。他是这么认为的:

人工智能是一个包罗万象的术语,它倾向于指当前计算机科学研究中最先进的领域。

曾经有一段时间,我们理所当然的以为基本图形遍历被认为是AI。在那个时候,Lisp是一种大型人工智能语言,因为它比一般的编程语言要高级,而且研究人员可以更容易地用Lisp做快速原型。我认为Python在总体上已经很大程度上取代了它,因为除了具有类似的高级功能外,它还有一个优秀的第三方生态系统。

Lispers会反对,所以我应该说清楚,我并不是要捧高Python的地位,只是说Python和Lisp都是同一类语言,比如在垃圾回收、内存安全等机制、命名空间和高级数据结构等方面都具有相似的特点。

从机器学习的更具体的意义上说,也就是现在越来越多的人所说的人工智能,我认为有更具体的答案。NumPy的存在及其伴随的生态系统允许非常适合研究的高级内容的混合,以及非常高性能的数字处理。如果不是非常密集的数字运算,机器学习就什么都不是。

“……统计学家、天文学家、生物学家和业务分析师都已经成为Python程序员,并改进了这个语言。”

Python社区致力于为非程序员提供友好的介绍和生态系统支持,这确实增加了它在数据科学和科学计算的姊妹学科中的应用。无数的统计学家、天文学家、生物学家和业务分析师已经成为Python程序员,并改进了这个语言。编程本质上是一种社会活动,Python社区比除JavaScript之外的任何语言都更认可这一点。

Python让用户关注真正的问题

 Marc-Andre Lemburg
Marc-Andre Lemburg

Marc-Andre Lemburg (@malemburg),PSF的联合创始人和eGenix的首席执行官。他是这样认为的:

Python对于没有受过计算机科学训练的人来说非常容易理解。当您试图执行研究所需的外部时,它消除了您必须处理的许多复杂性。

在Numeric(现在是NumPy)开始开发之后,新增了IPython笔记本(现在是Jupyter笔记本)、matplotlib和许多其他工具,使事情变得更加直观,Python允许使用者主要考虑问题的解决方案,而不是驱动这些解决方案所需的技术。

“Python是一种理想的集成语言,可以轻松地将技术绑定在一起。”

Python是一种理想的集成语言,可以轻松地将技术绑定在一起。Python允许用户关注真正的问题,而不是将时间花在实现细节上。除了让用户更容易操作之外,对于开发外部的底层集成人员来说,Python还是一个理想的粘合平台。这主要是因为Python非常容易通过一个漂亮而完整的C语言API访问。

Python有许多适合科学计算的特性

 Luciano Ramalho
Luciano Ramalho

Luciano Ramalho (@ramalhoorg), ThoughtWorks技术负责人,PSF研究员。他是这么看的:

最重要和最直接的原因是NumPy和SciPy支持像scikit-learn这样的项目,scikit-learn目前几乎是机器学习的标准工具

首先创建NumPy、SciPy、scikit-learn和许多其他的原因是Python具有一些特性,使其对科学计算非常方便。Python有一个简单且一致的语法,这使得非软件工程师更容易进行编程。

“Python得益于科学计算的丰富生态系统。”

另一个原因是运算符重载,这使得代码可读且简洁。然后是Python的buffer protocol (PEP 3118),它是外部在处理类似数组的数据结构时与Python有效互操作的标准。最后,Python得益于科学计算的丰富生态系统,这吸引了更多的科学家与开发者,并创造了一个良性循环。

Python严格一致的特点使其对AI非常友好

  Mike Bayer
Mike Bayer

Mike Bayer (@zzzeek), Red Hat高级软件工程师,SQLAlchemy的创建者。他是这么认为的:

我们在这个领域所做的是开发我们的数学模型和算法。我们正在把我们肯定想要保留的和优化的算法放入像scikit-learn这样的中。然后,我们将继续迭代并共享关于如何组织和考虑数据的注释。

高级脚本语言是人工智能和机器学习的理想语言,因为我们可以快速转移数据,然后再试一次。我们创建的代码的大部分用于表示实际的数学和数据结构。

像Python这样的脚本语言甚至更好,因为它是严格和一致的。每个人都可以更好地理解彼此的Python代码,而不是使用其他具有混乱和不一致编程范例的语言。

Python重视我们正在努力做的工作的核心,并且完全最小化了我们如何给计算机下达指令等其他事情,这是应该的,自动化所有你不应该考虑的事情,让你更好地为了达到目标写代码。

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


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

准确率94%!Python 机器学习识别微博或推特机器人

推特或微博机器人的存在其实是比较危险的,他们可以制造虚假的流量、传播谣言、甚至执行一些令人汗颜的恶意操作,这里我们使用kaggle纽约大学2017年机器学习竞赛的推特分类数据来进行我们的识别实验,本实验的数据集请访问:下载Python推特机器人分类数据集

在开始之前我们需要安装以下Python包(),打开你的CMD(Windows系统)/Terminal(macOS系统)输入以下指令即可:

pip install numpy
pip install seaborn
pip install pandas
pip install matplotlib
pip install scikit-learn

其中numpy和pandas都是用于数据处理的,numpy是一个C编写的,所以运算会比python内置的运算快,此外,matplotlib和seaborn主要用于Python数据可视化。scikit-learn内置了许多常用的机器学习分析模型,用起来非常简单。

1.Python加载数据

好了,废话不多说,让我们现在就开始使用panda加载数据,分别获得bot和非bot数据:

import pandas as pd
import numpy as np
import seaborn
import matplotlib

data = pd.read_csv('training_data.csv')
Bots = data[data.bot==1]
NonBots = data[data.bot==0]

使用热力图识别训练集/测试集中缺失数据:

seaborn.heatmap(data.isnull(), yticklabels=False, cbar=False, cmap='viridis')
# 热力图,当data中有空值时标为黄色
matplotlib.pyplot.tight_layout() 
matplotlib.pyplot.show()
Python识别缺失数据

2.Python 特征选择

什么是特征选择?其实很简单,我们在日常生活中识别西瓜和榴莲的时候是怎么识别的?比如从外观特征上:榴莲带刺、黄色的;西瓜圆润、绿色的。机器学习模型也是一样的,我们需要从类似于挑选西瓜外观特征来挑选两个类别的特征。比如说应用上我们前面的Python热力图查看数据缺失

Python机器人的数据缺失热力图
Python非机器人的数据缺失热力图

我们可以明显地看到机器人的location, urls明显缺失的部分更多。因此我们的特征可以加上这两项,由于数据量不多,我们应该绕过字符串编码,以location列为例,编码方式为:如果location缺失则为false, location存在则为True.

其他特征当然还有比如姓名、描述(description ) 这样的必输信息。当然,我们还能通过选择Twitter机器人使用的一些不好的单词将他们作为特征,如果他们的信息里包含了这些脏话,则将该机器人的该项特征设为True。下面是一个机器人使用脏话的例子。你可以添加更多的单词:

bag_of_words_bot = r'bot|b0t|cannabis|tweet me|mishear|follow me|updates every|gorilla|yes_ofc|forget' \
r'expos|kill|bbb|truthe|fake|anony|free|virus|funky|RNA|jargon'\
r'nerd|swag|jack|chick|prison|paper|pokem|xx|freak|ffd|dunia|clone|genie|bbb' \
r'ffd|onlyman|emoji|joke|troll|droop|free|every|wow|cheese|yeah|bio|magic|wizard|face'

将我们的特征编码为数字的形式:

# 该列的每个值包不包含脏话,包含则为True,不包含则为False
data['screen_name_binary'] = data.screen_name.str.contains(bag_of_words_bot, case=False, na=False)
data['name_binary'] = data.name.str.contains(bag_of_words_bot, case=False, na=False)
data['description_binary'] = data.description.str.contains(bag_of_words_bot, case=False, na=False)
data['status_binary'] = data.status.str.contains(bag_of_words_bot, case=False, na=False)

# 判断该列的每个值是否有listedcount>20000的情况,有的话为False,没有的话为True
data['listed_count_binary'] = (data.listedcount>20000)==False 

# 判断该列的每个值是否有空的情况,有空的则为False,否则为True
data['location_binary'] = ~data.location.isnull()
data['url_binary'] = ~data.url.isnull()

# 选定我们的特征
features = ['screen_name_binary', 'name_binary', 'description_binary', 'status_binary', 'verified', 'followers_count','verified', 'friends_count', 'statuses_count', 'listed_count_binary', 'bot', 'url_binary', 'location_binary', 'default_profile', 'default_profile_image'] 

其中需要注意的是所有的文本我们都编码为0和1的形式(存不存在脏话)。

3.Python scikit-learn训练与测试

现在让我们来使用Python scikit-learn包里的决策树模型进行分类。

首先我们引入需要使用到的包,有三个,如下:

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split 

1.从 sklearn.tree 引入 DecisionTreeClassifier ,这是一个决策树的分类器模型,我们一会将使用它进行训练;
2.sklearn.metrics 引入 accuracy_score 这是用于方便计算准确率的;
3.sklearn.model_selection 的 train_test_split 是用于方便分割训练集和测试集的。

分割训练集

X = data[features].iloc[:,:-1] 
# 除了最后一列的BOT都是数据
y = data[features].iloc[:,-1] 
# BOT是分类对象,1:机器人 0:非机器人X_train, 
X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=101)

使用到了train_test_split()函数,test_size=0.3即30%的数据用于测试,random_state=101 是随机数种子,设置后对于每次不改变训练集的测试,测试结果都一样。

训练与测试

clf = DecisionTreeClassifier(criterion='entropy', min_samples_leaf=50, min_samples_split=10)
clf.fit(X_train, y_train)
y_pred_train = clf.predict(X_train)
y_pred_test = clf.predict(X_test)  
print("Training Accuracy: %.5f" %accuracy_score(y_train, y_pred_train))
print("Test Accuracy: %.5f" %accuracy_score(y_test, y_pred_test)) 

初始化了一个决策树模型clf,clf.fit即开始进行训练,clf.predict则为测试。

4.Python 模型结果

测试结果

最终我得到的结果如下,测试准确率高达94.4%,这是一个相当令人满意的结果了,在当时的kaggle比赛里大约能排在27名左右。你也可以尝试其他的模型,并非只有决策树可以选择,比如说SVM、LR都可以尝试一下。

kaggle排名

全部源代码下载请点击:Python机器学习识别微博或推特机器人(acc:94.4%)

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


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

【已修复】Python推特机器人分类数据集(2017 Kaggle NYU)下载

这是一个python机器学习数据集。

来自于kaggle的

NYU Tandon Spring 2017 Machine Learning Competition: Twitter Bot classification

数据源下载:

7行代码 Python热力图可视化分析缺失数据处理

Python热力图寻找缺失数据
Python热力图寻找缺失数据

你有没有遇到一种情况,处理一张很大的csv表格的时候很难找到表格中每一列的缺失数据,或者说处理速度非常慢?当然如果你的Excel水平非常高,这个可能不会成为你的问题,但如果当你想可视化出每一列缺失数据的分布和数量怎么办呢?这时候就需要用Python绘制热力图了!

1.安装所需要的第三方Python

在开始之前我们需要安装以下Python包(),打开你的CMD(Windows系统)/Terminal(macOS系统)输入以下指令即可:

pip install seaborn
pip install pandas
pip install matplotlib

其中pandas是用于数据操作与处理的,matplotlib和seaborn主要用于Python数据可视化,也就是绘制我们所需要的热力图。

2.Python加载数据

好了,废话不多说,让我们现在就开始使用panda加载数据:

import pandas as pd
import numpy as np
import seaborn
import matplotlib

data = pd.read_csv('training_data.csv')

没错,pandas的使用就这么简单,读取csv文件直接使用read_csv函数,你可以使用自己需要的csv文件,也可以使用我们提供的:点击下载 Python推特机器人分类数据集 中的training_data.csv,只需要你移动到当前代码的文件夹下即可。

3.Python构造热力图

使用Python构造热力图识别表格的缺失数据:

seaborn.heatmap(data.isnull(), yticklabels=False, cbar=False, cmap='viridis')
# 热力图,当data中有空值时标为黄色
matplotlib.pyplot.tight_layout() 
matplotlib.pyplot.show()
Python热力图寻找缺失数据
Python热力图寻找缺失数据

seaborn.heatmap用于生成热力图,其会检查data中的每个单元格,如果为空则标记为黄色,cmap为颜色图谱,viridis即蓝-绿-黄. 此外,matplotlib.pyplot主要用于负责展示图片。如果你需要知道seaborn更详细的参数文档,可以阅读这篇文章

整体代码如下(一共只用了7行

import pandas as pd
import seaborn
import matplotlib
data = pd.read_csv('training_data.csv')
seaborn.heatmap(data.isnull(), yticklabels=False, cbar=False, cmap='viridis')
matplotlib.pyplot.tight_layout() 
matplotlib.pyplot.show()

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


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

Python 监控Github项目更新并自动下载

如果你有自己在本地维护一个开源代码,你就会知道检测这些是否更新了是多麻烦的一件事情。随着库的增大,人工维护成本也就越来越大。因此便有了这个项目的想法:让我们用Python监控Github项目是否有更新,如果有的话自动下载该更新

1.统一文件名格式

为了能够获取github上的项目的更新时间,我们需要调用github的一个API:

https://api.github.com/repos/用户名/库名

可以看到,这个API由 用户名/名 组成,因此我们的文件名应该以它为标准才能方便API的调用,由于文件名不可以带有 ‘/’ 这样的特殊符号,因此我们改为下划线分割,如FastText项目调用API的时候为:

https://api.github.com/repos/facebookresearch/fastText

我们保存的文件名则为 facebookresearch_fastText.zip 这样,在调用API、下载文件的时候将会方便许多

2.获得文件夹里的所有文件名及其最后修改时间

为了判断github上的项目是否相对于本地有更新,我们需要获得每一个本地的文件的最后修改时间,因此这是一个字典关系。代码如下:

获得文件夹里的所有文件名及其最后修改时间

3.与Github线上项目对比更新时间

首先我们要通过调用我们前面说提到的API 获取github线上项目的时间。其次,一定要将其格式化为10位时间戳,因为我们第二步获得的时间也是10位时间戳,这样对比起来非常方便。最后返回的时候只需要返回是否需要更新即可。如图所示。

github 最后更新时间
github update time

代码如下:

与Github线上项目对比更新时间

4.如果有需要更新的项目,让其自动下载

由于许多github项目文件压缩包都挺大的,我们这里采用了流式下载。如果你的项目特别多,你需要更快地进行下载,请采用批量异步下载。在我们之前的那篇文章里都有,点击即可阅读

如果有需要更新的项目,让其自动下载

5. 整套流程

我们把已经下载好的项目文件放在libs文件夹里,自动下载得到的文件放置在new文件夹中。文件结构如下:

F:\pythondict\pythondict-downloads\
│ superviser.py

├─libs
│ facebookresearch_fastText.zip
│ facebookresearch_MUSE.zip

└─new

整套代码如下,为了防范盗取文章的家伙,原谅我这里是图片的格式,如果需要下载请点击这里

Python监控Github项目是否有更新

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


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

有趣好用的Python教程