我正在使用一个API,它将一个打开的二进制文件作为参数,然后对其执行阻塞读取直到EOF。
而不是打开现有文件(io.open模式' rb')我想传递一个我编写计算/构造内容的流 - 实际上我想要一些概念上是单向管道的东西输出通过可与打开文件互换的输入流传递。
我查看了BufferedRWPair,但我发现的几个例子都违反了它的警告,不要在输入和输出端使用相同的对象。
如果有人有适当的例子或更好的建议,欢迎您!
我根据这里的评论看了BufferedRandom,但我显然做错了......
import io
buf = io.BufferedRandom(io.BytesIO())
buf.write("a")
buf.write("b")
buf.flush()
while True:
print "reading"
a = buf.read(1024)
if not a: break
print "read: {}".format(a)
buf.close()
这在第一次阅读后退出
更新 这个公认的凌乱示例显示了解决方案,必须保持独立的读写位置
import io
buf = io.BufferedRandom(io.BytesIO())
read = 0
wrote = 0
buf.seek(wrote)
wrote += buf.write(b"a")
wrote += buf.write(b"b")
buf.seek(read)
data = buf.read(1)
read += len(data)
buf.seek(wrote)
wrote += buf.write(b"c")
print "read: {}".format(data)
buf.seek(read)
data = buf.read(512)
read += len(data)
wrote += buf.write(b"d")
buf.seek(wrote)
wrote += buf.write(b"efghihjlmnop")
while data:
print "read: {}".format(data)
buf.seek(read)
data = buf.read(1024)
read += len(data)
buf.close()
答案 0 :(得分:0)
评论:...允许我对流进行交错读写,而不是......自己管理当前的读写位置。
这是= f.text_field :some_attribute, style: 'text-transform: capitalize;'
的行为
但是您可以将逻辑封装到自己的io.BufferedRandom
中
例如:
class StreamRW(io.BufferedRandom)
如下所示的进一步代码,但没有class StreamRW(io.BufferedRandom):
def __init__(self, raw):
super().__init__(raw)
self.seek(0)
def read(self, size=1):
super().seek(self.read_offset)
data = super().read(size)
self.read_offset = self.tell()
return data
def write(self, data):
super().seek(self.write_offset)
written = super().write(data)
self.write_offset = self.tell()
return written
def seek(self, offset):
super().seek(offset)
self.read_offset = self.write_offset = self.tell()
#Usage:
buf = StreamRW(io.BytesIO())
...
!
您必须使用buf.seek(0)
来回放文件位置
注意:我必须使用buf.seek(0)
!
这对我有用:
binary prefix b""
<强>输出强>:
读:b&#39; ab&#39;
使用Python测试:3.4.2和2.7.9