2015-03-28 5 views
12

Ich habe ein BytesIO-Objekt, das die Daten eines Excel-Dokuments enthält. Die Bibliothek, die ich verwenden möchte, unterstützt BytesIO nicht und erwartet stattdessen ein File-Objekt. Wie kann ich mein BytesIO-Objekt in ein File-Objekt konvertieren?Konvertieren von BytesIO in Datei

+0

Mögliches XY-Problem. Was versuchst du eigentlich? ZB brauchen Sie vielleicht etwas, das eine Eigenschaft 'fileno' unterstützt? –

Antwort

11

Also, es wäre viel hilfreicher, wenn Sie die Bibliothek zur Verfügung stellen, die Sie verwenden, um Excel-Dateien zu bearbeiten, aber hier ist ein Buckshot von Lösungen, von denen einige funktionieren können, basierend auf zufälligen Annahmen, die ich mache völlige Fehlen von Beispielcode:

  • auf dem ersten Absatz mit Sitz in den io module, es klingt wie alle konkreten classes- einschließlich BytesIO- file-like objects sind. Ohne zu wissen, welchen Code Sie bisher ausprobiert haben, weiß ich nicht, ob Sie versucht haben, das BytesIO nur an das Modul zu übergeben, das Sie verwenden.
  • Auf der anderen Seite, die nicht funktioniert, können Sie einfach BytesIO in einen anderen io Writer/Reader/Wrapper konvertieren, indem Sie es an den Konstruktor übergeben. Beispiel:

.

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 
  • Sie müssen möglicherweise prüfen, welche Art von Reader/Writer/Wrapper wird durch das Modul erwartet Sie die BytesIO an den richtigen
  • zu konvertieren verwenden Ich glaube, ich habe gehört, dass (für Speichergründe, aufgrund extrem großer Excel-Dateien) Excel-Module laden nicht die gesamte Datei. Wenn dies bedeutet, dass Sie eine physische Datei auf der Festplatte benötigen, können Sie die Excel-Datei einfach temporär schreiben und sie einfach löschen, wenn Sie fertig sind. Beispiel:

.

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 

Ich hoffe, dass einer dieser Punkte Ihr Problem lösen wird.

Verwandte Themen