2016-04-25 2 views
-1

Я относительно не знаком с Python. Я пытаюсь найти способ создания сценария, который смотрит на файл CSV с именем «data_old» с предыдущего месяца, и сравнивает его с данными за последний месяц, называемый «data_new», а затем выводит эти данные в новый CSV «data_compare».Сравнить строки csv и процент разработки

The файлы каждый месяц последовательно продуман и выглядеть следующим образом (пример)

Месяц 1
требование компании, StaffNumber, NeedToPass, Прошёл,% возраст встречи
XXXXXXXX, 100, 80, 30 , 30%

месяц 3
Компания, StaffNumber, NeedToPass, требование Passed,%
встреча XXXXXXXX, 101, 81, 54, 60%

Я пытаюсь получить выходной файл, чтобы сравнить данные со всех строк и показать мне «Процент улучшен, а не« Требование о выполнении процентов ». Я ничего не пытаюсь работать.

Поскольку числа изменяются все время, единственными распространенными данными будут название компании.

Мне нужен простой, объяснительный способ с комментариями ... поскольку я хотел бы понять логику, чтобы я мог ее модифицировать и добавлять функции.

Большое значение.

+0

Таким образом, все столбцы, кроме 1-го (уникальное название компании), содержат целые числа? –

+0

Да, это правильно – glister11

ответ

0

Вот пример кода python, который может делать то, что вы хотите. Этот сценарий предполагает, что два входных файла csv имеют одинаковое количество строк. В функции test используется функция zip i, которая останавливается, если один список находится в конце. Если ваши файлы имеют различное количество строк, вам необходимо вручную перевернуть их. Но я думаю, что это хорошая отправная точка

#!/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()