2016-06-26 21 views
1

Поэтому у меня есть текстовый файл (так называемые «Число»), который выглядит следующим образом:Как я могу переписать строку в файле с помощью python?

1 - 2 - 3 - 8 - 5 - 6 
1 - 2 - 3 - 4 - 5 - 6 
1 - 2 - 3 - 4 - 5 - 6 
1 - 2 - 3 - 4 - 5 - 6 

Я хочу заменить число 8 в первой строке с номером 4. Как это сделать?
До сих пор я получил следующее:

File = open('Numbers.txt','r+') 
for line in File: 
    Row = line.split(' - ') 
    FourthValue = Row[3] 
    NewFourthValue = '4' 
    NewLine = line.replace(FourthValue,NewFourthValue) 
    File.write(NewLine) 
    break 
File.close() 

Затем он добавляет новую правильную строку в конец файла, как это:

1 - 2 - 3 - 8 - 5 - 6 
1 - 2 - 3 - 4 - 5 - 6 
1 - 2 - 3 - 4 - 5 - 6 
1 - 2 - 3 - 4 - 5 - 61 - 2 - 3 - 4 - 5 - 6 

Что я могу сделать, чтобы сделать этот новый линия заменит первую строку?

+0

Это должно быть очень похоже, http://stackoverflow.com/questions/39086/search-and-replace-a-line-in-a-file-in-python –

+0

Я хочу, чтобы это было намного проще, чем это , Я всего лишь любительский программист. @ J.J.Hakala – MiniMo

+0

вы просто не можете обработать текстовый файл в режиме чтения/записи. Вы должны прочитать данные, закрыть и снова открыть предыдущий файл в письменной форме и записать новые данные. –

ответ

0

После прочтения первой строки вам необходимо «перемотать» файл, чтобы вы могли перезаписать первую строку.

with open(fname, 'r+') as f: 
    row = f.readline() 
    row = row.replace('8', '4') 
    f.seek(0) 
    f.write(row) 

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

FWIW, мой ответ here обрабатывает более общий случай модификации данных на месте в произвольной позиции в файле.

+0

Спасибо, много! – MiniMo

0

Текстовые файлы являются проблематичными переписать, потому что они часто имеют переменную длину, однако ваш фиксированной длины, так:

fh = open('gash.txt','r+') 

# read the first line 
line = fh.readline() 
row = line.split(' - ') 
fourthValue = row[3] 

newFourthValue = '4' 
newLine = line.replace(fourthValue, newFourthValue) 

На данный момент «текущая позиция файла» находится на старте следующий линии, поэтому мы должны переместить его назад к началу текущей записи

fh.seek(0) 
fh.write(newLine) 

fh.close() 

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

EDIT: В ответ на вопрос «Если я хочу заменить значение в 4-й строке не первой», это заменяет 4 на 8 на четвертой строке.

lineToChange = 4 
fieldToChange = 3 
newValue = '8' 
sep = ' - ' 
lineno = 0 

fh = open('gash.txt','r+') 

while True: 
    # Get the current file position 
    start_pos = fh.tell() 

    # read the next line 
    line = fh.readline() 
    if not line: break   # exit the loop at EOF 

    lineno += 1 

    if lineno == lineToChange: 
     row = line.split(sep) 

     # A different replace mechanism 
     row[fieldToChange] = newValue 
     newLine = sep.join(row) 

     # before writing, we must move the file position 
     fh.seek(start_pos) 
     fh.write(newLine) 

fh.close() 

Обратите внимание это работает только потому, что мы заменяем один символ с другим одного символа. Если бы мы захотели заменить, скажем, 8 на 10, тогда это не сработало бы, потому что теперь длина линии была бы иной, и мы перезаписали бы начало следующей строки.

+0

Большое спасибо. Однако есть ли способ контролировать положение курсора в файле?Так, например, если бы я хотел заменить значение в 4-й строке не первой, могу ли я использовать fh.tell или fh.seek, чтобы помочь мне? @cdarke – MiniMo

+0

Конечно, я отправлю код – cdarke