在Python中以不同的顺序写出CSV列

Ste*_*edy 7 python csv

我意识到这与这个问题非常相似.但是,我有一个CSV文件,它总是以我需要用不同顺序写出的列来格式化,以便将它移到数据处理管道中.如果我的csv文件包含标题和数据,如下所示:

Date,Individual,Plate,Sample,test,QC
03312011,Indiv098,P342,A1,deep,passed
03312011,Indiv113,P352,C3,deep,passed
Run Code Online (Sandbox Code Playgroud)

如何写出与原始输入csv具有相同列的csv文件,但顺序如下:

test,QC,Plate,Sample
deep,passed,P342,A1
deep,passed,P352,C3
Run Code Online (Sandbox Code Playgroud)

我最初的想法是做这样的事情:

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, 
Run Code Online (Sandbox Code Playgroud)

Ign*_*ams 5

reorderfunc = operator.itemgetter(4, 5, 2, 3)

 ...

newrow = reorderfunc(oldrow)
 ...
Run Code Online (Sandbox Code Playgroud)


Joh*_*hin 5

如果输入文件或输出文件每次都没有相同布局的可能性,这里有一个更通用的方法来获取"reorderfunc":

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))
Run Code Online (Sandbox Code Playgroud)