Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python以智能方式搜索添加数字_Python_Regex_File Io - Fatal编程技术网

Python以智能方式搜索添加数字

Python以智能方式搜索添加数字,python,regex,file-io,Python,Regex,File Io,我创建了一个脚本,该脚本以以下格式输出我正在执行的工作的时间表: To: JOE DOE Client: JOE DOE Case #: 14-M-123 Charge: BREAKING AND ENTERING ---------------------------------------------------------------------------- 12-12-12 research 1.2

我创建了一个脚本,该脚本以以下格式输出我正在执行的工作的时间表:

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
是否有一种简单的方法来搜索每个文件,并分别添加hrs和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

我做了一些假设,比如数字和标签之间以及两列之间正好有一个空格,英里总是整数,小时不是,但希望您可以根据需要进行调整

这样的办法应该行得通

它所做的是在文本中搜索一个数字的实例(可以选择带小数位),后跟
hrs
,另一个(无小数位)后跟
miles


我做了一些假设,例如数字和标签之间以及两列之间正好有一个空格,英里总是整数,小时不是整数,但希望您可以根据需要进行调整。

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

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

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

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数据()


除了可以被任何其他Python程序简单地解析之外,它还提供了在Excel中可读和可修改的优势。

如果您首先可以控制输出数据的脚本,我建议您更改它,以便它输出CSV数据()


除了可以被任何其他Python程序轻松解析之外,它还提供了在Excel中可读和可修改的优势。

如果
if
可以是
if line.endswith('miles')
就好像它是空的,不能以它结尾:)另外,我还可以用另一种方式拆分
line.rsplit(None,4)
然后取第1个和第3个结果-没什么大不了的,但它使它更显式和健壮,因为负索引总是会返回一些东西,即使它不正确,而直接索引可能会引发
索引器
指示某种形式的格式错误。@JonClements,True,谢谢。我已经开始用不同的方法来做了,if行确实是多余的。
if
可以是
if-line.endswith('miles')
就好像它是空的,不能以它结尾:)另外,我也会以另一种方式拆分
line.rsplit(None,4)
然后取第1个和第3个结果-没什么大不了的,但它使它更显式和健壮,因为负索引总是会返回一些东西,即使它不正确,而直接索引可能会引发
索引器
指示某种形式的格式错误。@JonClements,True,谢谢。我已经开始用不同的方式来做了,如果这条线确实是多余的。我为超链接道歉,我不知道这不是犹太教。谢谢你的编辑。我为超链接道歉,我不知道那不是犹太教。谢谢你的编辑。我想这是最适合我的。我很确定有一种方法可以将用户输入的数字转换成十进制(54-->54.0),所以这可能就是我要做的。
float(54)==54.0
,但我不确定您为什么需要它。也许我解释得不好?因此,如果用户输入小时作为整数,我可以保证找到它们。正则表达式不必匹配
,因此它将匹配
54
,就像匹配
54.0
一样。如果你想让英里数也可能是小数,你也可以在那里加一个点(并且在总和中也加一个浮点数)。我想这对我来说是最合适的。我很确定有一种方法可以将用户输入的数字转换成十进制(54-->54.0),所以这可能就是我要做的。
float(54)==54.0
,但我不确定您为什么需要它。也许我解释得不好?因此,如果用户输入小时作为整数,我可以保证找到它们。正则表达式不必匹配
,因此它将匹配
54
,就像匹配
54.0
一样。如果您希望英里数也可能是小数,您还可以在其中添加一个点(并在总和中使其成为浮点)。