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.
中可读和可修改的优势
我创建了一个脚本,以这种格式输出我正在做的工作的时间表:
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.
中可读和可修改的优势