如何将没有" e"的转换为float一个exponetial数字的字符串表示。

时间:2017-03-06 01:03:28

标签: python string type-conversion

我有一个固定字段格式的字母数字数据文本文件,但格式因行而异,因此我无法进行固定字段读取。 我逐行阅读,识别记录类型,并根据该记录类型的格式进行切片。以下是$ Comments和三条数据记录分为两行的示例。 (顺便说一句,数据线是分开的,因为这是一种格式,可以追溯到旧的" IBM穿孔卡"或者#34; Hollerith"卡,这些卡被限制为80列,最后八列为序列号保留,如果您丢弃卡片,则将它们放入卡片分类器: - )

MOMENT*  3               15              0              1.00297+9
*       .123092         -.984732        -.123092
$ Nodal Forces of Load Set : Force
FORCE*   1               15              0              1.00297+9
*       .123092         -.984732        -.123092
MOMENT*  3               15              0              1.00297+9
*       .123092         -.984732        -.123092

在这里,我遇到了麻烦: Python似乎无法转换指数格式。 考虑倒数第二行的最后一个字段:

In [50]: Card1
Out[50]: 'MOMENT*  3               15              0              1.00297+9'

切片我得到的最后一个字段:

Card1[54:]
Out[49]: '  1.00297+9'

如果我然后剥离空格并将字符串转换为浮点数,我会得到一个"无效的文字,用于float()"。

float(str.strip(Card1[54:]))
Traceback (most recent call last):

  File "<ipython-input-52-64ddef289a29>", line 1, in <module>
    float(str.strip(Card1[54:]))

ValueError: invalid literal for float(): 1.00297+9

显然我们知道如何解释&#34; 1.00297 + 9&#34;,但Python似乎需要一个&#34; E&#34;或者&#34; e&#34;认识到这是科学记数法:

float(str.strip(Card1[54:]).replace("+","E"))
Out[53]: 1002970000.0

我的问题在于负数的负指数。显然,通过转动&#34; -123.45-3&#34;而replace()将使用负指数打破负数。进入&#34; E123.45E3&#34;。

理想情况下,会有一些简单的方法告诉Python只使用数字末尾的+或 - 来识别指数。

我唯一能想到的就是将字符串拼接成部分,如下所示。虽然这很有效,但它并不优雅......必须有更好的方法。

In[56]: String="-1.6486-5"
In[57]: float(String[0:1]+String[1:].replace("-","E-"))
Out[57]: -1.6486e-05

2 个答案:

答案 0 :(得分:1)

我建议使用RegEx替代品 https://docs.python.org/2/library/re.html#re.sub 并匹配为EITHER +/- 例如(开始)(0+位)(正好1位)(+或 - )(1位数) 或者分别用+和 - 分别尝试2次替换

答案 1 :(得分:0)

鉴于这是指数的非标准符号,我不会期望比我想出的更好:(将替换更改为&#34; e&#34;因为那&#39; Python返回的内容。)

In[56]: String="-1.6486-5"
In[57]: float(String[0:1]+String[1:].replace("-","e-"))
Out[57]: -1.6486e-05

感谢所有评论的人!