2016-01-26 2 views
1

У меня есть CSV, разделенный символом '|'. Я пытаюсь прочитать CSV, сортировать по восьмому столбцу и выводить отсортированные данные в качестве стандартного CSV в stdout. Проблема в том, что в некоторых строках ввода CSV нет столбца 8. Эти строки без столбца 8 могут быть пропущены полностью. Прямо сейчас, когда он попадает в строку без столбца 8, он выдает ошибку «индекс списка вне диапазона». Если бы я мог просто заставить его продолжать и игнорировать эту строку, это было бы прекрасно.Python sorted() skip row with empty coloumn

Любая помощь будет оценена по достоинству. Конечно, желаю полностью изменить блок кода.

with open(sys.argv[1]) as openFile: 
    reader = csv.reader((x.replace('\0','') for x in openFile), delimiter='|') 
    col = 8 
    sortedReader = sorted(reader, key=lambda k: (k[col] is None, k[col] == "", k[col]), reverse=True) # This was my attempted solution found on Google/StackOverflow. Does not work. 
    csvout = csv.writer(sys.stdout, delimiter=',') 
    for row in sortedReader: 
     try: 
      csvout.writerow(row) 
     except: 
      sys.stderr.write('[!] Error in row') 
      sys.stderr.write(row) 
      continue 
+0

По «продолжать и игнорировать эту строку» вы имеете в виду, чтобы отменить строку? –

+0

Да, я имею в виду отказ от строки. –

ответ

1

просто отфильтровать строки перед сортировкой

filteredRows = filter(lambda x: len(x) > col, reader) 
+0

Вы правы, поэтому фильтруйте строки перед сортировкой –

+1

Я предпочитаю 'filtersrows = [строка для строки в читателе, если len (row)> col]'. Затем 'filtrows.sort (...)' –