从python

时间:2017-03-14 14:21:22

标签: python

我试图从文本文件中提取单位信息。此功能始终返回' m'无论文件中的实际单位如何。我做错了什么?

def get_seba_unit(file):
    with open(file) as f:
        unit = ''
        lines = f.readlines()
        if lines[10].find('m'):
            unit = 'm'
        elif lines[10].find('cm'):
            unit = 'cm'
        elif lines[10].find('°C'):
            unit = '°C'
        print('found Unit: ' + unit + ' for sensor: ' + file)
        return(unit)

2 个答案:

答案 0 :(得分:1)

这不符合你的想法:

if lines[10].find('m'):

find会返回您要查找的内容的索引,如果找不到,则返回-1。因此,除非m是该行的第一个字符(索引0),否则您的条件将始终为True(在Python中,非零数字是真实的)

您可能想尝试if 'm' in line[10]而不是

另外,请在cm之前检查m,否则您永远不会找到cm

答案 1 :(得分:0)

如果您正在寻找的是从数据中提取单位的方法,我会使用一些简单的正则表达式,如下所示:

import io
import re
from collections import defaultdict

data = io.StringIO("""

1cm

2m

3°C

1cm 10cm

2m 20m

3°C           30°C

""")


def get_seba_unit(file):
    floating_point_regex = "([-+]?\d*\.\d+|\d+)"
    content = file.read()
    res = defaultdict(set)

    for suffix in ['cm', 'm', '°C']:
        p = re.compile(floating_point_regex + suffix)
        matches = p.findall(content)
        for m in matches:
            res[suffix].add(m)

    return dict(res)

print(get_seba_unit(data))

你会得到像这样的输出:

{'cm': {'1', '10'}, '°C': {'3', '30'}, 'm': {'2', '20'}}

当然,上面的代码只是假设你的单位是浮点单位,但主要的想法是使用正则表达式攻击这个问题。