Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
moyewuji
Python-100-Days
提交
8e861a8a
P
Python-100-Days
项目概览
moyewuji
/
Python-100-Days
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Python-100-Days
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
8e861a8a
编写于
6月 03, 2018
作者:
骆昊的技术专栏
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
更新了爬虫阶段的文档
上级
25830d37
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
440 addition
and
2 deletion
+440
-2
Day01-15/Day01/peppa_pig.py
Day01-15/Day01/peppa_pig.py
+193
-0
Day66-75/03.存储数据.md
Day66-75/03.存储数据.md
+247
-2
未找到文件。
Day01-15/Day01/peppa_pig.py
0 → 100644
浏览文件 @
8e861a8a
from
turtle
import
*
def
nose
(
x
,
y
):
#鼻子
penup
()
#提起笔
goto
(
x
,
y
)
#定位
pendown
()
#落笔,开始画
setheading
(
-
30
)
#将乌龟的方向设置为to_angle/为数字(0-东、90-北、180-西、270-南)
begin_fill
()
#准备开始填充图形
a
=
0.4
for
i
in
range
(
120
):
if
0
<=
i
<
30
or
60
<=
i
<
90
:
a
=
a
+
0.08
left
(
3
)
#向左转3度
forward
(
a
)
#向前走a的步长
else
:
a
=
a
-
0.08
left
(
3
)
forward
(
a
)
end_fill
()
#填充完成
penup
()
setheading
(
90
)
forward
(
25
)
setheading
(
0
)
forward
(
10
)
pendown
()
pencolor
(
255
,
155
,
192
)
#画笔颜色
setheading
(
10
)
begin_fill
()
circle
(
5
)
color
(
160
,
82
,
45
)
#返回或设置pencolor和fillcolor
end_fill
()
penup
()
setheading
(
0
)
forward
(
20
)
pendown
()
pencolor
(
255
,
155
,
192
)
setheading
(
10
)
begin_fill
()
circle
(
5
)
color
(
160
,
82
,
45
)
end_fill
()
def
head
(
x
,
y
):
#头
color
((
255
,
155
,
192
),
"pink"
)
penup
()
goto
(
x
,
y
)
setheading
(
0
)
pendown
()
begin_fill
()
setheading
(
180
)
circle
(
300
,
-
30
)
circle
(
100
,
-
60
)
circle
(
80
,
-
100
)
circle
(
150
,
-
20
)
circle
(
60
,
-
95
)
setheading
(
161
)
circle
(
-
300
,
15
)
penup
()
goto
(
-
100
,
100
)
pendown
()
setheading
(
-
30
)
a
=
0.4
for
i
in
range
(
60
):
if
0
<=
i
<
30
or
60
<=
i
<
90
:
a
=
a
+
0.08
lt
(
3
)
#向左转3度
fd
(
a
)
#向前走a的步长
else
:
a
=
a
-
0.08
lt
(
3
)
fd
(
a
)
end_fill
()
def
ears
(
x
,
y
):
#耳朵
color
((
255
,
155
,
192
),
"pink"
)
penup
()
goto
(
x
,
y
)
pendown
()
begin_fill
()
setheading
(
100
)
circle
(
-
50
,
50
)
circle
(
-
10
,
120
)
circle
(
-
50
,
54
)
end_fill
()
penup
()
setheading
(
90
)
forward
(
-
12
)
setheading
(
0
)
forward
(
30
)
pendown
()
begin_fill
()
setheading
(
100
)
circle
(
-
50
,
50
)
circle
(
-
10
,
120
)
circle
(
-
50
,
56
)
end_fill
()
def
eyes
(
x
,
y
):
#眼睛
color
((
255
,
155
,
192
),
"white"
)
penup
()
setheading
(
90
)
forward
(
-
20
)
setheading
(
0
)
forward
(
-
95
)
pendown
()
begin_fill
()
circle
(
15
)
end_fill
()
color
(
"black"
)
penup
()
setheading
(
90
)
forward
(
12
)
setheading
(
0
)
forward
(
-
3
)
pendown
()
begin_fill
()
circle
(
3
)
end_fill
()
color
((
255
,
155
,
192
),
"white"
)
penup
()
seth
(
90
)
forward
(
-
25
)
seth
(
0
)
forward
(
40
)
pendown
()
begin_fill
()
circle
(
15
)
end_fill
()
color
(
"black"
)
penup
()
setheading
(
90
)
forward
(
12
)
setheading
(
0
)
forward
(
-
3
)
pendown
()
begin_fill
()
circle
(
3
)
end_fill
()
def
cheek
(
x
,
y
):
#腮
color
((
255
,
155
,
192
))
penup
()
goto
(
x
,
y
)
pendown
()
setheading
(
0
)
begin_fill
()
circle
(
30
)
end_fill
()
def
mouth
(
x
,
y
):
#嘴
color
(
239
,
69
,
19
)
penup
()
goto
(
x
,
y
)
pendown
()
setheading
(
-
80
)
circle
(
30
,
40
)
circle
(
40
,
80
)
def
setting
():
#参数设置
pensize
(
4
)
hideturtle
()
#使乌龟无形(隐藏)
colormode
(
255
)
#将其设置为1.0或255.随后 颜色三元组的r,g,b值必须在0 .. cmode范围内
color
((
255
,
155
,
192
),
"pink"
)
setup
(
840
,
500
)
speed
(
10
)
def
main
():
setting
()
#画布、画笔设置
nose
(
-
100
,
100
)
#鼻子
head
(
-
69
,
167
)
#头
ears
(
0
,
160
)
#耳朵
eyes
(
0
,
140
)
#眼睛
cheek
(
80
,
10
)
#腮
mouth
(
-
20
,
30
)
#嘴
done
()
if
__name__
==
'__main__'
:
main
()
Day66-75/03.存储数据.md
浏览文件 @
8e861a8a
...
...
@@ -193,15 +193,260 @@ b'admin'
MongoDB是2009年问世的一个面向文档的数据库管理系统,由C++语言编写,旨在为Web应用提供可扩展的高性能数据存储解决方案。虽然在划分类别的时候后,MongoDB被认为是NoSQL的产品,但是它更像一个介于关系数据库和非关系数据库之间的产品,在非关系数据库中它功能最丰富,最像关系数据库。
MongoDB将数据存储为一个文档,一个文档由一系列的“键值对”组成,其文档类似于JSON对象。目前,MongoDB已经提供了对Windows、MacOS、Linux、Solaris等多个平台的支持,而且也提供了多种开发语言的驱动程序,Python当然是其中之一。
MongoDB将数据存储为一个文档,一个文档由一系列的“键值对”组成,其文档类似于JSON对象,但是MongoDB对JSON进行了二进制处理(能够更快的定位key和value),因此其文档的存储格式称为BSON。关于JSON和BSON的差别大家可以看看MongoDB官方网站的文章
[
《JSON and BSON》
](
https://www.mongodb.com/json-and-bson
)
。
目前,MongoDB已经提供了对Windows、MacOS、Linux、Solaris等多个平台的支持,而且也提供了多种开发语言的驱动程序,Python当然是其中之一。
#### MongoDB的安装和配置
可以从MongoDB的
[
官方下载链接
](
https://www.mongodb.com/download-center#community
)
下载MongoDB,官方为Windows系统提供了一个Installer程序,而Linux和MacOS则提供了压缩文件。下面简单说一下Linux系统如何安装和配置MongoDB。
```
Shell
# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon-3.6.5.tgz
# gunzip mongodb-linux-x86_64-amazon-3.6.5.tgz
# mkdir mongodb-3.6.5
# tar -xvf mongodb-linux-x86_64-amazon-3.6.5.tar --strip-components 1 -C mongodb-3.6.5/
# export PATH=$PATH:~/mongodb-3.6.5/bin
# mkdir -p /data/db
# mongod --bind_ip 172.18.61.250
2018-06-03T18:03:28.232+0800 I CONTROL [initandlisten] MongoDB starting : pid=1163 port=27017 dbpath=/data/db 64-bit host=iZwz97tbgo9lkabnat2lo8Z
2018-06-03T18:03:28.232+0800 I CONTROL [initandlisten] db version v3.6.5
2018-06-03T18:03:28.232+0800 I CONTROL [initandlisten] git version: a20ecd3e3a174162052ff99913bc2ca9a839d618
2018-06-03T18:03:28.232+0800 I CONTROL [initandlisten] OpenSSL version: OpenSSL 1.0.0-fips29 Mar 2010
...
2018-06-03T18:03:28.945+0800 I NETWORK [initandlisten] waiting for connections on port 27017
```
> 说明:上面的操作中,export命令是设置PATH环境变量,这样可以在任意路径下执行mongod来启动MongoDB服务器。MongoDB默认保存数据的路径是/data/db目录,为此要提前创建该目录。此外,在使用mongod启动MongoDB服务器时,—bind_ip参数用来将服务绑定到指定的IP地址,也可以用—port参数来指定端口,默认端口为27017。
#### MongoDB基本概念
我们通过与关系型数据库进行对照的方式来说明MongoDB中的一些概念。
| SQL | MongoDB | 解释(SQL/MongoDB) |
| ----------- | ----------- | ---------------------- |
| database | database | 数据库/数据库 |
| table | collection | 二维表/集合 |
| row | document | 记录(行)/文档 |
| column | field | 字段(列)/域 |
| index | index | 索引/索引 |
| table joins | --- | 表连接/嵌套文档 |
| primary key | primary key | 主键/主键(
`_id`
字段) |
#### 通过Shell操作MongoDB
启动服务器后可以使用交互式环境跟服务器通信,如下所示。
#### 使用MongoDB实现CRUD操作
```
shell
# mongo --host 172.18.61.250
MongoDB shell version v3.6.5
connecting to: mongodb://172.18.61.250:27017/
...
>
```
1.
查看、创建和删除数据库。
```
JavaScript
> // 显示所有数据库
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
> // 创建并切换到school数据库
> use school
switched to db school
> // 删除当前数据库
> db.dropDatabase()
{ "ok" : 1 }
>
```
2.
创建、删除和查看集合。
```
JavaScript
> // 创建并切换到school数据库
> use school
switched to db school
> // 创建colleges集合
> db.createCollection('colleges')
{ "ok" : 1 }
> // 创建students集合
> db.createCollection('students')
{ "ok" : 1 }
> // 查看所有集合
> show collections
colleges
students
> // 删除colleges集合
> db.colleges.drop()
true
>
```
> 说明:在MongoDB中插入文档时如果集合不存在会自动创建集合,所以也可以按照下面的方式通过创建文档来创建集合。
3.
文档的CRUD操作。
```
JavaScript
> // 向students集合插入文档
> db.students.insert({stuid: 1001, name: '骆昊', age: 38})
WriteResult({ "nInserted" : 1 })
> // 向students集合插入文档
> db.students.save({stuid: 1002, name: '王大锤', tel: '13012345678', gender: '男'})
WriteResult({ "nInserted" : 1 })
> // 查看所有文档
> db.students.find()
{ "_id" : ObjectId("5b13c72e006ad854460ee70b"), "stuid" : 1001, "name" : "骆昊", "age" : 38 }
{ "_id" : ObjectId("5b13c790006ad854460ee70c"), "stuid" : 1002, "name" : "王大锤", "tel" : "13012345678", "gender" : "男" }
> // 更新stuid为1001的文档
> db.students.update({stuid: 1001}, {'$set': {tel: '13566778899', gender: '男'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> // 插入或更新stuid为1003的文档
> db.students.update({stuid: 1003}, {'$set': {name: '白元芳', tel: '13022223333', gender: '男'}}, upsert=true)
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("5b13c92dd185894d7283efab")
})
> // 查询所有文档
> db.students.find().pretty()
{
"_id" : ObjectId("5b13c72e006ad854460ee70b"),
"stuid" : 1001,
"name" : "骆昊",
"age" : 38,
"gender" : "男",
"tel" : "13566778899"
}
{
"_id" : ObjectId("5b13c790006ad854460ee70c"),
"stuid" : 1002,
"name" : "王大锤",
"tel" : "13012345678",
"gender" : "男"
}
{
"_id" : ObjectId("5b13c92dd185894d7283efab"),
"stuid" : 1003,
"gender" : "男",
"name" : "白元芳",
"tel" : "13022223333"
}
> // 查询stuid大于1001的文档
> db.students.find({stuid: {'$gt': 1001}}).pretty()
{
"_id" : ObjectId("5b13c790006ad854460ee70c"),
"stuid" : 1002,
"name" : "王大锤",
"tel" : "13012345678",
"gender" : "男"
}
{
"_id" : ObjectId("5b13c92dd185894d7283efab"),
"stuid" : 1003,
"gender" : "男",
"name" : "白元芳",
"tel" : "13022223333"
}
> // 查询stuid大于1001的文档只显示name和tel字段
> db.students.find({stuid: {'$gt': 1001}}, {_id: 0, name: 1, tel: 1}).pretty()
{ "name" : "王大锤", "tel" : "13012345678" }
{ "name" : "白元芳", "tel" : "13022223333" }
> // 查询name为“骆昊”或者tel为“13022223333”的文档
> db.students.find({'$or': [{name: '骆昊'}, {tel: '13022223333'}]}, {_id: 0, name: 1, tel: 1}).pretty()
{ "name" : "骆昊", "tel" : "13566778899" }
{ "name" : "白元芳", "tel" : "13022223333" }
> // 查询学生文档跳过第1条文档只查1条文档
> db.students.find().skip(1).limit(1).pretty()
{
"_id" : ObjectId("5b13c790006ad854460ee70c"),
"stuid" : 1002,
"name" : "王大锤",
"tel" : "13012345678",
"gender" : "男"
}
> // 对查询结果进行排序(1表示升序,-1表示降序)
> db.students.find({}, {_id: 0, stuid: 1, name: 1}).sort({stuid: -1})
{ "stuid" : 1003, "name" : "白元芳" }
{ "stuid" : 1002, "name" : "王大锤" }
{ "stuid" : 1001, "name" : "骆昊" }
> // 在指定的一个或多个字段上创建索引
> db.students.ensureIndex({name: 1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
>
```
使用MongoDB可以非常方便的配置数据复制,通过冗余数据来实现数据的高可用以及灾难恢复,也可以通过数据分片来应对数据量迅速增长的需求。关于MongoDB更多的操作可以查阅
[
官方文档
](
https://mongodb-documentation.readthedocs.io/en/latest/
)
,同时推荐大家阅读Kristina Chodorow写的
[
《MongoDB权威指南》
](
http://www.ituring.com.cn/book/1172
)
。
####在Python程序中操作MongoDB
可以通过pip安装pymongo来实现对MongoDB的操作。
```
Shell
$ pip3 install pymongo
$ python3
```
```
Python
>>> from pymongo import MongoClient
>>> client = MongoClient('mongodb://120.77.222.217:27017')
>>> db = client.school
>>> for student in db.students.find():
... print('学号:', student['stuid'])
... print('姓名:', student['name'])
... print('电话:', student['tel'])
...
学号: 1001.0
姓名: 骆昊
电话: 13566778899
学号: 1002.0
姓名: 王大锤
电话: 13012345678
学号: 1003.0
姓名: 白元芳
电话: 13022223333
>>> db.students.find().count()
3
>>> db.students.remove()
{'n': 3, 'ok': 1.0}
>>> db.students.find().count()
0
>>> coll = db.students
>>> from pymongo import ASCENDING
>>> coll.create_index([('name', ASCENDING)], unique=True)
'name_1'
>>> coll.insert_one({'stuid': int(1001), 'name': '骆昊', 'gender': True})
<pymongo.results.InsertOneResult object at 0x1050cc6c8>
>>> coll.insert_many([{'stuid': int(1002), 'name': '王大锤', 'gender': False}, {'stuid': int(1003), 'name': '白元芳', 'gender': True}])
<pymongo.results.InsertManyResult object at 0x1050cc8c8>
>>> for student in coll.find({'gender': True}):
... print('学号:', student['stuid'])
... print('姓名:', student['name'])
... print('性别:', '男' if student['gender'] else '女')
...
学号: 1001
姓名: 骆昊
性别: 男
学号: 1003
姓名: 白元芳
性别: 男
>>>
```
关于PyMongo更多的知识可以通过它的
[
官方文档
](
https://api.mongodb.com/python/current/tutorial.html
)
进行了解。
### 实例 - 缓存知乎发现上的链接和页面代码
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录