【问题标题】:Python: Write content to an open streamPython:将内容写入打开的流
【发布时间】: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()

【问题讨论】:

标签: python file stream


【解决方案1】:

评论:...允许我在流中交错读取和写入,而无需...自己管理当前的读取和写入位置。

这是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""
这对我有用:

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:阅读当有人回答我的问题时我应该怎么做? stackoverflow.com/help/someone-answers
猜你喜欢
  • 1970-01-01
  • 2011-02-21
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多