在Python中以不同顺序写入CSV列

8 投票
4 回答
9726 浏览
提问于 2025-04-16 18:16

我意识到这个问题和这个问题很相似。不过,我有一个CSV文件,它的格式总是一样的,但我需要把它的列顺序调整一下,以便后续的数据处理。如果我的CSV文件包含这样的表头和数据:

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

我该如何把这个CSV文件写出来,保持和原始输入CSV相同的列,但顺序要变成下面这样:

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

我最初的想法是这样做:

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, 

4 个回答

4

假设你的输入文件是 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)

输出结果

test,QC,Plate,Sample
deep,passed,P342,A1
deep,passed,P352,C3
5
reorderfunc = operator.itemgetter(4, 5, 2, 3)

 ...

newrow = reorderfunc(oldrow)
 ...

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

5

如果输入文件或输出文件每次的格式都有可能不一样,那么这里有一个更通用的方法来获取你的“重新排序函数”:

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))

撰写回答