Я не могу понять разницу этих двух объектов BytesIO. Если я сделаю это:
f = open('decoder/logs/testfile.txt', 'rb')
file = io.BytesIO(f.read())
decode(file,0)
то в методе декодирования это работает:
for line in islice(file, lines, None):
Но если я создаю BytesIO следующим образом:
file = io.BytesIO()
file.write(b"Some codded message")
decode(file, 0)
Тогда цикл в методе декодирования ничего не возвращает. Я понимаю, что BytesIO должен действовать как файл как объект, но храниться в памяти. Итак, почему, когда я пытаюсь передать только одну строку файла, этот цикл не возвращает ничего, как не было строк в файле?
Разница заключается в текущей позиции в потоке. В первом примере позиция находится в начале. Но во втором примере это в конце. Вы можете получить текущую позицию с помощью file.tell()
и вернуться к началу file.seek(0)
:
import io
from itertools import islice
def decode(file, lines):
for line in islice(file, lines, None):
print(line)
f = open('testfile.txt', 'rb')
file = io.BytesIO(f.read())
print(file.tell()) # The position is 0
decode(file, 0)
file = io.BytesIO()
file.write(b"Some codded message")
print(file.tell()) # The position is 19
decode(file, 0)
file = io.BytesIO()
file.write(b"Some codded message")
file.seek(0)
print(file.tell()) # The position is 0
decode(file, 0)
Когда вы .write
любой файл, курсор находится в конце, поэтому, когда вы пытаетесь .read
он ничего не возвращает. Вам нужно переместить курсор в начало, используя .seek(0)
В противном случае инициализируйте объект BytesIO
буфером, и курсор будет в начале, как в вашем исходном примере.