【问题标题】:saving and loading datas with json or pickle使用 json 或 pickle 保存和加载数据
【发布时间】:2015-01-12 17:23:40
【问题描述】:

我将把它留在这里用于存档和其他东西,但我会将下面的代码更新为可以工作的代码,因为我能够解决我的问题(如果任何 linux 用户阅读此内容,也许你可以帮助我提供 linux 支持或测试 windows 方法是否适合您

首先,我是一个没有经验的人,不是以英语为母语的人。

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

# -*- 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) 编辑您的帖子并粘贴您的代码,2) 选择您的代码并按 Ctrl+K(或 Mac 上的 Command+K)
  • 完成 :) 但我认为 pb-highlighting 更好

标签: python json load save pickle


【解决方案1】:

我会说德语,所以我可以阅读您的代码。但是,它很长,而且有点神秘,所以当我尝试它时,我无法立即看到代码在所有情况下都应该做什么。

不过,我确实有两个建议:

1) 你正在做一个json.dumps 和一个pickle.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'}]]
>>> 

【讨论】:

  • 夜晚很长,我做了很多工作(只是一点点)我想我找到了一种完全可以接受的加载数据的方法,但因此我需要一种方法来将生成的数据保存在 5 个列表中11 个字典列表(例如一周 5 天,每个 11 小时)我会尝试 tp uodate 主线程或将其粘贴到答案中
  • 我决定不使用 dill,因为它似乎不是标准实现的(导入 dill 返回错误),我将在不同的平台上使用它(如您在我的新代码中所见)并返回腌制这里是更新的代码pastebin.com/ZKJfhuM3告诉我你的想法
  • 我不确定你所说的“导入莳萝返回错误”是什么意思……但如果你的意思是它没有随 python 一起提供,那是正确的。除了 python 之外,您还必须安装它(例如:pip install dill)。然后你可以这样做:import dill.
  • 使用更改后的代码,您显然不再需要 json 导入,但如果 pickle 可以腌制您的目标对象,它看起来可能会起作用。如果是这样,你应该完成这个问题。如果您遇到任何序列化问题,我建议您再次尝试dill。它在所有主要平台上都受支持,您只需要确保它安装在任何地方。
猜你喜欢
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多