BytesIO как объект файла

1

Я не могу понять разницу этих двух объектов 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 должен действовать как файл как объект, но храниться в памяти. Итак, почему, когда я пытаюсь передать только одну строку файла, этот цикл не возвращает ничего, как не было строк в файле?

Теги:
bytesio

2 ответа

0

Разница заключается в текущей позиции в потоке. В первом примере позиция находится в начале. Но во втором примере это в конце. Вы можете получить текущую позицию с помощью 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)
  • 0
    Спасибо, хороший человек. Я скучаю по чтению документов по этому вопросу.
0

Когда вы .write любой файл, курсор находится в конце, поэтому, когда вы пытаетесь .read он ничего не возвращает. Вам нужно переместить курсор в начало, используя .seek(0)

В противном случае инициализируйте объект BytesIO буфером, и курсор будет в начале, как в вашем исходном примере.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню