2017-09-07 1 views
1

Ich versuche, eine Funktion zum Speichern von Daten in einer Gurke-Datei zu erstellen. Ich weiß, dass auf diese Weise mit Gurke funktioniert:Funktion für Gurke

with open('x.pickle', 'wb') as f: 
    pickle.dump(x, f) 

Aber ich will eigentlich eine Funktion aus ihm machen, damit ich muss es immer wieder nicht schreiben. Hier ist was ich versucht habe:

def pickle_dump(x): 
    with open('%s.pickle'%x, 'wb') as f: 
     pickle.dump(x, f) 
    return 

Wenn wir 'mit' verwenden, und die Datei nicht existiert, erstellt es eine Datei. Ich vermutete, dass es auch funktionieren würde, wenn ich innerhalb einer Funktion bin, aber stattdessen gab es mir einen File Not Found Error.

Jede Hilfe wird geschätzt.

+1

Hm, das ist sehr seltsam ... bist du * sicher * du benutzt '' wb'' Argument in 'pickle_dump'? Weil ich deinen Code getestet habe, funktioniert es gut für mich .., –

+1

Ich denke, du willst einen 'filename' explizit übergeben ... –

+3

Die Zeichenfolgendarstellung deines Objekts' x' kann beliebige Zeichen enthalten, die in einem Dateinamen ungültig sind. Wenn Sie erwarten, dass dies eine Datei namens 'x.pickle' erzeugt, nur weil der Parameter' x' heißt, so funktioniert Python nicht - Objekte haben im Allgemeinen keine Ahnung, wie sie heißen. – jasonharper

Antwort

1

Es sieht so aus, als würden Sie den String-Pfadnamen mit Ihrem tatsächlichen Objekt verwechseln. Sie sind zwei verschiedene Dinge.

def pickle_dump(path, x): 
    """Pickle object `x` to `path`.""" 
    with open('%s.pickle' % path, 'wb') as f: 
     pickle.dump(x, f) 

Beispiel:

import pandas as pd 
df = DataFrame() # the actual object you want to pickle 
pickle_dump(path='files/filename', x=df) 

das Gleiche in umgekehrter Reihenfolge zu tun:

def pickle_load(path): 
    with open('%s.pickle' %path, 'rb') as f: 
     return pickle.load(f) 

Nun ist diese führen Sie eine Variable auf den Rückgabewert aus der Funktion zuordnen würde:

result = pickle_load('mypath/filename') 

In Ihrem Kommentar t, haben Sie im Funktionskörper eine Variable x benannt. Aber realisieren Sie, dass das eine lokale Variable ist. Sie können nicht von außerhalb der Funktion darauf zugreifen. Das ist ein Fall, in dem Sie die Rückgabeanweisung möchten.

+0

Ich habe versucht, Ihnen dabei zu folgen, um die pickle_load-Funktion wie folgt auszuführen: def pickle_load (Pfad): mit geöffnet ('% s.pickle'% path, 'rb') als f: x = pickle.load (f) Warum ist das nicht korrekt? –

+0

Ja, sehr hilfreich! ich danke dir sehr! –

1

Übergeben Sie sowohl das Objekt als auch den Dateinamen.

import cPickle as pickle # Python 2 

def pickle_dump(obj, filename): 
    if filename.split('.')[-1] != 'p': 
     filename += '.p' # Add pickle file extension `.p` if needed. 
    with open(filename, 'wb') as f: 
     pickle.dump(obj, f, protocol=pickle.HIGHEST_PROTOCOL)