Если у меня есть несколько файлов 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", чтобы пропустить эту строку, но, похоже, не попал туда где-то.
Ваша "пустая" строка НЕ пуста.
Если он пуст, 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
.
row_count=1
.
Если строка была пустой, я не думаю, что это было бы правдой:
row[0] == ' ' # A space?
Я бы ожидал, что row
будет пустым списком, но, возможно, есть что-то в ваших данных, о которых я не знаю.
Кроме того, вместо того, чтобы сортировать логику для отслеживания row_count
, а затем вычитать pass_count
, почему бы не сохранить простые вещи и просто увеличивать row_count
всякий раз, когда вы пишете другую строку Excel? Это сделало бы ненужным pass_count
.
row_count
счетчикrow_count
в строке [0] == 'type' nest. :) Спасибо всем!