Python智能搜索加号

Python to search for add numbers intelligently

我创建了一个脚本,以这种格式输出我正在做的工作的时间表:

To:     JOE DOE

Client:     JOE DOE

Case #:     14-M-123        Charge: BREAKING AND ENTERING

----------------------------------------------------------------------------



12-12-12    research                1.2 hrs 89 miles
        Another task 
        yet another task

12-12-13    Conf. w/ magistrate ct          1.8 hrs 88 miles

11-11-11    Yadayada                0.0 hrs 10 miles

是否有一种简单的方法来搜索每个文件,并分别添加小时和英里列?

我假设你会使用正则表达式?

import re
text = file('filename').read()
numbers = re.findall(r'([0-9.]+) hrs ([0-9]+) miles', text)
hours = sum(float(x[0]) for x in numbers)
miles = sum(int(x[1]) for x in numbers)

类似的东西应该有用。

它的作用是搜索您的文本以查找一个数字(可选带小数位)后跟 hrs 和另一个(无小数位)后跟 miles 的实例。

我做了几个假设,例如数字和它们的标签之间以及两列之间恰好有一个 space,并且英里始终是整数而小时不是,但希望您可以根据需要进行调整.

一旦您的文件始终采用相同的格式,拆分就可以正常工作:

with open("in.txt") as f:
    tot_miles = 0
    tot_hrs = 0
    for line in f:
        line = line.rstrip()
        if line.endswith("miles"):
            spl = line.rsplit(None,4)
            h, m = spl[1],spl[3]
            tot_miles += int(m)
            tot_hrs += float(h)
    print("Total hrs = {}\nTotal miles = {}".format(tot_hrs,tot_miles))

Total hrs = 3.0
Total miles = 187

我会反过来问一个不同的问题:你的脚本输出这些时间表,对吗?源数据是否仍然可用?如果是这样,如果您可以使用模板中添加的附加列重新生成时间表,将会更加可靠。正则表达式和其他解析会更困难和耗时,更不用说以后更新脚本时更脆弱了。

每当我编写报告生成脚本时,我都会添加标志以重新生成以前的数据,就好像它是在给定日期 运行 一样。 (这也使测试更容易。)

如果您首先控制了输出数据的脚本,我建议您将其更改为输出 CSV 数据 (https://docs.python.org/2/library/csv.html)。

除了可以被任何其他 Python 程序轻松解析之外,它还为您提供了在 Excel.

中可读和可修改的优势