escribe columnas CSV en un orden diferente en Python

Me doy cuenta de que esto es muy similar a esta pregunta . Sin embargo, tengo un archivo CSV que siempre viene en el mismo formato que necesito escribir con columnas en un orden diferente para moverlo por la tubería de procesamiento de datos. Si mi archivo csv contiene encabezados y datos como este:

Date,Individual,Plate,Sample,test,QC 03312011,Indiv098,P342,A1,deep,passed 03312011,Indiv113,P352,C3,deep,passed 

Cómo escribiría un archivo csv con las mismas columnas que la entrada original csv pero en el siguiente orden:

 test,QC,Plate,Sample deep,passed,P342,A1 deep,passed,P352,C3 

Mi primer pensamiento fue hacer algo como esto:

 f = open('test.csv') lines = f.readlines() for l in lines: h = l.split(",") a, b, c, d, e, f = h for line in h: print e, f, c, d, 

Si existe la menor posibilidad de que el archivo de entrada o el archivo de salida no tengan el mismo diseño cada vez, aquí hay una manera más general de obtener su “reordenar función”:

 writenames = "test,QC,Plate,Sample".split(",") # example reader = csv.reader(input_file_handle) writer = csv.writer(output_file_handle) # don't forget to open both files in binary mode (2.x) # or with `newline=''` (3.x) readnames = reader.next() name2index = dict((name, index) for index, name in enumerate(readnames)) writeindices = [name2index[name] for name in writenames] reorderfunc = operator.itemgetter(*writeindices) writer.writerow(writenames) for row in reader: writer.writerow(reorderfunc(row)) 
 reorderfunc = operator.itemgetter(4, 5, 2, 3) ... newrow = reorderfunc(oldrow) ... 

Teniendo en cuenta su entrada como src.csv :

 import csv with open('x.csv','rb') as i: with open('y.csv','wb') as o: r = csv.DictReader(i) w = csv.DictWriter(o,'test QC Plate Sample'.split(),extrasaction='ignore') w.writeheader() for a in r: w.writerow(a) 

Salida

 test,QC,Plate,Sample deep,passed,P342,A1 deep,passed,P352,C3 
 #Use CSV library import csv media = {} files=['Online.txt'] directory = "C:/directory/" rowCnt=0 for file in files: file=directory+file with open(file, 'rb') as f: reader = csv.reader(f, delimiter='|') #use pipe delimiter for row in reader: rowCnt+=1 if (rowCnt % 1000) == 0: print ('"%s","%s","%s","%s","%s","%s","%s","%s","%s"')% (row[1],row[4],row[14],row[17],row[18],row[24],row[25],row[28],row[30])