Python:读取混合浮点和字符串csv文件

Python:读取混合浮点和字符串csv文件,python,arrays,floating-point,Python,Arrays,Floating Point,我有一个混合浮动的csv文件,一个字符串和一个整数,是FORTRAN文件的格式化输出。 典型的线条如下所示: 507.930 , 24.4097 , 1.0253E-04, O III , 4 我想在不修改浮点小数点的情况下阅读它,并检查每行中的第一个条目是否是另一个列表 使用loadtxt和genfromtxt会导致数字位置从3(或4)更改为12 我应该如何解决这个问题?如果您需要精确地保持精度,则需要使用。否则,可能会绊倒你 不过,很有可能您并不真正需要这种

我有一个混合浮动的csv文件,一个字符串和一个整数,是FORTRAN文件的格式化输出。 典型的线条如下所示:

 507.930    ,  24.4097    ,   1.0253E-04, O  III   ,    4
我想在不修改浮点小数点的情况下阅读它,并检查每行中的第一个条目是否是另一个列表

使用loadtxt和genfromtxt会导致数字位置从3(或4)更改为12


我应该如何解决这个问题?

如果您需要精确地保持精度,则需要使用。否则,可能会绊倒你

不过,很有可能您并不真正需要这种精度——只要确保您不比较
float
s是否完全相等,但始终允许使用模糊因子,并将输出格式化为有限数量的有效数字:

# instead of if float1==float2:, use this:
if abs(float1-float2) <= sys.float_info.epsilon: 
    print "equal"
#如果float1==float2:,请使用以下命令:

如果abs(float1-float2)
loadtxt
似乎采用了一个
转换器
参数,如下所示:

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


Decimal
应能以您所需的任何精度工作,尽管如果您使用
Decimal
进行重要的数字运算,它将比使用
float
慢得多。但是,我假设您只是希望在不损失任何精度的情况下转换数据,所以这应该是很好的。

我完成了一些字符串处理代码的编写。虽然不优雅,但它可以工作:

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')

实际上,在仔细查看
numpy.loadtxt
之后,这可能不起作用,因为显然
转换器
函数需要返回浮点值。当然,您可以自己编写一个函数,试图保持输入的精度,但我认为转换为浮点要求将使这一点难以解决。