2016-04-25 50 views
-1

我對Python比較陌生。我試圖找到一種方法來創建一個腳本,查看上個月名爲「data_old」的CSV文件,並將其與最近一個月稱爲「data_new」的數據進行比較,最後將該數據輸出到新的CSV「data_compare」。比較csv的行數並制定出百分比

的文件每個月都一致的佈局,看起來像這樣(例如)

月1
公司,StaffNumber,NeedToPass,傳遞%年齡會議要求
XXXXXXXX,100,80,30 ,30%

個月3
公司,StaffNumber,NeedToPass,傳遞%會議要求
XXXXXXXX,101,81,54,60%

我想獲得輸出文件來比較所有行的數據,並顯示「百分比改進,而不是」百分比會議要求「。沒有我嘗試似乎工作。

隨着數字一直在變化,唯一的常見數據將是公司名稱。

我需要一個簡單,解釋性的方式與評論...因爲我想了解邏輯,所以我可以修改它並添加功能。

非常感謝。

+0

因此除了第一個(唯一公司名稱)以外的所有列都包含整數? –

+0

是的 – glister11

回答

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()