2016-09-02 3 views
0

Я хочу прочитать несколько строк файла CSV. Я открываю список и добавляю одну строку в список. Затем я попытаюсь распечатать список. Но список пуст. Файл CSV выглядит следующим образом:Чтение нескольких строк в CSV-файле

`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; 
` 

Это мой код:

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 заранее!

+0

Сначала удалите оператор 'if'. 'line_num' dos не подсчитывает поля, которые, как я полагаю, вы думаете – tuergeist

+0

Вы уже потребляли файл при расчете' anzahl_zeilen', поэтому для 'for row in spamreader' ничего не осталось. – jonrsharpe

+0

Не могли бы вы объяснить вашу цель более точно? Вы говорите, что хотите прочитать несколько строк csv-файла, но у меня есть проблемы, чтобы понять, что вы на самом деле пытаетесь сделать в своем фрагменте кода ... –

ответ

0

Следующие работы. Напоминаем, что итерация по данным в строке anzahl_zeilen ... делает невозможным повторение итерации по вашим данным.

2nd вещь. if spamreader.line_num > 9 and spamreader.line_num < anzahl_zeilen: действительно не проверяет столбцы в строке, и если вы в конце. Итератор делает последний для вас. Чтобы закрепить столбцы, используйте вместо этого 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]) 

Пожалуйста, ознакомьтесь с 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

Он по-прежнему не делает того, что я хочу. Теперь список содержит пустое содержимое, пока этот список. Так что да, он выполняет итерацию по данным, но не получает никакого контента и не только считывает конкретные строки, которые я хочу прочитать. –

+0

Во-первых, этот ответ решает ваш вопрос. Вы не указали, что вас интересуют конкретные строки. Но вы можете это легко сделать. Ответ отредактирован. – tuergeist

0

Проблема с кода является то, что вы итерацию над spamreader дважды. Вы можете сделать это только один раз.

Это заявление приведет к правильному ответу.

anzahl_zeilen = sum(1 for row in spamreader) 

но когда теперь перебирать же 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) 

решить эту пользу,

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

Предлагаемое решение также не работает. – 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

Спасибо! Но что, если я хочу напечатать строки 9 до 11? lines = df.ix [: 9-11, ['c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9']]? –