Как сохранить несколько позиций потока в потоке Python - PullRequest
0 голосов
/ 21 мая 2019

Я бы хотел использовать 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 голосов
/ 21 мая 2019

Вы можете открыть файл дважды, как

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 - зачем мне дублировать дескриптор файла?

...