Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 6da7ada

Browse files
committed
update json
Change-Id: I4869a7055e4444c848029000f37254accee39817
1 parent b13078c commit 6da7ada

File tree

8 files changed

+208
-10
lines changed

8 files changed

+208
-10
lines changed

‎content/decimal.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,3 +91,18 @@ def monetize(decimal_num):
9191
decimal.Decimal('0.01'))
9292
9393
```
94+
95+
### 指定精度
96+
97+
一般的需求是 越精确越好,但是有的时候,过于精确反而会带来误差,还是适度比较好。
98+
99+
```
100+
>>> from decimal import Decimal, getcontext
101+
>>> Decimal(10042.3)*100000
102+
Decimal('1004229999.999999927240423858')
103+
>>> int(Decimal(10042.3)*100000)
104+
1004229999
105+
>>> getcontext().prec = 12
106+
>>> int(Decimal(10042.3)*100000)
107+
1004230000
108+
```

‎content/itertools.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ StopIteration
154154
- islice(seq, [start,] stop [, step]) 类似于 slice 函数,即接片操作,返回 seq[start:stop:step] ,如 islice('abcdefg',2,8,2) ,得到 c,e,g
155155
- imap(func, p, q, ...) 类似于 map 函数,返回 func(p0,q0,...),func(p1,q1,...),... 如 imap(lambda x,y:x+y,[1,2,3,4],[7,8,9,0]) ,得到 8,10,12,4
156156
- starmap(func,q) 类似与 imap 函数,返回 func(q[0]),func(q[1]),... 如 starmap(lambda x,y:x+y,zip([1,2,3,4],[7,8,9,0])) 得到 8,10,12,4
157-
- tee(p,n=1) 由 p 生成 n 个序列,返回这 n 个序列的数组,n 个序列值相同,地址不同
157+
- tee(p,n=1) 由 p 生成 n 个序列,返回这 n 个序列的数组,n 个序列值相同,地址不同,就是将 p 重复输出 n 遍,得到n个迭代器。
158158
- izip(p,q,...) 类似于 zip ,返回 (p0,q0,...),(p1,q1,...),... 如 izip([1,2,3],[4,5,6],[7,8,9]) 得到 (1,4,7),(2,5,8),(3,6,9)
159159
- izip_longest() 类似与 izip ,应该是可以使用数据比 izip 更大一点的吧。
160160

‎content/json.md

Lines changed: 128 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
## json
22

3-
python这么强大的语言当然也可以用来处理json,两个主要的函数是`json.dumps()``json.loads()`分别用来将dist字典格式的Python数据编码为json数据格式,和将json数据格式解码为Python的数据格式
3+
python这么强大的语言当然也可以用来处理json,两个主要的函数是`json.dumps()``json.loads()`分别用来将dist字典格式的Python数据编码为json数据格式字符串,和将json数据格式字符串解码为Python的数据格式
44

55
> 还有 ujson 更快,simplejson 兼容性更强
66
77
分别有四个主要的函数
88

99
```
10-
dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding='utf-8', default=None, sort_keys=False, **kw) # 将 json 转换为字符串并存储到文件中
11-
dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding='utf-8', default=None, sort_keys=False, **kw) # 将 json 转换为字符串
12-
load(fp, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw) # 从文件中读取字符串并转换为 json
13-
loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw) # 将字符串转换为 json
10+
# 将 python 的数据格式转换为 json 字符串并存储到文件中
11+
dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding='utf-8', default=None, sort_keys=False, **kw)
12+
# 将 python 的数据格式转换为 json 字符串
13+
dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding='utf-8', default=None, sort_keys=False, **kw)
14+
# 从文件中读取 json 字符串并转换为python 的数据格式
15+
load(fp, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
16+
# 将 json 字符串转换为 python 的数据格式
17+
loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
1418
```
1519

1620
```python
@@ -160,5 +164,122 @@ json 和 dict 还有两个地方不一样
160164

161165
2018年06月21日
162166

163-
- `` 能够对格式化对象进行一个简单的压缩,取消空格
164-
- `json.dumps(obj, separators=(',',':'), ensure_ascii=False)` 能够输出 utf-8 格式的中文即可见的中文,而非 Unicode 格式的中文 `\uXXXX`
167+
- `json.dumps(obj, indent=4)` 能够输出一个格式化的字符串,有换行有缩进。
168+
- `json.dumps(obj, separators=(',',':'))` 能够对输出字符串进行一个简单的压缩,取消空格.因为默认是 `(', ', ': ')`
169+
- `json.dumps(obj, ensure_ascii=False)` 能够输出 utf-8 格式的中文即可见的中文,而非 Unicode 格式的中文 `\uXXXX`
170+
171+
2020年09月09日
172+
173+
正常的 json 字符串像这样 `{"price": 542.23, "name": "ACME", "shares": 100, "others": ["first thing", "second thing", "third thing"]}` 都是没问题的,但是如果在 json 对象中,key 或者 value 里存在控制字符,就会出现 `Invalid Control Character``ValueError`
174+
175+
**什么是控制字符?**
176+
ACSII 码表,排名前三十二位和最后一位的字符就是控制字符,包括 `\t`, `\n`, `\r` 等。
177+
178+
[ASCII码一览表](http://c.biancheng.net/c/ascii/)
179+
180+
**出现控制字符怎么办?**
181+
182+
比如这样的 json 字符串 `'{"price": 542.23, "name": "ACME", "sh\rares": 100, "others": ["first thing", "second\t thing", "third\n thing"]}'`
183+
184+
不要惊慌,在解析的时候,传入参数 `strict=False` 即可。
185+
186+
```
187+
In [28]: s = '{"price": 542.23, "name": "ACME", "shares": 100, "others": ["first thing", "second thing", "third thing"]}'
188+
189+
In [29]: json.loads(s)
190+
Out[29]:
191+
{u'name': u'ACME',
192+
u'others': [u'first thing', u'second thing', u'third thing'],
193+
u'price': 542.23,
194+
u'shares': 100}
195+
196+
In [30]: s = '{"price": 542.23, "name": "ACME", "sh\rares": 100, "others": ["first thing", "second\t thing", "third\n thing"]}'
197+
198+
In [31]: json.loads(s)
199+
---------------------------------------------------------------------------
200+
ValueError Traceback (most recent call last)
201+
<ipython-input-31-48280973ea66> in <module>()
202+
----> 1 json.loads(s)
203+
204+
/Users/bytedance/miniconda/envs/byted/lib/python2.7/json/__init__.pyc in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
205+
337 parse_int is None and parse_float is None and
206+
338 parse_constant is None and object_pairs_hook is None and not kw):
207+
--> 339 return _default_decoder.decode(s)
208+
340 if cls is None:
209+
341 cls = JSONDecoder
210+
211+
/Users/bytedance/miniconda/envs/byted/lib/python2.7/json/decoder.pyc in decode(self, s, _w)
212+
362
213+
363 """
214+
--> 364 obj, end = self.raw_decode(s, idx=_w(s, 0).end())
215+
365 end = _w(s, end).end()
216+
366 if end != len(s):
217+
218+
/Users/bytedance/miniconda/envs/byted/lib/python2.7/json/decoder.pyc in raw_decode(self, s, idx)
219+
378 """
220+
379 try:
221+
--> 380 obj, end = self.scan_once(s, idx)
222+
381 except StopIteration:
223+
382 raise ValueError("No JSON object could be decoded")
224+
225+
ValueError: Invalid control character at: line 1 column 38 (char 37)
226+
227+
In [32]: json.loads(s, strict=False)
228+
Out[32]:
229+
{u'name': u'ACME',
230+
u'others': [u'first thing', u'second\t thing', u'third\n thing'],
231+
u'price': 542.23,
232+
u'sh\rares': 100}
233+
```
234+
235+
**还需要注意两点**
236+
1. 如果不是在 json 字符串的字符串类型中有控制字符,是可以正常解析的,在 json 的两个 key 之间是可以有正常的换行符,比如这样的字符串 `'\n{"price": 542.23,\n "name": "ACME", \t"shares": 100, "others": ["first thing", "second thing",\n "third thing"]}'`
237+
2. 如果不是手动换行符,而是出现了换行,也是一样的换行符,主要是在 json 的每个元素里,不能有换行符。
238+
239+
```
240+
In [34]: s = '\n{"price": 542.23,\n "name": "ACME", \t"shares": 100, "others": ["first thing", "second thing",\n "third thing"]}'
241+
242+
In [35]: json.loads(s)
243+
Out[35]:
244+
{u'name': u'ACME',
245+
u'others': [u'first thing', u'second thing', u'third thing'],
246+
u'price': 542.23,
247+
u'shares': 100}
248+
249+
In [37]: s= """{"price": 542.23, "name": "ACME", "shares": 100, "others": ["first thing", "second
250+
...: thing", "third thing"]}"""
251+
252+
In [38]: s
253+
Out[38]: '{"price": 542.23, "name": "ACME", "shares": 100, "others": ["first thing", "second \nthing", "third thing"]}'
254+
255+
In [39]: json.loads(s)
256+
---------------------------------------------------------------------------
257+
ValueError Traceback (most recent call last)
258+
<ipython-input-39-48280973ea66> in <module>()
259+
----> 1 json.loads(s)
260+
261+
/Users/bytedance/miniconda/envs/byted/lib/python2.7/json/__init__.pyc in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
262+
337 parse_int is None and parse_float is None and
263+
338 parse_constant is None and object_pairs_hook is None and not kw):
264+
--> 339 return _default_decoder.decode(s)
265+
340 if cls is None:
266+
341 cls = JSONDecoder
267+
268+
/Users/bytedance/miniconda/envs/byted/lib/python2.7/json/decoder.pyc in decode(self, s, _w)
269+
362
270+
363 """
271+
--> 364 obj, end = self.raw_decode(s, idx=_w(s, 0).end())
272+
365 end = _w(s, end).end()
273+
366 if end != len(s):
274+
275+
/Users/bytedance/miniconda/envs/byted/lib/python2.7/json/decoder.pyc in raw_decode(self, s, idx)
276+
378 """
277+
379 try:
278+
--> 380 obj, end = self.scan_once(s, idx)
279+
381 except StopIteration:
280+
382 raise ValueError("No JSON object could be decoded")
281+
282+
ValueError: Invalid control character at: line 1 column 84 (char 83)
283+
284+
```
285+

‎content/markdown.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,4 +238,4 @@ l.close()
238238

239239
保存为md2html.py,运行,看一下结果。
240240

241-
![md2html.jpg](images/md2html.jpg)
241+
![md2html.jpg](images/md2html.jpg)

‎content/marshmallow.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,13 @@ Deserializing,将一个 dict 或者 string 转化为对象,使用方法 `loa
2929
- error_messages 自定义错误信息
3030
- many 转化为 list
3131
- attribute 别名,这个就很神奇。在 `load` 中表示 `load_to`, 在 `dump` 中表示 `dump_from`
32+
- 在 python3 中 ,marshmallow 统一去除了 `load_from``dump_to` 字段,用 `data_key` 来表述
3233
- load_only 或者 `dump_only` 字面意思
3334

3435
除了基本数据类型,如 Str, Int, Float, Dict, List 等,还有组合结构类型 Nested 和函数转化 Function 等。
3536

37+
在 Function 中,deserialize 函数的参数是当前字段的值,serialize 的参数却是整个结构体的值。
38+
3639
### 实例
3740

3841
```

‎content/socket.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1240,6 +1240,60 @@ if __name__ == '__main__':
12401240
12411241
```
12421242

1243+
#### 同时监听
1244+
1245+
TCP 和 UDP 虽然都是同样的 ip 和 端口,但是是运行在两套不同的协议下的,可以同时监听同一个端口
1246+
1247+
甚至可以在一个服务里,同时监听同一个端口的 tcp 请求和 udp 请求
1248+
1249+
```
1250+
# -*- coding: utf-8 -*-
1251+
1252+
import socket
1253+
import select
1254+
1255+
host = '127.0.0.1'
1256+
port = 8780
1257+
1258+
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1259+
tcp_server.bind((host, port))
1260+
tcp_server.listen(5)
1261+
1262+
udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1263+
udp_server.bind((host, port))
1264+
1265+
inputs = [tcp_server, udp_server]
1266+
1267+
if __name__ == '__main__':
1268+
1269+
print("Concurrent Listening on {}:{}, Press Ctrl-C to stop".format(host, port))
1270+
1271+
while True:
1272+
rs, ws, es = select.select(inputs, [], [])
1273+
for r in rs:
1274+
if r is tcp_server:
1275+
c, addr = tcp_server.accept()
1276+
print('[TCP] Got connection from {}:{}'.format(*addr))
1277+
inputs.append(c)
1278+
elif r is udp_server:
1279+
data, addr = udp_server.recvfrom(1024)
1280+
print('[UDP] Got message: {} from {}:{}'.format(data, *addr))
1281+
udp_server.sendto('[UDP] {}'.format(data), addr)
1282+
else:
1283+
try:
1284+
data = r.recv(1024)
1285+
disconnected = not data
1286+
except socket.error:
1287+
disconnected = True
1288+
1289+
if disconnected:
1290+
print('[TCP] {}:{} disconnected.'.format(*r.getpeername()))
1291+
inputs.remove(r)
1292+
else:
1293+
print('[TCP] Got message: {} from {}:{}'.format(data, *r.getpeername()))
1294+
r.send('[TCP] {}'.format(data))
1295+
1296+
```
12431297

12441298

12451299
## socket 常见错误标志

‎content/sys.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ print num
3131
2. `sys.platform()` 获得当前终端是Windows下还是Linux下。
3232
3. `sys.exit(n)` 退出程序,它有一个可选的整数参数,当n为0是是正常退出,其他为不正常,可抛异常事件捕获,默认为0。
3333
>注意,此处的`sys.exit()``os._exit()``exit()/quit()`都能够退出Python程序,但是`sys.exit()`一般用在主线程中退出整个Python进程,因为在子线程中其无法结束主线程,而`os._exit()`不抛出异常,不执行清理工作,能够退出主线程,`exit()/quit()`一般在交互式shell中使用。
34-
4. `sys.path` 系统的环境变量,返回列表
34+
4. `sys.path` 系统的环境变量,返回列表,还可以用 `python -m site` 查看
3535

3636
```python
3737

‎content/tools.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ index-url = http://pypi.douban.com/simple
2020

2121
有一些库在 Windows 下可能不好安装,需要自行编译,可以下载别人已经编译好的可执行文件 whl 安装,Python 第三方库网站 [http://www.lfd.uci.edu/~gohlke/pythonlibs/](http://www.lfd.uci.edu/~gohlke/pythonlibs/) ,下载好之后 `pip install XXX.whl` 即可。
2222

23+
当一些库已经下载的时候,可以用 `--ignore-installed` 忽略已安装的库。
24+
25+
当一些依赖库其实不需要的时候,可以用 `--no-deps`, `--no-dependencies` 来忽略库中的依赖。
26+
27+
2328
## virtualenv
2429

2530
创建虚拟环境

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /