比较csv行和计算出百分比

时间:2016-04-25 11:23:51

标签: python csv compare

我对Python比较陌生。我试图找到一种方法来创建一个查看名为" data_old"的文件的脚本。从上个月开始,将其与最近一个月的数据进行比较,称为" data_new",然后最终将该数据输出到新的CSV" data_compare"。

每个月的文件都是一致的,看起来像这样(例子)

  

第1个月   公司,StaffNumber,NeedToPass,通过,%年龄会议要求
  xxxxxxxx,100,80,30,30%

     

第3个月   公司,StaffNumber,NeedToPass,通过,%会议要求
  xxxxxxxx,101,81,54,60%

我试图让输出文件比较来自所有行的数据并向我显示"百分比改善,而不是"百分比会议要求"。我没有尝试过任何工作。

由于数字一直在变化,因此唯一的常见数据将是公司名称。

我需要一个简单,解释性的评论方式......因为我想理解逻辑,所以我可以修改它并添加功能。

非常感谢。

1 个答案:

答案 0 :(得分:0)

这是一个python代码示例,它可能会做你想要的。此脚本假定两个输入csv文件具有相同的行数。在函数test中我使用的函数zip,如果一个列表在末尾则停止。如果您的文件具有不同的行数,则必须手动循环两者。但我认为这是一个很好的起点

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import csv


def parse_csv(filename, sort_row=0, as_dict=False, delimiter=","):
    r = list()
    with open(filename, "rb") as f:
        # make csv reader object
        reader = csv.reader(f, delimiter=delimiter)

        if as_dict:
            # make dict if desired
            header = [h.strip() for h in reader.next()]

        for row in reader:
            if as_dict:
                # make dict if desired
                r.append(dict(zip(header, row)))
            else:
                # strip each item in the row and append it to the return list
                r.append([h.strip() for h in row])

    # sort the list by the first item (company name in this example)
    r.sort(key=lambda x: x[sort_row])
    return r


def write_csv(filename, fieldnames, rows, delimiter=","):
    with open(filename, "w") as f:
        # make csv writer object
        writer = csv.writer(f, delimiter=delimiter)
        # write the first header line
        writer.writerow(fieldnames)
        for row in rows:
            # write each row
            writer.writerow(row)


def test():
    data_old = parse_csv("m1.csv")
    data_new = parse_csv("m2.csv")
    #write_csv("data_compare.csv", data_old[:1][0], data_old[1:])

    result = list()

    # loop over the items (skipping the first header row)
    for o, n in zip(data_old[1:], data_new[1:]):
        # calculate the improvement (or whatever needs to be calculated)
        value = float(n[4].replace("%", "")) - float(o[4].replace("%", ""))

        # create the row
        result.append([o[0], "%s%%" % value, o[4], n[4]])
        #result.append(["%s%%" % value])

    header = ["Company", "Percentage improved", "old", "new"]
    #header = ["Company", "Percentage improved"]
    write_csv("data_compare.csv", header, result)


if __name__ == '__main__':
    test()