Python:读取mixed float和string csv文件

时间:2013-07-01 13:17:45

标签: python arrays floating-point

我有一个带有混合浮点数的csv文件,一个字符串和一个整数,来自FORTRAN文件的格式化输出。 典型的行看起来像:

 507.930    ,  24.4097    ,   1.0253E-04, O  III   ,    4

我想在保持浮动小数位未修改的同时读取它,并检查每行中的第一个条目是否存在是另一个列表。

使用loadtxt和genfromtxt会导致化学位置从3(或4)变为12。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

如果您需要精确保持精确度,则需要使用decimal module。否则,issues with floating point arithmetic limitations可能会让你失望。

但是,有可能你并不真正需要那么精确 - 只要确保你没有确切地比较float s的相等性,但总是允许一个软糖因子,并将输出格式化为有限的数字有效数字:

# instead of if float1==float2:, use this:
if abs(float1-float2) <= sys.float_info.epsilon: 
    print "equal"

答案 1 :(得分:1)

loadtxt似乎采用converters参数,例如:

from decimal import Decimal
numpy.loadtxt(..., converters={0: Decimal,
                               1: Decimal,
                               2: Decimal})

应该工作。

Decimal应该以您需要的精度工作,但如果您使用Decimal进行大量数字运算,则会比使用float慢得多。但是,我假设您只是想要在不失去任何精度的情况下转换数据,所以这应该没问题。

答案 2 :(得分:0)

我写完了一些字符串处理代码。不优雅,但它有效:

stuff=loadtxt(fname1,skiprows=35,dtype="f10,f10,e10,S10,i1",delimiter=','‌​) 
stuff2 = loadtxt('keylines.txt') # a list of the reference values
... # open file for writing etc
for i in range(0,len(stuff)): 
    bb=round(float(stuff[i][0]),3) # gets number back to correct decimal format
    cc=round(float(stuff[i][1]),5) # ditto
    dd=float(stuff[i][2]) 
    ee=stuff[i][3].replace(" ","")  # gets rid of extra FORTRAN spaes
    ff=int(stuff[i][4]) 
    for item in stuff2: 
        if bb == item: 
        fn.write( str(bb)+','+str("%1.5f" % cc)+','+str("%1.4e" % dd)+','+ee+','+str(ff)+'\n')