2013-04-24 2 views
0

Я читаю текстовый файл и ищут данные по строкам, основываясь на некоторых условиях, изменяя некоторые значения в строке и записывая их обратно в другой файл. Новый файл не должен содержать старую строку. Я пробовал следующее, но это не сработало. Я думаю, что мне не хватает очень простой вещи.Заменить строку новой строкой в ​​Python

Решение: В C++ мы можем увеличить строку, но в Python. Я не уверен, как это достичь. Итак, сейчас я пишу старую строку, чем новую. Но в новом файле я хочу только новую строку.

Пример:

M0 38 A 19 40 DATA2 L=4e-08 W=3e-07 nf=1 m=1 $X=170 $Y=140 $D=8 
M0 VBN A 19 40 TEMP2 L=4e-08 W=3e-07 nf=1 m=1 $X=170 $Y=140 $D=8 

Код, который я попробовал следующий:

def parsefile(): 
    fp = open("File1", "rb+") 
    update_file = "File1" + "_update" 
    fp_latest = open(update_file, "wb+") 
    for line in fp: 
     if line.find("DATA1") == -1: 
      fp_latest.write(line) 
     if line.find("DATA1") != -1: 
      line = line.split() 
      pin_name = find_pin_order(line[1]) 
      update_line = "DATA " + line[1] + " " + pin_name 
      fp_latest.write(update_line) 
      line = ''.join(line) 
     if line.find("DATA2") != -1: 
      line_data = line.split() 
      line_data[1] = "TEMP2" 
      line_data =' '.join(line_data) 
      fp_latest.write(line_data) 
     if line.find("DATA3") != -1: 
      line_data = line.split() 
      line_data[1] = "TEMP3" 
      line_data =' '.join(line_data) 
      fp_latest.write(line_data) 

fp_latest.close() 
fp.close() 
+0

Стоит отметить, что при работе с файлами в Python, то лучше использовать [ 'with' оператор] (http://www.youtube.com/watch?v=lRaKmobSXF4). –

+9

Аналогично, если вы хотите проверить, что что-то не в строке, лучший способ сделать это - использовать 'if not 'string" in line', а не использовать 'line.find()' :. Здесь также присутствуют симптомы копирования/вставки - вы делаете то же самое с несколькими разными переменными несколько раз - вы должны извлечь эту функциональность из цикла и/или функции. –

+1

'if line.find (« DAT1 »)! = -1:' - Вы действительно имели в виду, что это «DAT1», а не «DATA1»? и почему бы просто не использовать 'else:' вместо этого? – Vicky

ответ

1

Основная проблема текущего кода является то, что ваш первый if блок, который проверяет "DATA1" и пишет line out, если он не найден, запускается, когда "DATA2" или "DATA3" присутствует. Так как у них есть свои собственные блоки, линия заканчивается дублированием в двух разных формах.

Вот минимальная модификация вашего цикла, который должен работать:

for line in fp: 
    if line.find("DATA1") != -1: 
     data = line.split() 
     pin_name = find_pin_order(data[1]) 
     line = "DATA " + data[1] + " " + pin_name 
    if line.find("DATA2") != -1: 
     data = line.split() 
     data[1] = "TEMP2" 
     line =' '.join(data) 
    if line.find("DATA3") != -1: 
     data = line.split() 
     data[1] = "TEMP3" 
     line =' '.join(data) 

    fp_latest.write(line) 

Это гарантирует, что только одна строка пишется, потому что есть только один write() вызов в коде. Специальные случаи просто изменяют строку, которая должна быть записана. Я не уверен, что понимаю изменения, которые вы хотели бы сделать в этих случаях, так что там может быть больше ошибок.

Одна вещь, которая могла бы помочь сделать второй и третий if заявлениям в elif заявлениях. Это обеспечило бы выполнение только одного из них (хотя, если вы знаете, что ваш файл никогда не будет иметь несколько записей DATA в одной строке, это может быть необязательно).

1

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

with open("myFile.txt", "r+") as f: 
    offset = 0 
    lines = f.readlines() 
    for oldLine in lines: 
      ... calculate the new line value ... 
      f.seek(offset) 
      f.write(newLine) 
      offset += len(newLine) 
      f.seek(offset) 
Смежные вопросы