Anfängerproblem - Summenbildung einer Textdatei

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
ad fontes
User
Beiträge: 3
Registriert: Freitag 23. April 2010, 19:15

Hallo,
ich beschäftige mich seit kurzem mit Programmierung und habe eine
Frage zu meinem Skript. Ich will Daten aus einer Textdatei einlesen und bearbeiten.

Zum Testen habe ich folgende Daten erstellt:
1,3
2,4
9,7
Man beachte, daß das Komma der Zeichentrenner ist - es sind also 2 Spalten.

Ich möchte nun für jede der 2 Spalten mir die Summe ausgeben lassen. Mittels
dictionary und csv-reader habe ich das schon hinbekommen, leider noch nicht mit
dem Skript welches unten folgt und in dem ich nur für mein Problem relevanten
Programmcode wiedergegeben habe.
Problem: die Zeile

Code: Alles auswählen

z = int(zeile[k])
soll nach dem ersten Schleifendurchlauf der äußeren Schleife "out of range" sein.
Ich kann diese Fehlermeldung nicht nachvollziehen.

Code: Alles auswählen

  k = 0               

    while k < 2:                #k = 2 spalten mit daten vorhanden

        i = 0

        summe = 0

        while i < 3:            #i = 3 zeilen mit daten vorhanden

            zeile = einlesen.readline()         #einlesen jeder zeile und

            zeile = string.split(zeile,",")        #splitten

            z = int(zeile[k])   #merke dir den k-ten index jeder zeile

            print z

            summe += z

            i += 1

        print summe

        k += 1                  #nun ist spalte 2 dran
Wenn ich z.B. die Anfangsbedingungen:

Code: Alles auswählen

k = 0               

    while k < 1: 

setze rechnet er mir vorschriftsmäßig die summe der ersten spalte aus.


Wenn ich

Code: Alles auswählen

k = 1               

    while k < 2:

setze, rechnet er mir wie gewünscht die summer der 2ten spalte aus.


Nur bei

Code: Alles auswählen

k = 0               

    while k < 2:

tritt wie erwähnt das Indexproblem auf.

Ich habe ein riesiges Brett vor dem Kopf. Der Fehler scheint trivial doch
ich finde ihn nicht und bitte um Hilfe. Ich wäre auch über generelle Hinweise im Bezug
zur Herangehensweise an diese Aufgabe dankbar.

Grüße,
ad fontes
Papiergeld kehrt früher oder später zu seinem inneren Wert zurück - Null: Voltaire
BlackJack

@ad fontes: Nachdem die äussere Schleife einmal abgearbeitet ist, bist Du am Ende der Eingabedatei angekommen. Wo glaubst Du denn das der Rechner weiss das er auf magische Weise wieder mit der ersten Zeile in der Datei beginnen soll!?

Allgemeiner Hinweis wäre dass das alles viel zu "primitiv" und kleinteilig gelöst ist und das Daten in Textdateien nunmal in Zeilen organisiert sind und man die deshalb auch besser zeilenweise und nicht spaltenweise abarbeiten sollte.

Wenn man die Anzahl der Wiederholungen vor Eintritt in eine Schleife kennt, nimmt man eine ``for``-Schleife und keine ``while``-Schleife. Und wenn man direkt über die Objekte iterieren kann, nimmt man nicht dem Umweg über einen Index.
ad fontes
User
Beiträge: 3
Registriert: Freitag 23. April 2010, 19:15

Danke für die rasche Antwort - werde mir deine Tips zu Herzen nehmen.
Gruß,
ad fontes
Papiergeld kehrt früher oder später zu seinem inneren Wert zurück - Null: Voltaire
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wahrscheinlich gibt's bessere Lösungen, aber trotzdem:

Code: Alles auswählen

>>> s = '1,3\n2,4\n9,7'
>>> nums = sum((map(int, line.split(',')) for line in s.splitlines()), [])
>>> [sum(nums[i::2]) for i in xrange(2)]
[12, 14]
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Mit NumPy geht sowas auch recht einfach:

Code: Alles auswählen

In [30]: sum(np.loadtxt('data', dtype=int, delimiter=','), axis=0)
Out[30]: array([12, 14])
ad fontes
User
Beiträge: 3
Registriert: Freitag 23. April 2010, 19:15

Wiederum Dank für die Antworten,
werd alles mal testen.
Gruß
Papiergeld kehrt früher oder später zu seinem inneren Wert zurück - Null: Voltaire
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

So so:

Code: Alles auswählen

import operator

summen = [0] * 2
with open("...") as einlesen:
    for zeile in einlesen:
        daten = map(int, zeile.split(","))
        summen = map(operator.add, summen, daten)
print(summen)
Stefan
Antworten