【发布时间】:2017-10-23 11:31:13
【问题描述】:
我正在使用一个 API,该 API 将打开的二进制文件作为参数,然后对其执行阻塞读取,直到 EOF。
而不是打开现有文件(io.open 模式'rb'),我想向它传递一个流,我将计算/构造的内容写入其中 - 实际上我想要一些概念上是输出输出的单向管道通过可与打开文件互换的输入流。
我查看了 BufferedRWPair,但我能找到的几个例子都违反了不要在输入端和输出端使用相同对象的警告。
如果有人有合适的例子或更好的建议,欢迎!
我在这里查看了基于 cmets 的 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()
【问题讨论】:
-
不完全是因为它似乎不允许我在不(我猜)自己管理当前读写位置的情况下交叉读取和写入流。我想这是拥有相同流的自然结果。这是预期的吗?