Преобразование байтов в файловый объект на python

#python #string #file #bytestream

#python #строка #файл #байтовый поток

Вопрос:

У меня есть небольшое приложение, которое считывает локальные файлы с помощью:
open(diefile_path, 'r') as csv_file
open(diefile_path, 'r') as file
and also uses linecache module

Мне нужно расширить использование файлов, которые отправляются с удаленного сервера.
Содержимое, получаемое сервером типа байты.

Я не смог найти много информации об обработке типа IOBytes, и мне было интересно, есть ли способ преобразовать фрагмент байтов в файлоподобный объект.
Моя цель — использовать API, указанный выше ( open , linecache )
Я смог преобразовать байты в строку с помощью data.decode("utf-8") ,
но я не могу использовать методы, описанные выше ( open и linecache )

небольшой пример для иллюстрации

 data = 'b'First linenSecond linenThird linen'

with open(data) as file:
    line = file.readline()
    print(line)
  

вывод:

 First line
Second line
Third line
  

можно ли это сделать?

Ответ №1:

open используется для открытия реальных файлов, возвращая файлоподобный объект. Здесь у вас уже есть данные в памяти, а не в файле, поэтому вы можете создать экземпляр объекта, подобного файлу, напрямую.

 import io


data = b'First linenSecond linenThird linen'
file = io.StringIO(data.decode())
for line in file:
    print(line.strip())
  

Однако, если то, что вы получаете, на самом деле просто строка, разделенная новой строкой, вы можете просто разделить ее на список напрямую.

 lines = data.decode().strip().split('n')
  

Основное отличие заключается в том, что StringIO версия немного ленивее; она имеет меньший объем памяти по сравнению со списком, поскольку она разделяет строки по запросу итератора.

Комментарии:

1. спасибо, итак, насколько я понимаю, мне придется изменить API на что-то другое, чем «открыть»

Ответ №2:

Приведенный выше ответ о том, что при использовании StringIO потребуется указать кодировку, что может привести к неправильному преобразованию.

из документации Python с использованием BytesIO :

 from io import BytesIO
f = BytesIO(b"some initial binary data: x00x01")