0

我有这个工作:

address = []

for row in ws.iter_rows(row_offset=4,column_offset=3):
    if len(row) > 0:
        cell = row[2]
        if cell.internal_value is not None: 
           *something here, append appropriate cell values to address*

print address
return address

这将成功地通过 Excel 电子表格中的一列并获取每个非空单元格。但是,在星号处,我不确定如何通过输出并仅提取数字。我知道读起来可能很奇怪,但我需要的数字是“1.0、2.0、3.0、4.0 等”。当我在不同的电子表格中阅读时,所有其他部分以及实际数字本身可能会发生变化,但它们将采用相同的格式。

所以我需要知道的是我将如何通过这个列表并摆脱所有不是十进制数的东西,并理想地将这些小数转换为整数。

我也确信有一个很好的方法可以通过列表理解来做到这一点,但我只在 python 中编程了一周,所以我不确定如何真正做到这一点。

抱歉,如果这令人困惑,并提前感谢您的任何帮助。

4

4 回答 4

1

在 Python 中没有检查字符串是否为浮点数的好方法,但这应该就足够了。

>>> def is_float(n):
...     try:
...         float(n)
...         return True
...     except ValueError:
...         return False
>>> x = ["garbage", "1.0", "trash", "2.0"]
>>> [i for i in x if is_float(i)]
['1.0', '2.0']
于 2012-06-22T15:35:37.113 回答
1

你可以这样做:

int_values = [int(v) for v in cell.internal_values if type(v) == float]

或者,我注意到这些值被一个项目分隔,所以你可能也想要这个:

int_values = [int(cell.internal_values[i]) for i in xrange(1, len(cell.internal_values), 2)]

(您可能需要使用 range( 1 , ...) 因为第一个应该被丢弃,模式从索引 1 开始)。

于 2012-06-22T15:37:41.417 回答
0

所以我需要知道的是我将如何通过这个列表并摆脱所有不是十进制数的东西,并理想地将这些小数转换为整数。

由于您的列表包含浮点数而不是浮点数的字符串:

only_floats = [i for i in big_list if isinstance(float,i)]
于 2012-06-22T15:42:31.360 回答
0

我将此答案添加为“第一部分”,以防将来有人需要第一部分的解决方案。问题的第二部分(将 float 列表转换为 int)在接受的答案中。

为了撕掉所有的花车,原来的算法被修改为:

addr = []

for row in ws.iter_rows(row_offset=4,column_offset=3):
    if row:
        cell = row[2]
        try:
            addr.append(float(cell.internal_value))
        except ValueError:
            pass
        except TypeError:
            pass

address = [int(v) for v in addr if type(v) == float]

最后一行是接受答案的代码。算法修改其实是这里的别人的作品,但是帖子被删了!所以谢谢你的神秘用户,我希望我能在这里相信你。

于 2012-06-22T15:49:46.063 回答