CSV Spalten in Array einlesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

Guten Abend,
ich möchte mir das Leben vereinfachen und ein kleinen Python Programm schreiben. Dieses soll Spalten aus einer CSV-Datei in ein Array speichern um damit hinterher z. B. die Summe berechnen zu können.
Um nicht immer mit der riesigen CSV Datei zu arbeiten habe ich mir eine kleine selbst erzeugt.

Code: Alles auswählen

Test_Array = [2,5,7,10,15,32]

#print(Test_Array[0])
#print(Test_Array[1])
#print(Test_Array[2])
#print(Test_Array[3])
#print(Test_Array[4])


Tab = open(r"C:\Test.csv",'w')

for i in range(0,6):
    #print(i)
    Tab.write("%i;%i\n"%(i,Test_Array[i]))
    

Tab.close()

Tab = open(r"C:\Test.csv",'r')


lines=Tab.readlines()

for i in lines:
    print(i)

sum=0

for line in lines:
    entries = [e.strip() for e in line.split(';')]
    S1 = entries[0]
    S2 = entries[1]
    
    for i in range(1,4):
        sum = S1[i] + S1[i-1]

    print(sum)
    

Raus kommt eine CSV Datei wie folgt Bild
Wie kann ich die Spalte A in einem eigenen Array Speichern z. B. A=[0,1,2,3,4,5] ?

Ich stehe total auf dem Schlauch.

Gruß Kai
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Zuerst einmal mußt Du das eingelesene in eine Zahl umwandeln und diese dann zu `sum` addieren.
Einfacher geht das mit numpy:

Code: Alles auswählen

entries = numpy.genfromtxt("test.csv", delimiter=";")
print(entries.sum(axis=0))
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

und wenn du die Daten professionell analysieren willst ist https://pandas.pydata.org sehr hilfreich
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

ohh Ok, Danke, numpy hatte ich damals gar nicht im Studium. Ich werde mich mal einlesen !
Das ist nur die Vorbereitung für die richtige Tabelle, da wollte ich z. B. 5 Minuten Summenwerte oder Summentageswerte errechnen, ist das mit numpy auch möglich ?
Nur aus interesse, wie speicher ist die erste Spalte in einem Array, das war doch gar nicht so schwer ?!

Gruß

@ThomasL, Danke für den Link, auch pydata kenn ich noch nicht ;)
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

In deinem Code sind einige Fehler, ich habe ihn mal so umgebaut, dass er läuft.
Mit numpy und pandas kann man wesentlicher eleganter mit Spalten und Zeilen arbeiten.

Code: Alles auswählen

test_array = [2, 5, 7, 10, 15, 32]

with open("test.csv", 'w') as datei:
    for i in range(0, 6):
        datei.write("%i;%i\n"%(i, test_array[i]))

with open("test.csv", 'r') as datei:
    lines = datei.readlines()

spalte_a = []
spalte_b = []

for line in lines:
    spalten = [int(element) for element in line.strip().split(';')]
    print(spalten)
    spalte_a.append(spalten[0])
    spalte_b.append(spalten[1])

print(sum(spalte_a), sum(spalte_b))
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

@ TomasL und Sirius3
Danke für eure schnelle Hilfe, ich werde mir numpy, pandas und pydata anschauen und versuchen das damit zu schaffen.
Ich habe es auch geschafft, nicht schön aber selten. ;)

Code: Alles auswählen

Test_Array = [2,5,7,10,15,32]

#print(Test_Array[0])
#print(Test_Array[1])
#print(Test_Array[2])
#print(Test_Array[3])
#print(Test_Array[4])


Tab = open(r"C:\Test.csv",'w')

for i in range(0,6):
    #print(i)
    Tab.write("%i;%i\n"%(i,Test_Array[i]))
    

Tab.close()

Tab = open(r"C:\Test.csv",'r')


lines=Tab.readlines()

for i in lines:
    print(i)

sum=0

#print(lines[2])

A=[0]*len(lines)

print(len(lines))
print(A)

i=0

for line in lines:
    entries = [e.strip() for e in line.split(';')]
    A[i]=entries[0]
    i=i+1
    
print(A)
Schönen Abend noch
Kai
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Mit pandas ginge das z.B. so einfach:

Code: Alles auswählen

import pandas as pd
data = pd.read_csv('test.csv', delimiter=';', names=['spalte1', 'spalte2'])
print(data.head(10)) # zeige die ersten 10 Reihen
print(data.describe()) # zeige eine Analyse der Daten
print(data.spalte1.sum(), data.spalte2.sum()) # Die Summen der Spalten
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn man zu Listelementen auch noch den Index braucht, benutzt man `enumerate`. Statt erst die Datei komplett zu lesen und danach die Zeilen durchzugehen, macht man das in einem Schritt. `S1` und `S2` hast Du ja schon für jede Zeile extrahiert, es fehlt nur noch das Hinzufügen zu einer Liste mit append, statt die Liste mit 0 vorzubelegen.

Code: Alles auswählen

test_array = [2, 5, 7, 10, 15, 32]

with open("test.csv", "w") as output:
    for idx, value in enumerate(test_array):
        output.write("%i;%i\n"%(idx, value))

spalte1, spalte2 = [], []
with open("test.csv") as lines:
    for line in lines:
        a, b = map(int, line.split(';'))
        spalte1.append(a)
        spalte2.append(b)
print(sum(spalte1))
Antworten