分类目录归档:Python

Python requests库的一些实用经验


Python的requests库应该是Python里最常用也是最好用的HTTP库。相较于之前的urllib、httplib等库,requests的封装更友好,上手更加容易。

show me the code

使用requests库完成一次http请求非常简单,代码如下:

import requests

url = "https://www.baidu.com"
resp = requests.get(url)

requests库在拥有高级封装的同时,也提供了一些有用的request hooks。它们可以帮助我们更好的处理请求中出现的问题。

request hooks

当我们在调用一个第...

Read more

Python的异常使用经验总结


在Python中,BaseException是所有异常的基类。但是通常我们不应该直接使用它来捕获异常(虽然它都可以捕获),取而代之的是我们需要针对于具体的业务场景,自定义适合的异常类型。

BaseException的实现在CPython源码中的Objects/exceptions.c这个文件中。如下文:

/*
 *    Exception extends BaseException
 */
SimpleExtendsException(PyExc_BaseException, Exception,
                       "Common base class fo...

Read more

Python的垃圾回收


在介绍垃圾回收之前,我们先来看看什么是内存管理。

内存管理

在任意一种编程语言中,都是通过声明对象、操作对象来完成某项任务。这里的对象可以是简单类型,比如:字符串、整数等等。也可以是像数字、哈希、类等复杂的数据结构。这些对象的值保存在内存中,可以方便程序快速读取数据进行操作。 编程语言的内存管理是编程语言设计的一个重要方面。它是决定编程语言性能的重要因素。无论是C语言的手工管理,还是Java的垃圾回收,都成为编程语言最重要的特征。

手工年代

在使用早年的编程语言(C、C++等)开发时,开发人员需要自己在代码中对内存进行管理。也就是说,在声明一个对象之前需要先进行内存分配,分配完毕之后才能...

Read more

Django将数据从Sqlite迁移到MySQL


背景

最近在做一个内部项目时,为了开发效率,所以选择了Sqlite作为数据库,在项目上线时需要将数据库切换到MySQL。

操作步骤

  1. 使用dumpdata将数据导出到文件
python manage.py dumpdata -> data.json
  1. 修改django的settings配置,改为MySQL

  2. 使用loaddata将数据导入到新数据库

python manage.py loaddata data.json

等待命令执行完毕之后,可以自行检查数据是否正确导入。

常见问题

由于字段过长导致的导入失败

这种问题是因为Sqlite对于字段长度并不做校验,比如我们定义一个...

Read more

Django使用fixture简化测试用例


在编写测试用例时需要提前准备测试用的数据。在Django中,有2种比较推荐的准备测试数据的办法:

  1. 在测试用例的setUp方法种添加测试用数据
  2. 使用fixture将测试数据导入到数据库

使用setUp添加数据

在setUp方法中添加测试数据的写法比较简单,例如:

class EXPtest(TestCase):
    def setUp(self):
        self.level0 = Level.objects.create(level=0, exp=0)
        self.level1 = Level.objects.create(level=1, exp=5)
...

Read more

Ubuntu编译安装Python3


背景

因为工作原因,所以经常需要给新机器安装Python3运行环境。所以记录一下安装过程,方便后续查阅。

安装Python

下载源码

Python的源码下载需要到官网下载,地址为:

https://www.python.org/downloads/source/

找到需要的版本进行下载,比如: 3.8.2版本。

安装依赖

在编译安装Python之前,需要先安装一些系统依赖,可以使用如下命令:

sudo apt-get install zlib1g-dev libbz2-dev libssl-dev libncurses5-dev  libsqlite3-dev libreadline-d...

Read more

修改django admin里的时间显示格式


在使用Django Admin做一些业务系统时发现它默认的时间格式是类似于:

May 8, 2020, 11:55 a.m.

这对于一般的客户来说,读起来有点麻烦。所以经常会收到反馈是希望有一个易读性更强的时间字段。实现方法很简单,可以这样:

在ModelAdmin中,添加一个新的时间方法,例如:

def formated_time(self, obj):
    return obj.timefield.strftime("%Y-%m-%d %H:%M:%S")

然后指定它对应的ORM中的字段以及字段的说明:

formated_time.admin_order_field = 'tim...

Read more

解决MacOS: certificate verify failed: unable to get local issuer certificate的问题


最近将工作的操作系统从Ubuntu切换到了MacOS。在运行爬虫脚本时,如果抓取HTTP的页面,则没有报错,但是当遇到HTTPS页面时,就出现了这么一个报错:

certificate verify failed: unable to get local issuer certificate (_ssl.c:1045)

出现这个问题的原因是给这个网站的签发证书的CA证书没有在操作系统的root证书列表里。这里有2个可能:

  1. 证书是自签名证书(类似于之前的12306)
  2. CA是一个新的CA,操作系统里没有更新对应的CA证书

对于这个问题可以有2个解决办法:

  1. 在脚本中不校验服务端证书有效性;...

Read more

使用scikit实现回归


scikit-learn是一个由Python开发的免费开源机器学习库,它提供了现成的功能来实现诸如线性回归分类器、SVM、k-means和神经网络等多种算法,以及一些可以直接用于训练和测试的样本数据集。是目前机器学习应用程序中使用最广泛的库之一。

安装scikit

可以直接使用pip进行安装:

pip install scikit-learn

什么是学习

学习就是人类通过观察、积累经验,掌握某项技能或能力。就好像我们从小学习识别字母、认识汉字,就是学习的过程。而机器学习(Machine Learning),顾名思义,就是让机器(计算机)也能向人类一样,通过观察大量的数据和训练,发现事物规...

Read more

NumPy和Pandas


NumPy和Pandas都是用Python做数据处理时非常好用的库。在一个新同学要使用Python做数据分析处理时,通常都会被推荐使用NumPy和Pandas这2个库。

Numpy提供了很多方便统计计算的功能,比如计算均值(mean函数)和标准差(std函数)。NumPy支持向量计算,例如向量加法、与标量相乘等。而Pandas则更进一步,它是基于NumPy开发的数学分析工具,是为了解决数据分析任务而开发的,用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效、方便很多。

一维数组

既然要做数据分析,那就不能只是分析单个数据了,所以从一维数组的数据分析开始。在NumPy中,一维数...

Read more