#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")