在两个csv文件之间进行列操作

时间:2013-04-05 18:27:29

标签: python csv

我有两个像这样的csv文件:

文件1:

# full part
1 30   10

file2的:

# full part
1 32   15

我想进行列操作并输出如下:

listname        a        b    diff(b-a)
full            30       32    2
part            10       15    5

我怎么能在python中做到这一点?

1 个答案:

答案 0 :(得分:0)

您的问题很难理解,但我可以猜测您的意思:

csvdiff.py:

import csv

with open('file1') as file1, open('file2') as file2, open('output', 'w') as output:
    next(file1), next(file2) # skip the header lines
    c1, c2 = csv.reader(file1, delimiter=' '), csv.reader(file2, delimiter=' ')
    c3 = csv.writer(output, delimiter=' ')
    c3.writerow(['listname', 'a', 'b', 'diff(b-a)'])
    for (row1, row2) in zip(c1, c2):
        c3.writerow(('full', row1[1], row2[1], int(row2[1])-int(row1[1])))
        c3.writerow(('part', row1[2], row2[2], int(row2[2])-int(row1[2])))

文件1:

full part
1 30 10

file2的:

full part
1 32 15

输出:

listname a b diff(b-a)
full 30 32 2
part 10 15 5

这就是你想要的吗?

请注意,我的测试输入中的列不是“排列”的。如果原始数据排成一行,则可能使用了标签,在这种情况下,您需要使用delimiter='\t'而不是delimiter=' '。如果他们确实拥有不同数量的空格(就像您最初粘贴到问题中一样),您想要离开delimiter=' ',然后添加skipinitialspace=True。有关所有可用格式选项的详细信息,请参阅the docs

如果你想要排列输出......最简单的方法是使用字符串格式化在打印前强制值为固定宽度。例如,代替c3.writerow(…)执行c3.writerow('{:<20}'.format(col) for col in …)。如果你需要任何真的花哨似乎通过遍历所有行并找到每列的最大宽度来计算每列的正确宽度 - 你可能想要在{{ {1}}(或者根本不使用writer输出)。

这里有一些技巧:

首先,使用csv模块为您处理解析(和创建)CSV文件。真正简单的方法是使用csvDictReader(这样,您不需要跳过标题行,您可以按名称而不是索引来引用列),但由于您只有三列的两个列标题,但这不起作用,因此您需要使用DictWriterreader

其次,writer就像文件,列表或任何其他可迭代的。它只是一系列行。因此,如果您想要以锁步方式浏览两个CSV阅读器,只需csv.reader将它们放在一起,就可以得到一对行的行。 (如果您使用的是Python 2.x,则可能需要使用itertools.izip。)

最后,CSV文件通常不会执行任何操作来指示值的类型,因此zip只会为您提供字符串。如果您知道这些值是整数,并希望以这种方式对待它们,则必须在它们上面调用reader