2015-08-26 2 views
2

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

Файл содержит 9 столбцов, а столбцы 3 и 4 иногда меняются местами. Я пытаюсь написать программу python, которая будет менять значения в столбцах 3 и 4, когда столбец 3> столбец 4. До сих пор это код, который у меня есть, но я не понимаю, как изменить файл (или написать изменения), как только я установил столбец 3 и столбец 4 в их новые значения.

with open('pythonTest.rtf') as x: 
for line in x: 
    columns=line.split() 
    if len(columns)==9: 
     x=columns[3] 
     y=columns[4] 
     if columns[4]>columns[3]: 
      columns[3]=y 
      columns[4]=x 

Любое руководство будет принята с благодарностью. Спасибо, Evan McMahon

+0

Ваш код кажется прекрасным. Можете ли вы дать нам более конкретный пример вашей ошибки? – Andrew

+1

PS Чтобы сделать ваш код более эффективным, я бы предложил установить значения переменных x и y только тогда, когда вы захотите их поменять. – Andrew

+0

Я не уверен, как редактировать «pythonTest.rtf» с новыми значениями для столбцов [3] и столбцов [4]. –

ответ

4

Попробуйте

contents = [] 
with open('pythonTest.rtf') as x: 
    for line in x: 
     columns=line.split('\t') 
     if len(columns) == 9 and columns[4]>columns[3]: 
      columns[4],columns[3] = columns[3],columns[4] 
     contents.append('\t'.join(columns)) 
with open('pythonTest.rtf', 'w') as y: 
    for line in contents: 
     y.write(line) 

Или, если вы хорошо с создания нового файла, вам не нужно хранить его в памяти. Вы также можете перенести первый на новый:

import os 
with open('pythonTest.rtf') as x, open('pythonTest.rtf.tmp', 'w') as y: 
    for line in x: 
     columns=line.split('\t') 
     if len(columns) == 9 and columns[4]>columns[3]: 
      columns[4],columns[3] = columns[3],columns[4] 
     y.write('\t'.join(columns)) 
os.remove('pythonTest.rtf') 
os.rename('pythonTest.rtf.tmp', 'pythonTest.rtf') 
+0

Не было бы более эффективным не переписывать весь файл, а просто заменять измененные строки? – erik

+1

Обычно вы не можете просто заменить строки текстовых файлов, потому что они хранятся на диске последовательно. Изменение линии на более короткую или более длинную невозможно. В этом случае измененные строки имеют одинаковую длину, но использование этого в качестве оптимизации непросто, эти вещи выполняются в ядрах баз данных, а не в сценариях текстового процессора –

Смежные вопросы