我有两个这样的 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中做到这一点?
您的问题很难理解,但我可以猜测您的意思:
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 文件。真正简单的方法是使用DictReader
and DictWriter
(这样,您不需要跳过标题行,并且可以按名称而不是索引来引用列),但是由于您只有两个列标题,三个列,这不起作用,因此您需要使用reader
and writer
。
其次,acsv.reader
就像文件、列表或任何其他可迭代对象。这只是一系列行。因此,如果您想同步地通过两个 CSV 读取器,只需zip
将它们放在一起,您就会得到一个单行序列对。(如果您使用的是 Python 2.x,则可能需要itertools.izip
改用。)
最后,CSV 文件通常不做任何事情来指示值的类型,所以reader
只给你字符串。如果您知道这些值是整数,并且想以这种方式对待它们,则必须调用int
它们。