Python: перестановка строк CSV с условиями - PullRequest
1 голос
/ 19 мая 2011

Если у меня есть несколько 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 reader, как мне вывести данные в новый xls-файл, используя модуль xlwt, но в упорядоченном виде, чтобы он: - записывает заголовок как первую строку (эта строка всегда имеет тип как первый элемент) - игнорирует пустые строки - игнорирует любые строки, которые имеют 1-й элемент как «ххх»

Я попытался с помощью следующего кода, но пустая строка не исчезает. (

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'. Кроме того, я встроил код, который предотвращает перезапись строки 1.

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

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, чтобы пропустить эту строку, но, похоже, где-то не попал в точку.

Ответы [ 2 ]

3 голосов
/ 19 мая 2011

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

Если бы она была пустой, 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

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

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

Даже если у вас нет пустой строки в этом текущем файле, это очень хорошая практика для защиты от полностью пустых строк, строки только с пробелами и поля, состоящие только из пробелов, с использованием кода, аналогичного тому, что я предложил.Пустая или пустая строка в конце 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 объектом.

3 голосов
/ 19 мая 2011

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

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

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

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

...