Hallo,
für ein Spiel möchte ich CSV Dateien auswerten und dabei Grafiken erstellen.
Jede Zeile von 156 - 172 erstellt eine Grafik, jede Zeile für sich funktioniert auch einzeln.
Sobald ich jedoch (z.B) 156 und 157 gleichzeitig "aktiv" habe, so glückt die Erstellung der ersten Grafik, die 2. Grafik ist jedoch kaputt (kaputt deshalb, weil die Spieler in der Grafik mehrfach vorkommen).
1. Grafik
2. Grafik
So kam ich auf die Idee dass es einen ungewollten Seiteneffekt im Dictionary gibt, da ich dieses bei der Erstellung der Grafik noch verändere, also habe ich zu Beginn der Funktion in Zeile 110 ein deepcopy() eingebaut um dies zu verhindern. Leider ohne den gewünschten Erfolg. Warum?
Python
import csv
import matplotlib.pyplot as plt
from matplotlib.figure import Figure
import pathlib
import copy
SKRIPTPFAD = pathlib.Path(__file__).parent
PFAD = r"C:\Users\***\Nextcloud\P_Python\2022-10-09 21-34-30.csv"
MAX_RUNDEN = 100
class Statistik:
def __init__(self):
self.angriff_hp = [[] for _ in range(MAX_RUNDEN)]
self.angriff_schild = [[] for _ in range(MAX_RUNDEN)]
self.angriff_abgemilderter_schaden = [[] for _ in range(MAX_RUNDEN)]
self.angriff_gesamt = [[] for _ in range(MAX_RUNDEN)]
self.deff_hp = [[] for _ in range(MAX_RUNDEN)]
self.deff_schild = [[] for _ in range(MAX_RUNDEN)]
self.deff_abgemilderter_schaden = [[] for _ in range(MAX_RUNDEN)]
self.deff_gesamt = [[] for _ in range(MAX_RUNDEN)]
def addiere_schaden(self, typ, wert, runde):
index = int(runde) - 1
wert = int(wert)
if typ == "angriff_hp":
self.angriff_hp[index].append(wert)
elif typ == "angriff_schild":
self.angriff_schild[index].append(wert)
elif typ == "angriff_abgemilderter_schaden":
self.angriff_abgemilderter_schaden[index].append(wert)
elif typ == "angriff_gesamt":
self.angriff_gesamt[index].append(wert)
elif typ == "deff_hp":
self.deff_hp[index].append(wert)
elif typ == "deff_schild":
self.deff_schild[index].append(wert)
elif typ == "deff_abgemilderter_schaden":
self.deff_abgemilderter_schaden[index].append(wert)
elif typ == "deff_gesamt":
self.deff_gesamt[index].append(wert)
def schaden_addieren(row, teilnehmer):
angreifer = row[3]
verteidiger = row[7]
runde = row[0]
if not row[12] == "--":
teilnehmer[angreifer].addiere_schaden("angriff_hp", row[12], runde)
teilnehmer[verteidiger].addiere_schaden("deff_hp", row[12], runde)
if not row[13] == "--":
teilnehmer[angreifer].addiere_schaden("angriff_schild", row[13], runde)
teilnehmer[verteidiger].addiere_schaden("deff_schild", row[13], runde)
if not row[14] == "--":
teilnehmer[angreifer].addiere_schaden("angriff_abgemilderter_schaden", row[14], runde)
teilnehmer[verteidiger].addiere_schaden("deff_abgemilderter_schaden", row[14], runde)
if not row[15] == "--":
teilnehmer[angreifer].addiere_schaden("angriff_gesamt", row[15], runde)
teilnehmer[verteidiger].addiere_schaden("deff_gesamt", row[15], runde)
if not row[22] == "--":
teilnehmer[angreifer].addiere_schaden("angriff_hp", 0, runde)
teilnehmer[angreifer].addiere_schaden("angriff_schild", 0, runde)
teilnehmer[angreifer].addiere_schaden("angriff_abgemilderter_schaden", 0, runde)
teilnehmer[angreifer].addiere_schaden("angriff_gesamt", 0, runde)
def csv_auswerten(pfad, teilnehmer):
bericht = False
with open(pfad, newline='', encoding="utf-8") as csvfile:
csv_inhalt = csv.reader(csvfile, delimiter='\t', quotechar='|')
for row in csv_inhalt:
print(", ".join(row))
if bericht:
try:
"""
# 'Runde'0, 'Kampf-Ereignis'1, 'Typ'2, 'Angreifername'3, 'Angreiferallianz'4, 'Angreiferschiff'5, 'Angreifer - Ist Armada?'6, 'Zielname'7, 'Zielallianz'8, 'Zielschiff'9, 'Ziel - Ist Armada?'10, 'Kritischer Treffer?'11, 'Hüllenschaden'12, 'Schildschaden'13, 'Abgemilderter Schaden'14, 'Gesamtschaden'15, 'Fähigkeitstyp'16, 'Fähigkeitswert'17, 'Fähigkeitsbezeichnung'18, 'Name der Figur mit der Fähigkeit'19, 'Ziel besiegt'20, 'Ziel zerstört'21, 'Waffen laden %'22]
print(f"Angreifername: {row[3]}") # Angreifername
print(f"Ist Armada?: {row[6]}") # Ist Armada?
print(f"Zielname: {row[7]}") # Zielname
print(f"Ziel ist Armada?: {row[10]}") # Ziel ist Armada?
print(f"Kritischer Treffer?: {row[11]}") # Kritischer Treffer?
print(f"Hüllenschaden: {row[12]}") # Hüllenschaden
print(f"Schildschaden: {row[13]}") # Schildschaden
print(f"Abgemilderter Schaden: {row[14]}") # Abgemilderter Schaden
print(f"Gesamtschaden: {row[15]}") # Gesamtschaden
print(f"Ziel besiegt: {row[20]}") # Ziel besiegt
print(f"Ziel zerstört: {row[21]}") # Ziel zerstört
print(f"Waffen laden: {row[22]}") # Waffen laden"""
if row[3] in teilnehmer and row[7] in teilnehmer:
schaden_addieren(row, teilnehmer)
else:
if not row[3] in teilnehmer and not row[3] == "--":
teilnehmer.update({row[3]: Statistik()})
if not row[7] in teilnehmer and not row[7] == "--":
teilnehmer.update({row[7]: Statistik()})
schaden_addieren(row, teilnehmer)
except IndexError:
print("Index Error")
else:
if "Runde" in row:
bericht = True
pass
def schaden_pro_runde(teilnehmer, title, name):
c_teilnehmer = copy.deepcopy(teilnehmer)
for spieler, statistik in c_teilnehmer.items():
x = []
y = []
for runde, schaden in enumerate(getattr(statistik, name), start=1):
x.append(runde)
y.append(sum(schaden))
y.reverse()
for index, i in enumerate(y):
if i:
break
y.reverse()
y = y[:-index]
x = x[:-index]
plt.plot(x, y, label=spieler)
plt.title(title)
plt.legend()
picpfad = pathlib.Path(SKRIPTPFAD / title.replace(" ", "_").lower())
plt.savefig(picpfad)
def gesamtschaden(teilnehmer, title, name):
c_teilnehmer = copy.deepcopy(teilnehmer)
labels = []
values = []
for spieler, statistik in c_teilnehmer.items():
y = []
for schaden in getattr(statistik, name):
y.append(sum(schaden))
y.reverse()
for index, i in enumerate(y):
if i:
break
y.reverse()
values.append(sum(y[:-index]))
labels.append(spieler)
fig, ax = plt.subplots()
ax.pie(values, labels=labels, autopct='%1.1f%%')
ax.axis('equal')
ax.set(title=title)
picpfad = pathlib.Path(SKRIPTPFAD / title.replace(" ", "_").lower())
plt.savefig(picpfad)
def daten_auswerten(teilnehmer):
schaden_pro_runde(teilnehmer, "Ausgeteilter Hüllenschaden pro Runde", "angriff_hp")
schaden_pro_runde(teilnehmer, "Ausgeteilter Schildschaden pro Runde", "angriff_schild")
#schaden_pro_runde(teilnehmer, "Ausgeteilter Abgemilderter Schaden pro Runde", "angriff_abgemilderter_schaden")
#schaden_pro_runde(teilnehmer, "Ausgeteilter Gesamtschaden pro Runde", "angriff_gesamt")
#schaden_pro_runde(teilnehmer, "Genommener Hüllenschaden pro Runde", "deff_hp")
#schaden_pro_runde(teilnehmer, "Genommener Schildschaden pro Runde", "deff_schild")
#schaden_pro_runde(teilnehmer, "Genommener abgemilderter Schaden pro Runde", "deff_abgemilderter_schaden")
#schaden_pro_runde(teilnehmer, "Genommener Gesamtschaden pro Runde", "deff_gesamt")
#gesamtschaden(teilnehmer, "Ausgeteilter Hüllenschaden Gesamt", "angriff_hp")
#gesamtschaden(teilnehmer, "Ausgeteilter Schildschaden Gesamt", "angriff_schild")
#gesamtschaden(teilnehmer, "Ausgeteilter Abgemilderter Schaden Gesamt", "angriff_abgemilderter_schaden")
#gesamtschaden(teilnehmer, "Ausgeteilter Gesamtschaden Gesamt", "angriff_gesamt")
#gesamtschaden(teilnehmer, "Genommener Hüllenschaden Gesamt", "deff_hp")
#gesamtschaden(teilnehmer, "Genommener Schildschaden Gesamt", "deff_schild")
#gesamtschaden(teilnehmer, "Genommener abgemilderter Schaden Gesamt", "deff_abgemilderter_schaden")
#gesamtschaden(teilnehmer, "Genommener Gesamtschaden Gesamt", "deff_gesamt")
def main():
teilnehmer = {}
csv_auswerten(PFAD, teilnehmer)
daten_auswerten(teilnehmer)
if __name__ == "__main__":
main()
Alles anzeigen