如何在Python流中维护多个流位置

时间:2019-05-21 07:25:22

标签: python-3.x bytesio

我想在一个流中使用2个流指针,并将2个指针放置在不同的位置。从该时间点开始,如何制作第一流的副本,以使该副本不反映第一流的状态?

尤其是我对io.BytesIO()类型的流感兴趣


import io

stream1 = open("Input.jpg", "rb")

stream2 = stream1

print('A', stream1.tell(), stream2.tell())

stream1.seek(10)

print('B', stream1.tell(), stream2.tell())

我的目标是查看

的输出
A 0 0
B 10 0

但是,我明白了

A 0 0
B 10 10

@varela 感谢您的回复。不幸的是,当流中没有文件描述符时,这种方法不能很好地工作(如果我们不打开文件,可能会发生这种情况)。例如,代替stream1 = open(“ Input.jpg”,“ rb”)

stream1 = io.BytesIO() image.save(stream1,format ='JPEG')

关于如何处理此案的任何建议?

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以打开文件两次,例如

stream1 = open("Input.jpg", "rb")
stream2 = open("Input.jpg", "rb")

然后它们将独立。当您执行stream2 = stream1时,您仅复制对象引用,而不会创建任何新对象。 您需要记住还要关闭两个文件对象。

通常不需要文件描述的副本。但是,可以使用低级别的系统操作,但是除非您确实有用例,否则我不建议您这样做,例如:

import os

# return integer file handle
fd1 = os.open("Input.jpg", os.O_BINARY | os.O_RDONLY)
fd2 = os.dup(fd1)

# you can convert them to file objects if required.
stream1 = os.fdopen(fd1, 'rb')
stream2 = os.fdopen(fd2, 'rb')

这里有一些使用os.dup有意义的用例:dup2 / dup - why would I need to duplicate a file descriptor?