2016-11-03 2 views
0
import csv 

data = {} 
f = open("train.csv") 
csv_f = csv.reader(f) 
labels = next(csv_f) 
for i in range(len(labels-1)): 
    a = [] 
    for row in csv_f: 
     a += row[i] 
    data [labels[i]] = a 

Я делаю код, указанным выше, пытаясь прочитать файл CSV и поместить столбцы в словарь с первой частью, как этикетки и второй частью, как ARRA из значения. Это работает для моего первого столбца, который для моего набора данных - это «ID», но после этого он перестает работать - он просто оставляет массив a пустым. Я сделал некоторую отладку и обнаружил, что он выполняет внешний цикл for, а затем внутренний цикл, но затем, когда он выполнил второй цикл внешнего цикла, он просто пропустил внутренний цикл. Он сделал это и для всех последующих.Python 3: Вложенный для петель пропуска вложенных циклов

Почему это так?

И как я могу исправить свой код, чтобы остановить его?

+0

Вы понимаете, что делает каждая ваша петля? –

+1

Возможный дубликат [Python csv.reader: как вернуться в начало файла?] (Http://stackoverflow.com/questions/431752/python-csv-reader-how-do-return-to -the-top-of-the-file) – Kevin

+0

Можете ли вы привести пример содержимого 'train.csv' и то, что вы хотите в качестве вывода, потому что ваше описание нечеткое? – EvensF

ответ

0

Как Кевин говорит выше, я думаю, проблема в том, что после вашей первой итерации через csv_f вам придется перезагрузить csv-ридер обратно в начало файла. Этот алгоритм требует много раз разобрать весь файл, чтобы собрать все данные. Более эффективный алгоритм будет анализировать файл по строкам. Я не проверял этот код, поэтому он может быть не 100%, но, надеюсь, он указывает вам в правильном направлении.

import csv 

data = {} 
f = open("train.csv") 
csv_f = csv.reader(f) 

isLabelRow = True 

for row in csv_f: 
    print "Processing row : " + str(row) 
    if isLabelRow: 
     # Get labels from first row of data 
     labels = [] 
     isLabelRow = False 

     # Initialize data "columns" 
     for label in row: 
      print "Processing label : " + label 
      labels.append(label) 
      data[label] = [] # empty array 

    else: 
     # Add each item in the row to the appropriate "column" in data 
     for i in range(len(row)): 
      data[labels[i]].append(row[i]) 
Смежные вопросы