Напишите каждый список в виде столбца в таблице csv

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

#outrow = (Layer,RasterCatalog,ShapeFile,Text,Terrain,GroupLayer,Locator,MapDocument,Toolbox,DbaseTable,RasterDataset)

#formats = (['Layer','RasterCatalog','ShapeFile','Text','Terrain','GroupLayer','Locator','MapDocument','Toolbox','DbaseTable','RasterDataset'])

# if I were to print(outrow), it would look like this:
   #(['H:\\Test\\Test_Data\\New Layer.lyr'], [], ['H:\\Test\\Test_Data\\New_Shapefile.dbf', 'H:\\Test\\Test_Data\\New_Shapefile.shp'], [], [], [], [], [], [], ['H:\\Test\\Test_Data\\New_dBASE_Table.dbf'], [])

def WriteCSVFile(csvFile,formats,outrow):

    ofile  = open(csvFile, "wb")        
    writer = csv.writer(ofile, delimiter=',')
    writer.writerow(formats) #making header here
    writer.writerows(outrow)
    ofile.close()

person RustyShackleford    schedule 09.01.2014    source источник


Ответы (1)


Если я вас правильно понял, то outrow — это список списков, где каждый список содержит один столбец, верно? Затем (при условии, что все они имеют одинаковую длину) вы можете просто zip() их вместе:

writer.writerows(zip(*outrow))

Проиллюстрировать:

>>> outrow = [[1,2,3], [4,5,6], [7,8,9]]
>>> import csv
>>> import sys
>>> w = csv.writer(sys.stdout)
>>> w.writerows(zip(*outrow))
1,4,7
2,5,8
3,6,9

Если столбцы имеют разную длину, используйте izip_longest() из модуля itertools (zip_longest(), если вы на Python 3):

>>> import itertools
>>> outrow = (['H:\\Test\\Test_Data\\New Layer.lyr'], [], ['H:\\Test\\Test_Data\\New_Shapefile.dbf', 'H:\\Test\\Test_Data\\New_Shapefile.shp'], [], [], [], [], [], [], ['H:\\Test\\Test_Data\\New_dBASE_Table.dbf'], [])
>>> w.writerows(itertools.izip_longest(*outrow, fillvalue=""))
H:\Test\Test_Data\New Layer.lyr,,H:\Test\Test_Data\New_Shapefile.dbf,,,,,,,H:\Test\Test_Data\New_dBASE_Table.dbf,,,H:\Test\Test_Data\New_Shapefile.shp,,,,,,,,
person Tim Pietzcker    schedule 09.01.2014
comment
каждый список имеет разную длину - person RustyShackleford; 09.01.2014
comment
@wannabe_n00b: Хорошо, а что вставить в столбец после того, как список станет пустым? Возможно, вы могли бы показать пример ввода и желаемого результата. Возможно я не правильно понял ваш вопрос. - person Tim Pietzcker; 09.01.2014
comment
Конечно, я добавил еще немного информации. Я в основном хочу, чтобы каждый список печатался вертикально вниз по столбцу. - person RustyShackleford; 09.01.2014