将计算值附加到每一行

时间:2014-11-25 16:35:06

标签: python python-3.x

我仍然是Python的新手。我有一个带有大量数据的大型制表符分隔文本文件,我正在尝试从第18列和第22列获取值并进行一个名为“rate”的计算,然后我想将其附加到文本中每行的末尾文件。

我似乎无法尝试这项工作。我的尝试如下所示,但我总是会收到一个错误(在我的代码下面显示的ouptut)。

with open(fieldDataFile, 'rw') as f:
    lines = f.readlines()[1:]
    for i, line in enumerate(lines):
        ratecalc = (float(lines[i+1][21]) - float(lines[i][21]))/(float(lines[i+1][17]) - float(lines[i][17]))
        line[i] = line[i].strip() + str(ratecalc)    
    for line in lines:
        f.write(line)   

输出:

ValueError: could not convert string to float: n

我在第18或第22列中找不到任何字母,所以我不知道这个转换错误来自哪里。即使代码有效,我也不确定它是否会实际附加值。

非常感谢任何帮助!谢谢!

编辑:我尝试使用以下方式打印出我需要的行:

print fieldDataFile
with open(fieldDataFile, 'rw') as f:
lines = f.readlines()[1:]
for i, line in enumerate(lines):

    print (lines[i][21])
    print (lines[i+1][21])
    print (lines[i][17])
    print (lines[i+1][17])

结果:

n
n
i
i

虽然根据文件中的数据,它应该是:

1452.1
1509.5
0
5.52

不幸的是,我无法共享标题或更多信息,因为该文件是专有的,所以我知道这很难提供帮助。但是,我没有注意到它有什么特别的错误,因为它有任何其他文件的标题和每个标题下面的数字列以制表符分隔格式。

4 个答案:

答案 0 :(得分:0)

我不能把它作为评论,但这里有一条建议来帮助排除故障。

读取较小的数据并在您感兴趣的列/字段上使用type(),以确保没有空格或其他隐藏字符被识别为字符串。如果是,请仔细查看数据。如果你可以张贴一小部分,我相信这里的人会很快帮忙。

答案 1 :(得分:0)

根据输出建议,你可能已经选择了一个角色" n"在你的文本文件中。尝试打印出ratecalc,看看你得到了什么。从那里开始。

答案 2 :(得分:0)

  1. 根据建议,尝试打印ratecalc
  2. 的组件
  3. 使用print进行调试时,会删除float()并查看打印的值
  4. 使用i+1,在您的最后一行,您的循环会尝试阅读lines[i+1](由于您已经在最后一行,因此不存在)
  5. 此外,n可能是某种在您的文件中存在错误的剩余换行符(\n
  6. 您还可以执行类似于Get Line Number of certain phrase in file Python的接受答案的查找:

    lookup = 'n'
    
    with open(filename) as myFile:
        for num, line in enumerate(myFile, 1):
            if lookup in line:
                print 'found at line:', num
    

答案 3 :(得分:0)

原来这是分裂线的问题。出于某种原因,我必须指定制表符分隔符,并且它有效。谢谢你的帮助!

with open(fieldDataFile, 'r') as f:
    lines = f.readlines()[1:]
    for i in range(len(lines[:-1])):
        status=0
        try:
            curralt= float(lines[i].split('\t')[21])
            currtime= float(lines[i].split('\t')[17])
            nextalt= float(lines[i+1].split('\t')[21])
            nexttime= float(lines[i+1].split('\t')[17])