Python: копировать выбранные столбцы CSV в другой файл CSV, когда один заголовок пуст - PullRequest
0 голосов
/ 08 ноября 2011

У меня есть большой CSV-файл с примерно 200 именами заголовков (первое из которых пустое). Я хочу получить некоторые выбранные столбцы и скопировать их в новый файл output.csv. Моя проблема заключается в получении заголовка, который не имеет названия! (пустой первый элемент в заголовке)

Итак, input.csv выглядит примерно так:

            ,header1,header2,header3,header4, ... , header200
            value0, value2, value2, value3, value4, ..., value200
            ,2,3,30,,, ... , 10
            66,2,3,30,, ... , 10

и т. Д. (Все строки имеют одинаковое количество элементов, даже если они пусты).

После прочтения различных вопросов я переработал некоторый код из выводит столбцы CSV в другом порядке в Python

написать,

import csv
from operator import itemgetter         

SelectedSignals = ['header1',  'header4'] 



fiin=open('input.csv','rb') #open to read "r" in binary mode "b"
fiout=open('output.csv','wb') #open to write "w" in binary mode "b"

reader = csv.reader(fiin, delimiter=',')
writer = csv.writer(fiout, delimiter=',')

AllSignalNames = reader.next()
name2index = dict((name, index) for index, name in enumerate(AllSignalNames))
writeindices = [name2index[name] for name in SelectedSignals]
reorderfunc = itemgetter(*writeindices) # itemgetter was imported from operator module
writer.writerow(SelectedSignals)

for row in reader:
    writer.writerow(reorderfunc(row))

это дает желаемый результат, говорят,

            ,header1,header4
            value0, value4
            ,30
            66,30

но проблема в том,

  SelectedSignals = [' ', 'header1',  'header4'] 

чтобы захватить первый столбец. который возвращает KeyError

Я новичок в питоне, поэтому любые советы приветствуются.

1 Ответ

1 голос
/ 08 ноября 2011

В формате CSV первый заголовок должен быть строкой нулевой длины (''), а не пробелом (' '), который вы используете в SelectedSignals.

Youтакже можно добавить поддельное имя столбца к вашему name2index dict, например name2index['header0'] = 0 сразу после name2index = ..., а затем использовать 'header0' в SelectedSignals.

В качестве альтернативы, вы можете использовать значение по умолчаниюдикт (когда он не может найти нужный заголовок, он будет использовать это значение по умолчанию): name2index.get(name, 0) вместо name2index[name] в вашем writeindices выражении.

...