Python:将内容写入开放流

Python:将内容写入开放流,python,file,stream,Python,File,Stream,我正在使用一个API,它将一个打开的二进制文件作为参数,然后在EOF之前对该文件执行阻塞读取 我不想打开一个现有文件(io.open mode‘rb’),而是想向它传递一个我将计算/构造的内容写入其中的流——实际上,我想要一个概念上是单向管道的东西,其中输出通过一个可与打开的文件互换的inputstream进行传递 我查看了BufferedRWPair,但我能找到的几个示例都违反了它的警告,即不要在输入端和输出端使用相同的对象 如果有人有合适的例子或更好的建议,欢迎 我已经根据这里的评论查看了B

我正在使用一个API,它将一个打开的二进制文件作为参数,然后在EOF之前对该文件执行阻塞读取

我不想打开一个现有文件(io.open mode‘rb’),而是想向它传递一个我将计算/构造的内容写入其中的流——实际上,我想要一个概念上是单向管道的东西,其中输出通过一个可与打开的文件互换的inputstream进行传递

我查看了BufferedRWPair,但我能找到的几个示例都违反了它的警告,即不要在输入端和输出端使用相同的对象

如果有人有合适的例子或更好的建议,欢迎

我已经根据这里的评论查看了BufferedRandom,但是我显然做了一些错误的事情,比如。。。。

输入io
buf=io.BufferedRandom(io.BytesIO())
buf.写(“a”)
buf.写下(“b”)
buf.flush()
尽管如此:
打印“阅读”
a=基本单位读数(1024)
如果不是,休息一下
打印“读取:{}”。格式(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()
评论:。。。允许我在没有。。。自己管理当前的读写位置

这是io.BufferedRandom的行为 但是您可以将逻辑封装到自己的
类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)
回放文件位置。
注意:我必须使用
二进制前缀b”“

这对我有用:

import io
buf = io.BufferedRandom(io.BytesIO())
buf.write(b"a")
buf.write(b"b")
buf.seek(0)

while True:
    print "reading"
    a = buf.read(1024)
    if not a: break
    print "read: {}".format(a)
buf.close()
输出
读:b'ab'


用Python测试:3.4.2和2.7.9

阅读:不完全是因为它似乎不允许我在没有(我猜)自己管理当前读写位置的情况下交错读写流。我想这是同一条小溪的自然结果。这是预期的吗?不完全是因为它似乎不允许我在不(我猜)自己管理当前读写位置的情况下交错读写流。我想这是同一条小溪的自然结果。这是预期的吗?非常感谢!这是我发布的答案的一个不那么混乱的版本,但是我发现如果我将这个新派生类的实例作为当前获取输入文件的流传递,它可能会工作。这听起来确实像BufferedRWPair的目的,但我仍然无法开始工作,我将按照您建议的方法进行。@user9548:阅读当有人回答我的问题时我应该做什么?