-4

我有两个这样的 csv 文件:

文件1:

# full part
1 30   10

文件2:

# full part
1 32   15

我想做列操作并像这样输出:

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

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

4

1 回答 1

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

文件2:

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. 有关所有可用格式选项的详细信息,请参阅文档

如果您希望输出对齐......最简单的方法是使用字符串格式来强制值在打印之前为固定宽度。例如,而不是c3.writerow(…)do c3.writerow('{:<20}'.format(col) for col in …)。如果你需要任何真正花哨的东西——比如通过遍历所有行并找到每列的最大宽度来确定每列的正确宽度——你可能想要在周围放置某种包装器writer(或者可能根本不csv使用用于输出)。

这里有几个技巧:

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

其次,acsv.reader就像文件、列表或任何其他可迭代对象。这只是一系列行。因此,如果您想同步地通过两个 CSV 读取器,只需zip将它们放在一起,您就会得到一个单行序列对。(如果您使用的是 Python 2.x,则可能需要itertools.izip改用。)

最后,CSV 文件通常不做任何事情来指示值的类型,所以reader只给你字符串。如果您知道这些值是整数,并且想以这种方式对待它们,则必须调用int它们。

于 2013-04-05T18:33:47.343 回答