我不确定是否有使用 NumPy 的解决方案,如果列数发生变化,则分别引发错误loadtxt
和genfromtxt
警告,因此您可能必须编写自己的方法。
编辑:对以下内容进行了轻微编辑以反映 DSM 的评论。
您可以使用内置csv
模块:
import csv
arr = []
with open('test.txt', 'r') as fh:
reader = csv.reader(fh)
for row in reader:
if row:
arr.extend(row)
csv 方法的优点是它会去除换行符,如果您只是使用fileobj = open(...)
and读取文件,情况并非如此for line in fileobj
。
此时你应该有
>>> arr
['883825.00', '373395.00', '0.00', '20,080.84', '2012500.00', '#EANF#', '121449.
39', '0.00', '0.00', '0.00', '38,849.10', '0.00', '#EANF#', '0.00', '0.00', '0.0
0', '0.00', '83,167.42', '1640625.00', '#EANF#', '0.00', '#EANF#', '#EANF#', '#E
ANF#', '#EANF#', '#EANF#', '#EANF#', '#EANF#', '-1,202,600.00', '-0.00', '#EANF#
', '2267168', '0.00', '#EANF#', '-173,710.66', '-125.60', '#EANF#', '17,459.68',
'#EANF#.']
然后,您必须转换为浮点数并将#EANF#
值替换为numpy.NaN
. 我们还必须注意某些值中的逗号。逗号很容易处理
float(str(float_string).replace(',', ''))
对于这些#EANF#
值,我们可以检查一个项目是否以 this 开头(不等于 this,因为列表中的最后一项有一个尾随.
)。将这两个转换组合成一个函数convert
并用列表理解包装我们有:
import numpy
def convert(v):
try:
return float(v)
except ValueError:
if v.startswith('#EANF#'):
return numpy.NaN
else:
return float(str(v).replace(',', ''))
arr = numpy.asarray([convert(a) for a in arr])
该函数convert
可以概括为采用第二个可选参数,该参数定义应映射到的值numpy.NaN
。
这个的最终结果是
>>> arr
[883825.0, 373395.0, 0.0, 20080.84, 2012500.0, nan, 121449.39, 0.0, 0.0, 0.0, 38
849.1, 0.0, nan, 0.0, 0.0, 0.0, 0.0, 83167.42, 1640625.0, nan, 0.0, nan, nan, na
n, nan, nan, nan, nan, -1202600.0, -0.0, nan, 2267168.0, 0.0, nan, -173710.66, -
125.6, nan, 17459.68, nan]
注意:此答案假设您对结果是一维列表感到满意。如果您想要结果的不同形状,您应该在问题中这么说。