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

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

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

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

,

 import io b = io.BytesIO(b"Hello World") ## Some random BytesIO Object print(type(b)) ## For sanity's 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 

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