Преобразование BytesIO в файл

У меня есть объект BytesIO, содержащий данные документа excel. Библиотека, которую я хочу использовать, не поддерживает BytesIO и вместо этого ожидает объект File. Как я могу взять объект BytesIO и преобразовать его в объект File?

Ответ 1

Итак, было бы намного полезнее, если бы вы предоставили библиотеку, которую вы использовали для работы с файлами excel, но здесь можно найти решения, некоторые из которых могут работать, на основе случайных предположений, которые я делаю из-за завершения отсутствие образца кода:

  • Основываясь на первом абзаце в io module, это звучит как все конкретные классы, включая BytesIO, файловые объекты. Не зная, какой код вы пробовали до сих пор, я не знаю, пытались ли вы просто передать BytesIO любому модулю, который вы используете.
  • В случае случайности это не работает, вы можете просто преобразовать BytesIO в другой io Writer/Reader/Wrapper, передав его конструктору. Пример:

.

import io

b = io.BytesIO(b"Hello World") ## Some random BytesIO Object
print(type(b))                 ## For sanity sake
with open("test.xlsx") as f: ## Excel File
    print(type(f))           ## Open file is TextIOWrapper
    bw=io.TextIOWrapper(b)   ## Conversion to TextIOWrapper
    print(type(bw))          ## Just to confirm 
  • Вам может потребоваться проверить, какой тип Reader/Writer/Wrapper ожидается модулем, который вы используете, чтобы преобразовать BytesIO в правильный.
  • Я считаю, что слышал (по причинам памяти, из-за чрезвычайно больших файлов excel) модули excel не загружают весь файл. Если это в конечном итоге означает, что вам нужен физический файл на диске, вы можете легко записать файл Excel временно и просто удалить его, когда закончите. Пример:

.

import io
import os

with open("test.xlsx",'rb') as f:
    g=io.BytesIO(f.read())   ## Getting an Excel File represented as a BytesIO Object
temporarylocation="testout.xlsx"
with open(temporarylocation,'wb') as out: ## Open temporary file as bytes
    out.write(g.read())                ## Read bytes into file

## Do stuff with module/file
os.remove(temporarylocation) ## Delete file when done

Я надеюсь, что один из этих вопросов решит вашу проблему.