我已经创建了一个脚本,它为我以这种格式所做的工作输出时间表:
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是否有一种简单的方法来搜索每个文件,并分别添加小时和英里列?
我假设你会使用正则表达式?
发布于 2015-01-18 16:37:10
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。
我做了几个假设,比如在数字和它们的标签之间,以及在两列之间有一个空格,英里总是整数,而小时不是整数,但希望您可以根据需要进行调整。
发布于 2015-01-18 16:45:03
一旦您的文件始终采用相同的格式,split将正常工作:
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发布于 2015-01-18 16:51:06
我会反过来问一个不同的问题:你的脚本输出这些时间表,对吗?源数据仍然可用吗?如果是这样的话,如果您可以在模板中添加额外的列来重新生成时间表,那么它将更加可靠。正则表达式和其他解析将更加困难和耗时,更不用说将来更新脚本时的易碎性了。
每当我编写报表生成脚本时,我都会添加标志来重新生成以前的数据,就好像它是在给定的日期上运行一样。(这也使测试变得更容易。)
https://stackoverflow.com/questions/28012023
复制相似问题