python的IO操作(并行/并发、同步/异步、阻塞/非阻塞、StringIO&BytesIO、序列化和反序列化、JSON)

论坛 期权论坛 脚本     
已经匿名di用户   2022-5-29 19:31   2002   0

IO(Input/Output)输入和输出, IO编程中,Stream(流)是个很重要的概念,可以把流想象成个水管, 数据就是水管里的水。Input Stream就是数据从外面 (磁盘、网络)流进内存,Output Stream就是数据从内存流到外面去。

1、并行与并发

并发(concurrency):在一个时间段内有几个程序都处于已启动运行到运行完毕之间 ,且这几个程序都是在同一个处理机上运行,但任一时刻只能一个程序在处理机上运行。

并行(parallelism):当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互相不抢占CPU资源,可以同时进行,这种方式称为并行

2、同步与异步、阻塞与非阻塞

参考:http://www.cnblogs.com/albert1017/p/3914149.html

https://blog.51cto.com/yaocoder/1308899

最简单的话理解:同步是两个对象之间的关系,而阻塞是一个对象的状态

网上关于这方面介绍的文章太多了,但自己看的大都是糊里糊涂的,上面提到的文章感觉介绍的很清晰

import sys
x = sys.stdin.readline()
print(x)
x = input('input a number:') #先把提示信息输出,然后捕获输入
print(x)

sys.stdout.write('io output-1')
sys.stdout.write('io output-2')

print('io output-1')#追加了一个换行符
print('io output-2')


输出结果:
1  --输入
1

input a number:2  --输入
2
io output-1io output-2io output-1
io output-2

3、SringIO&BytesIO 基于内存的IO模式

from io import StringIO
f = StringIO()
f.write('hello')
f.write(' ')
f.write('world')
print(f.getvalue()) #StringIO经常被用来作字符串的缓存

print('-------'*10)
f = StringIO('Hello!\nHi\nGoodbye!')
while True:
    s = f.readline()
    if s == '':
        break
    print(s.strip())

print('-------'*10)
s = StringIO('ABCDEF')
s.write('abc') #从开头写,将会覆盖ABC
s.seek(0)
print(s.read())
s.seek(2)
print(s.read())

输出结果:
hello world
----------------------------------------------------------------------
Hello!
Hi
Goodbye!
----------------------------------------------------------------------
abcDEF
cDEF
from io import BytesIO
f = BytesIO()
f.write('中文'.encode('utf-8'))
print(f.getvalue())

f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
x = f.read()
print(x.decode('utf-8'))


输出结果:
b'\xe4\xb8\xad\xe6\x96\x87'
中文

4、序列化和反序列化

序列化:变量从内存中变成可存储或者传输的过程称之序列化(pickling)

反序列化:把变量内容从序列化的对象重新读到内存里称之反序列化

优点:便于存储、便于传输

import pickle

def func():
    print('hello tomorrow')

info = {'name':'lzy','age':29,'hobby':func}
f = open('a1.txt','wb')
f.write(pickle.dumps(info))

f = open('a1.txt','rb')
data = pickle.loads(f.read())
data['hobby']()

输出:
hello tomorrow

5、JSON

json.dumps(): 对数据进行编码

json.loads(): 对数据进行解码

import json
info = {'name':'lzy','age':22}
f = open('a1.txt','w',encoding='utf-8')
f.write(json.dumps(info))
f.close()

f = open('a1.txt','r',encoding='utf-8')
data = json.loads(f.readline())
print(data['age'])
f.close()

输出:
22

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP