I am new to Python and programming in general so please bear with me and my code :)
I was trying to collect some shift based date for some of my machines and came across the problem of properly building my return dictionary.
when i step through the function i can see that the data is read correctly every shift and the "maschinen_liste" dict is correct as well as the resulting "day" dict but as soon as i get to the next day the data inside the previous day entry changes to the current data which is added aswell and so on. now to my question how can the entrys inside the dictionary change backwards like this ? Or do i just fundamentally don't understand how dicts and nested loops work ?
I already simplified the code to this point at which i still don't see anything wrong and i can't for the live of me figure out what is wrong here.
import random
NrByMonth = {
"Januar": "01" ,
"Februar": "02"
}
def Readshiftdata(year_input="2020"):
# dict structured like dataframe = {"Jahr":{"Monat":{"Tag":{"Presse":{"Schicht":{"elektrisch":{"Verbrauch1":"","VerbrauchN":""},"informationen":{"Datum":"","Schichtführer":"","Nutzungsgrad":""},"produktionsdaten":{"Artikel1":{"Charge":"","Gutteile":"","Ausschuss1":"","Ausschuss2":"","Ausschuss3":"","Werker":"","Qualitaetspruefer":""},"Artikel2":{"Charge":"","Gutteile":"","Ausschuss1":"","Ausschuss2":"","Ausschuss3":"","Werker":"","Qualitaetspruefer":""},"Artikel3":{"Charge":"","Gutteile":"","Ausschuss1":"","Ausschuss2":"","Ausschuss3":"","Werker":"","Qualitaetspruefer":""},"Artikel4":{"Charge":"","Gutteile":"","Ausschuss1":"","Ausschuss2":"","Ausschuss3":"","Werker":"","Qualitaetspruefer":""}}}}}}}}
return_data = {}
month = {}
year = year_input
maschinen_liste = {"Pr5":{}}
# iterating over every month
for this_month in NrByMonth:
day = {}
# iterating over every day per month
dayspermonth = 2
this_day = 1
for this_day in range(1,dayspermonth+1):
temp_day = this_day
# reading per maschine
for maschine in maschinen_liste:
# reading shift per maschine
shifts = {"Frühschicht":{},"Spätschicht":{},"Nachtschicht":{}}
for shift in shifts:
this_shift = {"E-Daten":{},"Informationen":{},"Produktionsdaten":{}}
# fetching artikel data
artikel = {"Artikel 1":{}}
for a in artikel:
dataframe = {}
Charge = random.randint(1,100)
Gutteile = random.randint(1,100)
dataframe = {"Charge":Charge,"Gutteile":Gutteile}
artikel[a] = dataframe
shifts[shift]["Produktionsdaten"] = artikel
maschinen_liste[maschine] = shifts
print(maschinen_liste)
day[temp_day] = maschinen_liste
print("temp day :")
print(temp_day)
print("day:")
print(day)
print("maschinen_liste :")
print(maschinen_liste)
input()
month[this_month] = day
print("month:\n\n\n")
print(month)
return_data[year] = month
return(return_data)
year = Readshiftdata()
print("year: \n\n\n")
print(year)
Output:
year = {'2020': {
'Januar': {
1: {
'Pr5': {
'Frühschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 41, 'Gutteile': 95}}},
'Spätschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 37, 'Gutteile': 54}}},
'Nachtschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 37, 'Gutteile': 39}}}}},
2: {
'Pr5': {
'Frühschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 41, 'Gutteile': 95}}},
'Spätschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 37, 'Gutteile': 54}}},
'Nachtschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 37, 'Gutteile': 39}}}}}},
'Februar': {
1: {
'Pr5': {
'Frühschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 41, 'Gutteile': 95}}},
'Spätschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 37, 'Gutteile': 54}}},
'Nachtschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 37, 'Gutteile': 39}}}}},
2: {
'Pr5': {
'Frühschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 41, 'Gutteile': 95}}},
'Spätschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 37, 'Gutteile': 54}}},
'Nachtschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 37, 'Gutteile': 39}}}}}}}}
If i change day[temp_day] = maschinen_liste
to day[temp_day] = str(maschinen_liste)+str(temp_day)
it saves the date correctly...
Output:
year = {'2020': {
'Januar': {
1: "{
'Pr5': {'Frühschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 77, 'Gutteile': 44}}},
'Spätschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 100, 'Gutteile': 72}}},
'Nachtschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 93, 'Gutteile': 22}}}}}1",
2: "{
'Pr5': {
'Frühschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 27, 'Gutteile': 21}}},
'Spätschicht': {'Produktionsdaten': {'Artikel 1': {'Charge':27, 'Gutteile': 29}}},
'Nachtschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 41, 'Gutteile': 72}}}}}2"},
'Februar': {
1: "{
'Pr5': {
'Frühschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 74, 'Gutteile': 27}}},
'Spätschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 65, 'Gutteile': 83}}},
'Nachtschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 14, 'Gutteile': 11}}}}}1",
2: "{
'Pr5': {'Frühschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 19, 'Gutteile': 16}}},
'Spätschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 57, 'Gutteile': 17}}},
'Nachtschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 56, 'Gutteile': 52}}}}}2"}}}
ok its a string and there is a number addes to every string but this shows that the data is obviously there (i am confused...)
In your code, you initialize maschinen_liste = {"Pr5":{}}
at the beginning, outside all of your loops. When you do day[temp_day] = maschinen_liste
, no new dictionary is created (it's only a reference to the same dictionary). So in the end, you end up with each day pointing at the same dictionary.
If you put maschinen_liste = {"Pr5":{}}
inside your day loop, after for this_day in range(1,dayspermonth+1):
, that should solve the problem, since it will create a new dictionary for every day.