Python: перестановка строк CSV с условиями

1

Если у меня есть несколько файлов csv, выполните следующие действия:

a,1,2,3
type, max, min, avg
b,4,5,6
<empty line>
c,6,7,8
xxx,4,3,2
d,5,6,7

после прочтения вышеуказанного csv файла с помощью csv-ридера, как я удаляю данные в новый файл xls с помощью модуля xlwt, но упорядоченным образом, чтобы он: - записывает заголовок как 1-я строка (эта строка всегда имеет тип "1" ). - игнорирует пустые строки - игнорирует любые строки, которые имеют 1-й элемент как "xxx"

Я пробовал со следующим кодом, но пустая строка не исчезает.: (

for filename in glob.glob(p):
     (f_path, f_name) = os.path.split(filename)
     (f_short_name, f_extension) = os.path.splitext(f_name)
     ws = wb.add_sheet(str(f_short_name))
     spamReader = csv.reader(open(filename, 'rb'))

     for row in spamReader:
         pass_count = 0
         if 'type' in row[0]:
             for col in range(len(row)):
                 ws.write(0,col,convert(row[col]))
         else:
             if (((row[0] == 'xxx') or (row[0] == ' ')):
                 pass_count += 1
                 pass
             else:
                 for col in range(len(row)):
                     ws.write(row_count,col,convert(row[col]))

        row_count = row_count+1-pass_count


wb.save(q)

EDIT: Ребята, извинения за ввод в заблуждение с исходными данными csv. Мой файл данных csv не содержит пустых строк. Конечный продукт содержит пустую строку, то есть конечный файл xls. Пустая строка происходит точно на предположительно row[0] - 'type'. Кроме того, я включил код, который предотвращает перезапись строки.

например. ввод:

a,1,2,3
type, max, min, avg
b,4,5,6
c,6,7,8
xxx,4,3,2
d,5,6,7

вывод xls:

type, max, min, avg
<empty line>
a,1,2,3
b,4,5,6
c,6,7,8
d,5,6,7

Здесь заголовок записывается в 1-ю строку, строка с "xxx" игнорируется, но пустая строка встречается в строке2, которая является местом строки с строкой [0] = 'type' из входного файла. Это причина, почему я привел "pass_count", чтобы пропустить эту строку, но, похоже, не попал туда где-то.

  • 0
    нашел решение, row_count счетчик row_count в строке [0] == 'type' nest. :) Спасибо всем!
Теги:
csv
xlwt

2 ответа

3
Лучший ответ

Ваша "пустая" строка НЕ ​​пуста.

Если он пуст, row будет [] то есть пустым списком, и в первую очередь ссылки на row[0] приведут к возникновению исключения. Поскольку этого не произошло, и, как вы говорите, оно не соответствует одному пространству, вывод заключается в том, что он должен содержать некоторые другие пустые пробелы.

Для надежности в случае действительно пустой строки сначала нужно проверить пустую строку:

if not row: continue
row = [x.strip() for x in row] # remove leading and trailing whitespace from all fields
if not row[0] or row[0] == "xxx": continue
if row[0] == "type":
    # code to write headings goes here
else:
    # code to write data goes here
row_count += 1 # pass_count is pointless

Кстати, ваши данные примера имеют "тип" в строке ввода второй. Это перепишет первую строку в выходном файле, а вторая строка выходного файла будет пуста!

Обновить в ответ на пересмотренную информацию

Даже если у вас нет пустой строки в этом текущем файле, очень хорошая практика защищать от совершенно пустых строк, строк только с пробелами и полей, которые состоят только из пробелов, используя код, аналогичный тому, что я предложил, Пустая или пустая строка в конце файла csv не является редкостью.

Я должен был упомянуть, что у вас, похоже, есть антикварная версия xlwt; более поздние версии вызовут исключение, например. Attempt to overwrite cell: sheetname=u'x' rowx=0 colx=0. Это было введено для улавливания непреднамеренной перезаписи и может быть отключено на каждом листе: workbook.add_sheet(u'Some Sheet Name', cell_overwrite_ok=True)

Ваше использование str() в ws = wb.add_sheet(str(f_short_name)), безусловно, необязательно и может вызвать исключение, если имя файла уже является объектом unicode.

  • 0
    на самом деле, я исключил код для предотвращения перезаписи row1, т.е. я установил row_count=1 .
  • 0
    Ранее я следовал вашему совету, чтобы противостоять пустым строкам, используя приведенный выше пример кода. Кроме того, это выглядит более питоническим. Некоторые очень полезные и ключевые уроки отмечены! Большое спасибо!
3

Если строка была пустой, я не думаю, что это было бы правдой:

row[0] == ' '  # A space?

Я бы ожидал, что row будет пустым списком, но, возможно, есть что-то в ваших данных, о которых я не знаю.

Кроме того, вместо того, чтобы сортировать логику для отслеживания row_count, а затем вычитать pass_count, почему бы не сохранить простые вещи и просто увеличивать row_count всякий раз, когда вы пишете другую строку Excel? Это сделало бы ненужным pass_count.

  • 0
    спасибо! .. тоже полезно

Ещё вопросы

Сообщество Overcoder
Наверх
Меню