2015-01-12 2 views
0

Я оставлю это здесь для архива и прочее, но обновит код ниже до рабочего, так как я смог исправить свою проблему (если какой-либо пользователь linux читает это, возможно, вы можете помочь мне с поддержкой Linux или тестом, если метод окна работает для вассохранение и загрузка данных с помощью json или pickle

его все, что я являюсь unexpirienced и не родным английским человеком.

Я написал небольшую таблицу времени и попал в точку, где я хотел сохранить данные, введенные пользователем для следующего выполнения программы. Поэтому я немного экспериментировал с 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 s нормально. В процессе работы с его кодом я дошел до вопроса (ну собственно 2). Как я могу сохранить данные, введенные пользователем/которые автоматически сгенерированы в список списков, каждый из которых содержит 11 dicts? (из формата: 1 неделя с 5 днями и 11 часами каждый) и будет загружать() работу, если я могу сохранить данные как это? мой код Здесь `s:

# -*- 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() 
+0

Вы должны разместить свой код здесь: 1) редактировать свой пост и вставить код в, 2) выберите свой код и нажмите Ctrl + K (или Command + K на Mac) –

+0

сделано :), но я подумал, что подсветка pb более приятная. – Astrionn

ответ

0

Я говорю по-немецки, так что я могу читать ваш код. Тем не менее, это long, и немного загадочно, поэтому, когда я попробовал, я не смог сразу увидеть, что должен делать код во всех случаях.

Однако, у меня есть два предложения:

1) Вы делаете json.dumps и pickle.load ... почему? Если вы хотите записать объекты в файл, вы должны использовать dump и load из того же сериализатора.

2) Поскольку вы работаете с классами, я бы, вероятно, использовать dill в отличие от json или pickle, как вы будете иметь больше шансов на вещи сериализации, как вы хотите.

Так 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() 

Это тот же интерфейс для pickle и json. И если вы не хотите, чтобы несколько dump и load, , то вы можете положить все в кортеж и сделать все сразу.

>>> 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'}]] 
>>> 
+0

Ночь была длинная, и я работал над ней aliitle (только немного). Я думаю, я нашел вполне приемлемый способ загрузки данных, но поэтому мне нужен способ сохранить сгенерированные данные в списке из 5 списков из 11 dicts (например, неделя с 5 днями по 11 часов каждый). Я попробую tp uodate main thread или вставьте его в ответ – Astrionn

+0

Хорошо, я обновляю свой ответ, чтобы показать что-то вроде этого ... –

+0

Я решил не использовать укроп, так как он, похоже, не является стандартным имплантированным (импортная ошибка возврата усадьбы), и я буду использовать это разные платформы (как вы могли видеть в моем новом коде) и вернулись к марину, вот обновленный код http://pastebin.com/ZKJfhuM3 скажите мне, что вы думаете об этом – Astrionn

Смежные вопросы