0

我想在一个流中使用 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')

关于如何处理这种情况的任何建议?

谢谢。

4

1 回答 1

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 - 为什么我需要复制文件描述符?

于 2019-05-21T07:34:18.047 回答