2014-11-25 3 views
-1

Я все еще очень новичок в Python. У меня большой текстовый файл с разделителями табуляции с большим количеством данных, и я пытаюсь получить значения из столбцов 18 и 22 и сделать вычисление под названием «rate», которое я затем хочу добавить в конец каждой строки в тексте файл.Добавление расчетного значения в каждую строку

Похоже, я не пытаюсь работать. Моя попытка показана ниже, но я всегда получаю сообщение об ошибке (которое находится в окне, показанном ниже моего кода).

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, так что я понятия не имею, где эта ошибка преобразования происходит от. Даже если код работает, я не уверен, добавит ли это значение.

Любая помощь очень ценится! Спасибо!

EDIT: Я пытался распечатывания строки мне нужно с помощью:

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 

К сожалению, я не могу обмениваться заголовками или дополнительной информацией, так как файл является собственностью, поэтому я знаю, что это затрудняет Помогите. Тем не менее, я не замечаю ничего особенного в этом, так как у него есть заголовки, как любой другой файл и столбцы цифр ниже каждого в формате с разделителями табуляции.

+0

вы пробовали распечатывания 'строки [я + 1] [21],' линии [я] [21] ',' линии [+ 1] [17] и 'линии [я] [17] '? Это первый шаг в отладке. Он скажет вам, правильны ли предположения, которые вы делаете о данных. Согласно сообщению об ошибке, одно из них имеет значение «n». –

+0

Очевидно, что весь столбец 21 имеет «n», и весь столбец 18 имеет «i», что не имеет смысла, потому что это определенно не то, что в моем файле. Мне нужно будет расследовать, так как мне не разрешено размещать здесь свой текстовый файл. – AJS

+0

Вы также можете распечатать значение 'line', которое поможет вам решить, читаете ли вы правильный файл. –

ответ

0

Я не могу назвать это комментарием, но вот совет, который поможет устранить неполадки.

Прочитайте меньшую часть своих данных и используйте тип() в своей колонке/области интереса, чтобы убедиться, что нет пробелов или других скрытых символов, которые распознаются как строки. Если да, внимательно ознакомьтесь с данными. Если вы можете опубликовать небольшой кусочек, я уверен, что люди тут быстро помогут.

+0

По-видимому, весь столбец 21 имеет «n», и весь столбец 18 имеет «i», что не имеет смысла, потому что это определенно не то, что в моем файле. Мне нужно будет расследовать, так как мне не разрешено размещать здесь свой текстовый файл. Мне придется продолжать изучать его. – AJS

0

Как вы можете предположить, вы, вероятно, подобрали символ «n» в вашем текстовом файле. Попробуйте распечатать ratecalc и посмотреть, что вы получаете. И иди оттуда.

0
  1. Как было предложено, попытайтесь распечатать ее компоненты ratecalc
  2. При отладке с print падение float() с и увидеть, что значения, напечатанные в
  3. Используя i+1, на последней строке ваш цикл пытается читать lines[i+1] (который не существует, так как вы уже на последнюю строке)
  4. Кроме того, n может быть каким-то остаточный символ новой строки (\n), который является блуждающим в файле

Вы также могли бы сделать поиск, аналогичный принятому ответу 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 
+0

Хорошо, я попытаюсь найти значения «n» и «i» с этим. Сам файл полон чисел, поэтому я не знаю, где он находит эти строки. EDIT: по-видимому, «n» находится в каждой строке с использованием вышеуказанного кода. Я так смущен, они все цифры ... – AJS

+0

Пожалуйста, откройте 'fieldDataFile' в текстовом редакторе и вставьте первые 3 строки в свой вопрос –

+0

К сожалению, мне не разрешено публиковать его здесь, откуда я работаю. – AJS

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]) 
Смежные вопросы