pythonpickleload序列化,从BytesIO中(⽂件流、stream)连
续连续。。。
之前项⽬中接触过pickle的序列化和BytesIO的⽂件流。结果今天碰到问题了, ⽂件pickle.dump到BytesIO中后,不能反向取出来。。。查了半天感觉好多资料介绍的太简单了。。。没有⼏篇是讲BytesIO利⽤pickle连续写⼊在全部读取出来的操作。
贴⼏篇有帮助的:
是⽐较详细的,讲到了BytesIO和pickle组合的连续读写的⽂件流操作,正是我需要的。
我对pickle序列化的理解就是讲Python的任意对象,⽐如类,实⼒,列表,字典等等转换成⼆进制,感觉json很像,区别是⼀个⼆进制⼀个字符串?
BytesIO之前只简单看过,今天看了下他的功能就是把⽂件写⼊内存?像是⼀个⽂件流。
这都不是关键。键是pickle和BytesIO结合起来的读写,以及⽂件指针位置。。。
先说重点 ,我需要解决的问题。
import pickle,io
io_buffer=io.BytesIO()
pickle.dump('a',io_buffer)
pickle.dump('b',io_buffer)
print(pickle.load(io_buffer))
print(pickle.load(io_buffer))
开始代码这么写,期望能输出a,b,结果却直接报错:
EOFError: Ran out of input
原因就是io_buffer的指针位置在最后,⾃然读取不到⽂件了,所以需要重置指针位置到开始处,代码改成这要就好了
pickle.dump('a',io_buffer)
pickle.dump('b',io_buffer)
#重置指针位置
io_buffer.seek(0)
print(pickle.load(io_buffer))
print(pickle.load(io_buffer))
正常输出:
a
b
或者重新⽣成⼀个BytesIO对象
pickle.dump('a',io_buffer)
pickle.dump('b',io_buffer)
#重新⽣成BytesIO对象
new_io_buffer=io.BytesIO(value())
# io_buffer.seek(0)
print(pickle.load(new_io_buffer))
print(pickle.load(new_io_buffer))
不过还有⼀点不明⽩的是,getvalue,下⾯代码getvalue(),期望是获取全部结果abc,但是对getvalue得到的结果res进⾏pickle.loads反序列化后,只能得到a,⽽直接对res进⾏decode确实是能得到全部的之abc,长度33也证明是3个字符的长度。
pickle.dump('a',io_buffer)
pickle.dump('b',io_buffer)
pickle.dump('c',io_buffer)
res=value()
print(res.decode(errors='ignore'))
print(len(res),pickle.loads(res)
输出结果:
X  aq .X  bq .X  cq .
33 a
如果不⽤pickle.load写⼊,⽤write写⼊,getvalue就没问题,就会得到全部结果:abc,求⾼⼈指点。。。。
io_buffer.write(b'a')
io_buffer.write(b'b')
io_buffer.write(b'c')
res=value()
print(len(res),res)
输出结果:
3 b'abc'
最后说⼀下⽂件指针,主要是seek的两个参数:offset,whence,参考菜鸟教程的说明:
offset -- 开始的偏移量,也就是代表需要移动偏移的字节数
whence:可选,默认值为 0。给offset参数⼀个定义,表⽰要从哪个位置开始偏移;0代表从⽂件开头开始算起,1代表从当前位置开始算起,2代表从⽂件末尾算起。
io_buffer.write(b'a')
io_buffer.write(b'b')
io_buffer.seek(0)
io_buffer.write(b'c')
print(value())
如果没有这句代码:io_buffer.seek(0),输出结果结果应该是abc,重置了指针位置到开始位置后,c覆盖了a,所以输出结果:
b'cb'
io_buffer.write(b'a')
io_buffer.write(b'b')
io_buffer.seek(-1,2)
io_buffer.write(b'c')
# print(ad())
print(value())
io_buffer.seek(-1,2)这句话2代表最后位置,-1表⽰向前移动⼀个位置,所以b就会被c覆盖输出结果:b'ac'
io_buffer.write(b'a')
io_buffer.write(b'b')
io_buffer.seek(2,2)
io_buffer.write(b'c')
# print(ad())
#结果不解码
print(value())
#对结果解码
python菜鸟教程100print(value().decode())
io_buffer.seek(2,2)最后位置再向后移动两个位置,应该是多了两个空格,输出结果:
b'ab\x00\x00c'
ab  c
测试到此为⽌!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。