2015-03-28 19 views
12

Mam obiekt BytesIO zawierający dane dokumentu programu Excel. Biblioteka, której chcę użyć, nie obsługuje BytesIO i oczekuje zamiast niej obiektu File. Jak mogę wziąć mój obiekt BytesIO i przekonwertować go na obiekt File?Konwertuj BytesIO na Plik

+0

Możliwe problem XY. Co tak naprawdę próbujesz zrobić. Np. Czy może potrzebujesz czegoś, co obsługuje właściwość 'fileno'? –

Odpowiedz

11

Byłoby o wiele bardziej pomocne, gdybyś dostarczył bibliotekę, której używasz do pracy z plikami Excel, ale tutaj jest mnóstwo rozwiązań, z których niektóre mogą działać, w oparciu o losowe założenia, które robię z powodu zupełny brak przykładowy kod:

  • na podstawie akapitu pierwszego w io module, to brzmi jak wszystkie betonowej classes- tym BytesIO- są file-like objects. Nie wiedząc, jaki kod próbowałeś do tej pory, nie wiem, czy próbowałeś przekazać Bytesio do dowolnego modułu, z którego korzystasz.
  • Jeśli nie działa, możesz po prostu przekonwertować BytesIO na innego io Writer/Reader/Wrapper, przekazując go do konstruktora. Przykład:

.

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 
  • Być może trzeba sprawdzić, jaki rodzaj Reader/Writer/Wrapper jest oczekiwane przez moduł, którego używasz do konwersji BytesIO do właściwego
  • wierzę Słyszałem, że (dla z powodu pamięci, ze względu na bardzo duże pliki Excela), moduły excela nie ładują całego pliku. Jeśli to się skończy, co oznacza, że ​​potrzebny jest fizyczny plik na dysku, możesz łatwo napisać tymczasowo plik Excela i po prostu go usunąć, kiedy skończysz. Przykład:

.

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 

Mam nadzieję, że jeden z tych punktów rozwiąże Twój problem.