你的问题很难理解,但我可以猜一下你的意思:
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。有关所有可用格式选项的详细信息,请参阅the docs。
如果您希望输出对齐...最简单的方法是使用字符串格式来强制值在打印之前固定宽度。例如,用c3.writerow('{:<20}'.format(col) for col in …) 代替c3.writerow(…)。如果你需要任何真正花哨的东西——比如通过遍历所有行并找到每列的最大宽度来确定每列的正确宽度——你可能想要在 @ 周围放置某种包装器987654334@(或者可能根本不使用csv作为输出)。
这里有几个技巧:
首先,使用csv 模块为您处理解析(和创建)CSV 文件。真正简单的方法是使用DictReader 和DictWriter(这样,您不需要跳过标题行,并且您可以按名称而不是索引来引用列),但是因为您只三列有两列标题,这不起作用,所以你需要使用reader和writer。
其次,csv.reader 就像文件、列表或任何其他可迭代对象。这只是一系列行。因此,如果您想同步通过两个 CSV 读取器,只需将zip 放在一起,您就会得到一个单行序列对。 (如果您使用的是 Python 2.x,则可能需要改用 itertools.izip。)
最后,CSV 文件通常不做任何事情来指示值的类型,所以reader 只是给你字符串。如果您知道这些值是整数,并希望以这种方式处理它们,则必须对它们调用 int。