2011-11-20 50 views
0

我想按公司名称总结金额,但公司名称的格式通常是不同的。如Apple Inc有时是苹果电脑,Apple Inc. 另外..我不知道如何我可以处理“标题”Python CSV和SUM

我的文件格式是CSV。

company amount 
a 20 
b 10 
A' 30 
bb 20 

我想这样做:

line = readline() if line=='': 
break 
if 'Apple' in line: 
sum(amount) 
+0

您应该发布CSV文件的前几行 – Triptych

回答

0

你将需要地图不管怎样,名称的变化要么通过分别合并每个名称并手动合并,要么先制作一个字典,以识别每个公司使用的所有别名。 if 'Apple' in line:失败很难,因为它无法将不同公司的金额混合在一起。

Company = {"Apple": 1, "Apple Computer": 1, "AAPL": 1, "Apple, Inc": 1, 
      "Apple Vacations": 2, "Applebee's Restaurant": 3 } 

sum[Company[name]] += amount 

编辑2:如果你不知道所有事先的公司名称,那么你可以做的最好的是保持包含在输入文件中的唯一名称的轨道,并决定是否将它们合并后:

Company = {} 
for <name, amount> in file: # pseudo-code for reading and parsing the input 
    if name in Company: 
     Company[name] += amount 
    else: 
     Company[name] = amount 
+0

非常感谢你!文件是这样的:公司,金额苹果,300 Apple.inc,500苹果电脑,1000 aa,750 bb,250 – user976856

+0

,但我不能做清单,因为你已经做了... – user976856

+0

如果你事先不知道所有的名字,那么您需要跟踪输入中包含的每个唯一名称。如果你的输入是Apple 10,Apple 20,Applebees 75,那么你的输出将有2个公司:Apple 30,Applebees 75.你必须决定是否将30和75加在一起作为一个公司(就像苹果公司一样和苹果电脑),或将它们分开成两个不同的公司。 – Dave

2

你的数据不是真正的CSV格式。明显的列不会被逗号,标签,甚至单个空格分开。有时会有多个空格...如果这是一个空格分隔值文件,则每个空格都会指示一个新列。多个空格意味着你每行有两个以上的列。

这个细节很重要,因为CSV文件很容易被csv module解析。但由于这不是真正的CSV文件,我们不能使用csv模块。

假设有总是应该用空格隔开只是两列,最后一列代表数字量(除了第一个标题行):

total=0 
with open('data.csv','r') as f: 
    next(f) # skip the first (header) line 
    for line in f: 
     company,amount=line.rsplit(' ',1) 
     amount=float(amount) 
     if 'Apple' in company: 
      total+=amount 
print(total) 
+0

谢谢sooo多!但Python说“空在字符串”我不知道.. ohh – user976856

+0

我的意思是浮空() – user976856