我有一个固定字段格式的字母数字数据文本文件,但格式因行而异,因此我无法进行固定字段读取。 我逐行阅读,识别记录类型,并根据该记录类型的格式进行切片。以下是$ 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
答案 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
感谢所有评论的人!