2016-09-02 3 views
0

Ich möchte mehrere Zeilen einer CSV-Datei lesen. Ich öffne eine Liste und füge die eine Zeile an die Liste an. Dann versuche ich die Liste zu drucken. Aber die Liste ist leer. Die CSV-Datei sieht wie folgt:Mehrere Zeilen in einer CSV-Datei lesen

`hallo;das;ist;ein;test;der;hoffentlich;funktioniert;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert1;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert2;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert3;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert4;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert5;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert6;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert7;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert8;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert9;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert10;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert11;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert12;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert13;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert14;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert15;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert16;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert17;fingerscrossed; 
` 

Das ist mein Code:

import csv 
spamreader = csv.reader(open('test.csv'), delimiter = ';') 

verbraeuche_ab_reset = [] 


def berechne_gemittelten_verbrauch(): 
    anzahl_zeilen = sum(1 for row in spamreader) 
    for row in spamreader: 
     if spamreader.line_num > 9 and spamreader.line_num < anzahl_zeilen: 
      verbrauch_ab_reset = row[7] 

      verbraeuche_ab_reset.append(verbrauch_ab_reset) 

    print(verbraeuche_ab_reset) 
    print(anzahl_zeilen) 

berechne_gemittelten_verbrauch() 

Thx im Voraus!

+0

Entfernen Sie die 'if'-Anweisung zuerst. 'line_num' zählt die Felder nicht, ich nehme an, Sie denken – tuergeist

+0

Sie haben die Datei bereits bei der Berechnung von' anzahl_zeilen' verbraucht, so dass nichts mehr übrig bleibt, als dass 'row in spamreader' durchlaufen werden kann. – jonrsharpe

+0

Können Sie Ihr Ziel genauer erklären? Sie sagen, Sie möchten mehrere Zeilen einer CSV-Datei lesen, aber ich habe Probleme zu verstehen, was Sie eigentlich in Ihrem Code-Snippet tun wollen ... –

Antwort

0

Folgendes funktioniert. Erinnern, Iterieren über die Daten in der Zeile anzahl_zeilen ... macht es unmöglich, erneut über Ihre Daten zu iterieren.

Zweite Sache. if spamreader.line_num > 9 and spamreader.line_num < anzahl_zeilen: überprüft weder die Spalten in der Zeile, noch, wenn Sie am Ende sind. Der Iterator macht das letztere für Sie. Um die Spalten zu bearbeiten, verwenden Sie stattdessen len(row).

import csv 
spamreader = csv.reader(open('test.csv'), delimiter = ';') 


def berechne_gemittelten_verbrauch(): 
    #anzahl_zeilen = sum(1 for row in spamreader) # kills your data/iterator is at the end 
    verbraeuche_ab_reset = [] 
    for row in spamreader: 
     if len(row) > 9: 
      verbrauch_ab_reset = row[7] 
     verbraeuche_ab_reset.append(verbrauch_ab_reset) 
    return verbraeuche_ab_reset 

verb = berechne_gemittelten_verbrauch() 
# subsets 
print(verb[9:11]) 

Bitte lesen python subset notation

a[start:end] # items start through end-1 
a[start:] # items start through the rest of the array 
a[:end]  # items from the beginning through end-1 
a[:]   # a copy of the whole array 
+0

Es tut immer noch nicht, was ich will. Jetzt enthält die Liste leere Inhalte, solange die Liste ist. Also ja, es iteriert über die Daten, bekommt aber keinen Inhalt und liest nicht nur die Zeilen, die ich lesen möchte. –

+0

Erstens löst diese Antwort Ihre Frage. Sie haben nicht angegeben, dass Sie an bestimmten Zeilen interessiert sind. Aber du kannst das leicht machen. Antwort bearbeitet. – tuergeist

0

Das Problem mit Ihrem Code ist, dass Sie über die spamreader zweimal iterieren. Du kannst das nur einmal tun.

Diese Anweisung führt zu der richtigen Antwort.

anzahl_zeilen = sum(1 for row in spamreader) 

aber wenn man jetzt über den gleichen spamreader iterieren Sie leere Liste erhalten werden, da Sie bereits über die Datei iteriert haben einmal

for row in spamreader: 
    if spamreader.line_num > 9 and spamreader.line_num < anzahl_zeilen: 
     verbrauch_ab_reset = row[7] 

     verbraeuche_ab_reset.append(verbrauch_ab_reset) 

diesen Einsatz zu lösen,

spamreader = csv.reader(open('test.csv'), delimiter = ';') 
    anzahl_zeilen = sum(1 for row in spamreader) 
    spamreader = csv.reader(open('test.csv'), delimiter = ';') 
     for row in spamreader: 
      if spamreader.line_num > 9 and spamreader.line_num < anzahl_zeilen: 
       verbrauch_ab_reset = row[7] 

       verbraeuche_ab_reset.append(verbrauch_ab_reset) 
+0

Die vorgeschlagene Lösung funktioniert auch nicht. – tuergeist

0
# try this code its very simple 
input: 
filename :samp1.csv 
c1;c2;c3;c4;c5;c6;c7;c8;c9; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert1;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert2;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert3;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert4;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert5;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert6;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert7;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert8;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert9;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert10;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert11;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert12;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert13;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert14;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert15;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert16;fingerscrossed; 
hallo;das;ist;ein;test;der;hoffentlich;funktioniert17;fingerscrossed; 
#read the file 
import pandas as pd 
data = pd.read_csv('samp1.csv',sep=';') 
df = pd.DataFrame({'c1':data.c1,'c2':data.c2,'c3':data.c3,'c4':data.c4,'c5':data.c5,'c6':data.c6,'c7':data.c7,'c8':data.c8,'c9':data.c9,}) 

#suppose we want to print first 6 lines 
lines = df.ix[:5,['c1','c2','c3','c4','c5','c6','c7','c8','c9']] 
print(lines) 
output: 
     c1 c2 c3 c4 c5 c6   c7    c8    c9 
0 hallo das ist ein test der hoffentlich funktioniert fingerscrossed 
1 hallo das ist ein test der hoffentlich funktioniert1 fingerscrossed 
2 hallo das ist ein test der hoffentlich funktioniert2 fingerscrossed 
3 hallo das ist ein test der hoffentlich funktioniert3 fingerscrossed 
4 hallo das ist ein test der hoffentlich funktioniert4 fingerscrossed 
5 hallo das ist ein test der hoffentlich funktioniert5 fingerscrossed 
+0

Danke! Aber was, wenn ich die Linien 9 bis 11 drucken möchte? Linien = df.ix [: 9-11, ['c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9']]? –

Verwandte Themen