我对Python比较陌生。我试图找到一种方法来创建一个查看名为" data_old"的文件的脚本。从上个月开始,将其与最近一个月的数据进行比较,称为" data_new",然后最终将该数据输出到新的CSV" data_compare"。
每个月的文件都是一致的,看起来像这样(例子)
第1个月 公司,StaffNumber,NeedToPass,通过,%年龄会议要求
xxxxxxxx,100,80,30,30%第3个月 公司,StaffNumber,NeedToPass,通过,%会议要求
xxxxxxxx,101,81,54,60%
我试图让输出文件比较来自所有行的数据并向我显示"百分比改善,而不是"百分比会议要求"。我没有尝试过任何工作。
由于数字一直在变化,因此唯一的常见数据将是公司名称。
我需要一个简单,解释性的评论方式......因为我想理解逻辑,所以我可以修改它并添加功能。
非常感谢。
答案 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()