使用json或pickle保存和加载数据

时间:2015-01-12 17:23:40

标签: python json load save pickle

我会留下这个存档和东西,但会将下面的代码更新为工作的,因为我能解决我的问题(如果有任何linux用户读取这个,也许你可以帮我提供linux支持或者测试windows方法是否适合你

首先,我是一个没有经验的人,而不是英国本土人。

我写了一个小时间表,并且我想要保存用户为下次执行程序而输入的数据。所以我用json / pickle做了一点实验,并没有真的很远,所以我会请求帮助:)。我知道在获得加载方法后我必须更改每个 init ()但是我会尝试为没有保存数据的情况生成一个空的标准文件。我也知道方法save()有一个可怕的名字,因为它不会保存它只返回数据。我也知道代码的代码不是英文的,但我可以根据请求进行翻译,因为它s not really about the cod it self (even though I am glad of feedback) only about the save/load of data I guess it没问题。在使用代码的过程中,我得到了一个问题(实际上是2)我如何将用户输入的数据/自动生成的数据保存到列表中,每个列表各有11个? (从格式:1周,每天5天,每个11小时),如果我能保存这样的数据,将加载()工作? 这是我的代码:

# -*- coding: UTF8 -*-
#!/usr/bin/env python3
import os
import platform
import sys
import json
import pprint
import time
import pickle
class stunde:

    def __init__(self):

        self.daten = {}

    def start(self):

        self.daten = {'Fach': "    ", 'Raum': "    ", 'Lehrer': "    "}


    def aendern(self,was,information):

        if was in self.daten:
           self.daten[was] = information
        else:
           print('Fehler bei der Eingabe bitte auch Groß/Kleinschreibeung beachten')

    def anzeigen(self):

        print ("       ",self.daten )

    def save (self):

        return self.daten

    def load(self,data):
        self.daten={}
        self.daten=data


    def raum(self):

        print("Raum : ",self.daten['Raum'])


class tag:

    def __init__(self):

        self.stunden = []


    def start(self):
        for i in range(11):
            std = stunde()
            self.stunden.append(std)
            self.stunden.start()

    def aendern(self,tagwas,was,information):

        if len(self.stunden)>=(tagwas-1):
            self.stunden[tagwas-1].aendern(was,information)
        else:
            print("Dieser tag hat nur " , len(self.stunden) , "Stunden. Bitte eine dieser wählen")

    def anzeigen(self):

        for i in range(len(self.stunden)):
            print(i+1)
            self.stunden[i].anzeigen()

    def save (self):

        datas=[]
        for i in range(len(self.stunden)):
            datas.append(self.stunden[i].save())
        return datas

    def load(self,data):

        #hier muss 1 liste mit 11 dicts übergeben werden wenn :
        for x in data:
            t = stunde();
            t.load(x);
            self.stunden.append(t)

    def raum(self):

        for i in range(len(self.stunden)):
            print(i+1),self.stunden[i].raum()

class woche:

    def __init__(self):

        self.tage = []
        self.start()

    def start(self):

        laufpfad=os.path.dirname(sys.argv[0])
        dateiposition="\datas\data"
        checkpfad="".join((laufpfad,dateiposition))
        if os.path.exists(checkpfad)==True:
            with open(checkpfad,"rb") as filename:
                data=pickle.load(filename)
            self.load(data)
            print("Daten erfolgreich geladen")
        else:
            for i in range(5):
                day = tag()
                self.tage.append(day)
                self.tage.start()
            print("Keine Daten gefunden")



    def aendern(self,wochewas,tagwas,was,information):

        if len(self.tage)>=(wochewas-1):
            self.tage[wochewas-1].aendern(tagwas,was,information)
        else:
            print("Diese Woche hat nur " , len(self.tage) , "Tage zur Auswahl. Bitte einen dieser wählen")

    def anzeigen(self , ouf = sys.stderr):

        for i in range(len(self.tage)):
            if i == 0 :
                print("Montag ",file = ouf),self.tage[0].anzeigen()
            if i == 1 :
                print("Dienstag ",file = ouf),self.tage[1].anzeigen()
            if i == 2 :
                print("Mittwoch ",file = ouf),self.tage[2].anzeigen()
            if i == 3 :
                print("Donnerstag ",file = ouf),self.tage[3].anzeigen()
            if i == 4 :
                print("Freitag ",file = ouf),self.tage[4].anzeigen()


    def save(self):
        aktuell = platform.system()
        if aktuell=='Windows':
                print("Windows detected as OS!")
                ordner=os.path.dirname(sys.argv[0])
                neuerordner=os.path.join(ordner,"datas")
                if os.path.exists(neuerordner)== False:
                    os.mkdir(neuerordner)
                else:
                    data =[]
                    for i in range(len(self.tage)):
                        it=self.tage[i].save()
                        data.append(it)
                    neuerpfad=os.path.join(neuerordner,"data")
                    with open(neuerpfad,"wb") as filename:
                        data2save=data
                        pickle.dump(data2save,filename)
                    filename.close
                    print("Daten erfolgreich gespeichert")

        elif aktuell=='Linux':
                print("Linux detected as OS")

        else:
            print("Dein Betriebssystem ,",aktuell,"wird leider nicht unterstützt")



    def load(self,data):
        pprint.pprint(data)
        print("#################################")
#hier liegt ein FEHLER die daten werden fehlerhaft eingelesen oder garnicht
        for x in data:
            t = tag();
            t.load(x);
            self.tage.append(t)


    def raum(self , ouf = sys.stderr):

        for i in range(len(self.tage)):
            print("Tag ", i+1 , file = ouf ),self.tage[i].raum()

def main():
    week=woche()
    eingabe = ""
    while 1:
        print()
        print(" Eintragungen zu einem (T)ag ändern? ")
        print(" Wochenplanplan (a)nzeigen? ")
        print(" (R)aumplan der Woche anzeigen")
        print(" Einen (b)estimmten Tag anzeigen?")
        print(" Den Raumplan (f)ür einen bestimmten Tag anzeigen?")
        print(" (E)nde? ")
        print()
        eingabe = input(' Ihre Wahl? ')
        print()
        if eingabe in ['t','T']:
            while True:
                wochewas =(input('Welchen Tag wollen Sie bearbeiten? (Bitte Zahl angeben!) '))
                try:
                    wochewas = int(wochewas)
                    break
                except ValueError :
                    print("Nur Zahlen eingeben bitte")
            while True :
                tagwas = (input('Welche Stunde wollen Sie bearbeiten? (Bitte Zahl angeben!) '))
                try:
                    tagwas = int(tagwas)
                    break
                except ValueError :
                    print("Nur Zahlen eingeben bitte")
            stdwas = input('Welche Information wollen Sie eintragen? (Fach, Raum oder Lehrer?) ').title()
            inf = input('Was soll eingetragen werden?(Maximal 4 Zeichen) ')[:4].ljust(4)
            week.aendern(wochewas,tagwas,stdwas,inf)
        elif eingabe in ['a','A']:
            week.anzeigen()
        elif eingabe in ['r','R']:
            week.raum()
        elif eingabe in ['b','B']:
            while True:
                was=input("Welchen Tag wollen sie anzeigen lassen ? (Nur Zahlen bitte !")
                try:
                    was=int(was)
                    break
                except ValueError:
                    print("Nur Zahlen eingeben bitte!")
            week.tage[was-1].anzeigen()
        elif eingabe in ['f','F']:
            while True:
                was=input("Von welchem Tag wollen sie den Raumplan anzeigen lassen ?(Nur Zahlen bittte!)")
                try:
                    was=int(was)
                    break
                except ValueError:
                    print("Nur Zahlen bitte!")
            week.tage[was-1].raum()
        elif eingabe in["e","E"]:
                warten=input('Bitte nochmal Enter drücken! ')
                week.save()
                time.sleep(1)
                print("Bye Bye")
                #sys.exit()
                os._exit(0)
        elif eingabe in ['s','S']:

            week.save()

        elif eingabe in ['l','L']:
            pfad=os.path.dirname(sys.argv[0])
            datas=r"\datas"
            data=r"\data"
            echterpfad="".join((pfad,datas,data))
            with open(echterpfad,"rb") as file:
                weekdata=pickle.load(file)
            #pprint.pprint(weekdata)
            week.load(weekdata)
        else :
            print("Bitte ein Buchstaben aus den Klammern oben wählen!")


print("Ihr Stundenplaner wurde geladen!")
main()

1 个答案:

答案 0 :(得分:0)

我说德语,所以我可以阅读你的代码。但是,它的,有点神秘,所以当我尝试它时,我无法看到代码应该在所有情况下应该做什么。

但是,我有两个建议:

1)你正在做json.dumpspickle.load ...为什么?如果要将对象写入文件,则应使用同一序列化程序中的dumpload

2)由于您正在使用课程,我可能会使用dill而不是jsonpickle,因为您将有更好的机会进行序列化你想要他们。

因此对于dill,您使用dill.dump和`dill.load' ...就像这样:

>>> t = 'Mon'
>>> w = 2
>>> 
>>> import dill 
>>> 
>>> f = open('data.txt', 'wb')
>>> dill.dump(t, f)
>>> dill.dump(w, f)
>>> f.close()
>>> 
>>> f = open('data.txt', 'rb')
>>> _t = dill.load(f)
>>> _w = dill.load(f)
>>> _t
'Mon'
>>> _w
2
>>> f.close()

picklejson的界面相同。 如果您不想要多个dumpload, 那么你可以将所有内容都放入元组中,并立即完成所有操作。

>>> f = open('data.txt', 'wb')
>>> dill.dump((t, w), f)
>>> f.close()
>>> 
>>> f = open('data.txt', 'rb')
>>> _t,_w = dill.load(f)
>>> f.close()

因此,对于看起来像您的数据结构的东西,您可以这样做:

>>> cal = [[{1:'a'},{2:'b'}],[{3:'c'},{4:'d'}]] 
>>> with open('foo.txt', 'wb') as f:
...   dill.dump(cal, f)
... 
>>> with open('foo.txt', 'rb') as f:
...   cal_ = dill.load(f)
... 
>>> cal_
[[{1: 'a'}, {2: 'b'}], [{3: 'c'}, {4: 'd'}]]
>>>