【问题标题】:do column operation between two csv files在两个 csv 文件之间做列操作
【发布时间】:2013-03-28 06:50:26
【问题描述】:

我有两个这样的 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 中做到这一点?

【问题讨论】:

  • 我认为您需要对那里的数据进行更多格式化。将其包装在代码中 ({})。

标签: python csv


【解决方案1】:

你的问题很难理解,但我可以猜一下你的意思:

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 文件。真正简单的方法是使用DictReaderDictWriter(这样,您不需要跳过标题行,并且您可以按名称而不是索引来引用列),但是因为您只三列有两列标题,这不起作用,所以你需要使用readerwriter

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

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

【讨论】:

  • 是的,谢谢。我正在尝试像这样格式化它。但无法像这样格式化问题
  • @hello_sm:阅读格式化帮助,或者只需单击代码按钮将当前选择格式化为代码。
猜你喜欢
  • 2017-10-05
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多