Текстовые файлы проблематично переписывать, потому что они часто имеют записи переменной длины, однако у вас фиксированная длина, поэтому:
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()
.
РЕДАКТИРОВАТЬ: В ответ на вопрос «Если бы я хотел заменить значение в 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, то это не сработало бы, потому что теперь длина строки была бы другой, и мы перезаписали бы начало следующей строки.
person
cdarke
schedule
26.06.2016