在 Python 中使用 JSON

JSON 简介

在介绍 JSON 之前,我们先介绍序列化(Serialization)和反序列化(Deserialization)的概念。

  • 序列化: 将数据结构或对象转换成二进制串的过程。
  • 反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。

常见的序列化方法有:XML、JSON、Protobuf、Thrift 和 Avro 等。

JSON(JavaScript Object Notation)是一种轻量级的网络数据交换格式,绝大部分编程语言都提供了很好的库来对 JSON 进行操作。键值对是 JSON 中最基本的数据结构。

Python 中已经内置了对 JSON 的支持,我们把一个 Python 对象编码转换成 JSON 字符串称为 encoding,也就是序列化;把 JSON 字符串解码转换成 Python 对象称为 decoding,也就是反序列化

在 Python 中,常见的普通对象类型主要有:string,int,list,dict 和 tuple 等。

阅读全文 »

自制 Alfred 插件: Google Search

简介

和大家分享我自己打造的一个谷歌搜索插件: Google-Alfred-Workflow

我平时写代码,写博客的时候经常免不了要谷歌一下,这时我一般唤醒 Alfred,然后输入搜索关键词,跳转到 Chrome 浏览器,查看搜索结果。另外,我在写博客的时候,经常需要获取某个网站的链接,比如想获取 Django 或者 Flask 或者 Bottle 的官网链接,这时我也是唤醒 Alfred,输入 Django,跳转到 Chrome 浏览器,复制想要的官网链接。这对于程序猿而言,简直不能忍受。于是,我就开始打造自己的一个谷歌搜索插件。

功能

目前插件看起来是这样子的:

google-search-result-2

阅读全文 »

在 Python 中使用 socks 代理

简介

在有些情况下,我们可能需要在 python 代码中使用 socks 代理。比如,下面的代码如果不使用代理,可能无法正常工作,因为有墙的存在:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# -*- coding: utf-8 -*-
import urllib2
url = 'https://www.google.com/search?q=linux'
request = urllib2.Request(url)
request.add_header("User-Agent", "Mozilla/5.001 (windows; U; NT4.0; en-US; rv:1.0) Gecko/25250101")
html_source = urllib2.urlopen(request, timeout=10).read()
if html_source:
print 'ok'
else:
print 'fail'

在终端运行该代码,出现一个 <urlopen error [Errno 65] No route to host> 的错误,也就是网络访问出错。

阅读全文 »

最简单的 python 并行实现方式

简介

在介绍如何最简单地利用 python 实现并行前,我们先来看一个简单的代码。

1
2
3
words = ['apple', 'bananan', 'cake', 'dumpling']
for word in words:
print word

上面的例子中,我们用一个 for 循环打印出 words 列表中的每个单词。问题来了,这里我们打印完一个单词才能接着打印另一个单词,能不能同时打印呢?好比如在银行的营业厅排队,如果只开一个窗口办理业务,你需要等前面一个人办完,才轮到你,如果能开多个窗口,显然会快很多。

我们将上面的代码抽象成下面的模式:

1
2
3
items = list()
for item in items:
process(item)

其中,items 是一个列表,process(arg) 是一个函数,可以有返回值也可以没有。我们希望可以将这种模式改成并行处理的方式,比如可以引入多线程等处理方式,但是这些处理方式往往会让代码变得更加复杂。那么有什么简单的处理方式吗?

阅读全文 »

使用 XPath 解析 HTML 文档

XPath 简介

XPath 的全称是 XML Path Language,即 XML 路径语言,它是一种在结构化文档(比如 XML 和 HTML 文档)中定位信息的语言,关于 XPath 的介绍可以参考 https://www.w3.org/TR/xpath/。

语法

HTML 实例文档

后面我们将以下面的 HTML 文档介绍 XPath 的使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>
<head>
<base href='http://example.com/' />
<title>Example website</title>
</head>
<body>
<div id='images'>
<a href='image1.html'>Name: My image 1 <br/><img src='image1_thumb.jpg'/></a>
<a href='image2.html'>Name: My image 2 <br/><img src='image2_thumb.jpg'/></a>
<a href='image3.html'>Name: My image 3 <br/><img src='image3_thumb.jpg'/></a>
<a href='image4.html'>Name: My image 4 <br/><img src='image4_thumb.jpg'/></a>
<a>Name: My image 5 <br/><img src='image5_thumb.jpg'/></a>
</div>
</body>
</html>

阅读全文 »

Python 如何将字符串转为字典

引言

在工作中遇到一个小问题,需要将一个 python 的字符串转为字典,比如字符串:

1
user_info = '{"name" : "john", "gender" : "male", "age": 28}'

我们想把它转为下面的字典:

1
user_dict = {"name" : "john", "gender" : "male", "age": 28}

有以下几种方法:

通过 json 来转换

1
2
3
4
5
6
>>> import json
>>> user_info= '{"name" : "john", "gender" : "male", "age": 28}'
>>> user_dict = json.loads(user_info)
>>> user_dict
{u'gender': u'male', u'age': 28, u'name': u'john'}

但是使用 json 进行转换存在一个潜在的问题。

阅读全文 »

Python 虚拟环境的使用

Virtualenv 允许在一台机器上创建多个隔离的 python 运行环境,比如,有些项目是 python 2.7 的,有些项目却是 python 3.1 的,这时就需要创建两个独立的python运行环境了。Virtualenvwrapper提供了一些命令行的封装,更易于使用。

安装

1
2
$ pip install virtualenv
$ pip install virtualenvwrapper

virtualenv 的使用

创建虚拟环境

1
2
3
4
5
# 创建一个名为 ENV 的虚拟环境,它会自动帮我们安装 python, pip 等
may@Matrix-MacBook-Pro:~[14:32] $ virtualenv ENV
New python executable in ENV/bin/python
Installing setuptools, pip, wheel...done.

阅读全文 »

mongoengine 基本使用

上一篇博文介绍了 pymongo的基本使用,本文则介绍 mongoengine 的基本使用,mongoengine 底层使用的是 pymongo 库。

本文所使用的 mongoengine 版本是 0.10.6。

定义文档模式

pymongo不同的是,使用mongoengine需要先定义文档模式,比如,我们定义一个Student的文档:

1
2
3
4
5
6
7
8
9
class Student(DynamicDocument):
meta = {
'collection': 'student',
'strict': False
}
stu_id = IntField()
age = IntField()
name = StringField()
gender = StringField()

阅读全文 »

pymongo 基本使用

pymongo 是在 python 中操作 mongodb 的一个包,使用方法跟 mongodbshell 命令行类似。本文使用的 pymongo 版本是 3.2.1

连接数据库

1
2
3
4
5
6
7
8
9
10
11
12
# -*- coding: utf-8 -*-
# pymongo 版本 3.2.1
import re
from pymongo import MongoClient
from bson.objectid import ObjectId
def con_mongo():
"""连接数据库"""
# 建立连接
client = MongoClient(host='127.0.0.1', port=27017)
return client

阅读全文 »

python 时间戳处理

1. python 时间戳处理

Unix 时间戳根据精度的不同,有 10 位(秒级),13 位(毫秒级),16 位(微妙级)和 19 位(纳秒级)。在 python 中,我们可以将一个整数的时间戳转换为字符串格式,如 '2016-02-25 20:21:04',也可以将其转换为 python 中的 datetime 格式。反之,也可以将整数的时间戳转换为字符串格式和 datetime 格式。用图展示如下:

1
2
3
4
5
6
7
8
9
10
11
12
+------------+
| timestamp |
+---->| |<-----+
| +------------+ |
| |
| |
| |
v v
+------------+ +------------+
| datetime | | string |
| |<---------->| |
+------------+ +------------+

要注意的是,由于每个时区都有自己的本地时间(北京在东八区),因此也产生了世界标准时间(UTC, Universal Time Coordinated)。所以,在将一个时间戳转换为普通时间(比如 2016-01-01 12:00:00)时,要注意是要本地时区的时间还是世界时间等。

阅读全文 »