数组中不同文件的总和

时间:2016-12-01 19:34:55

标签: python python-2.7

我有一个列表

paths = ['1.xlsx', '2.xlsx', '3.xlsx', '4.xlsx', '5.xlsx', '6.xlsx', '7.xlsx', '8.xlsx', '9.xlsx']

具有文件名

和函数sum_invoice(path)它返回指定文件中的sum或total

import glob
import pandas as pd
from pandas.io.excel import ExcelFile
def sum_invoice(path):
    xl = ExcelFile(path)
    for sheet in xl.sheet_names:
        df = xl.parse(sheet)
        xy=df['INVOICE']
        nn=pd.to_numeric(xy, 'coerce')
        nn = nn.reset_index(drop=True)
        nn.fillna(0)
        total=nn.loc[nn.last_valid_index()]
        return total
#create list of files named paths
paths =[]
for path in glob.iglob('*.xlsx'):
    paths.append(path)
    print(path)


sum_all = sum(sum_invoice(path) for paths in paths)
print sum_all

如何使用该函数迭代这些文件,并总结所有文件返回的总数。

2 个答案:

答案 0 :(得分:3)

标准库中已有sum()函数。您应该将您的功能重命名为sum_path()或类似。

然后,您可以使用generator expression sum()作为:

来实现您的目标
sum(sum_path(p) for p in paths)

答案 1 :(得分:2)

您可以像下面这样实现,但首先需要将sum函数重命名为my_sum(因为sum()是一个您不应该覆盖的内置函数) :

sum_all = sum(my_sum(path) for path in paths)

修改

现在,您的自定义和功能已重命名为sum_invoice,您可以使用:

sum_all = sum(sum_invoice(path) for path in paths)

以上行使用生成器表达式,有关此主题的更多详细信息,您可以查看此PEP 289 -- Generator Expressions。 for循环的简单解决方案如下:

sum_all = 0

for path in paths:
    s = sum_invoice(path)
    sum_all += s