2016-07-26 1 views
0

Я использую следующий код, чтобы загрузить файл на сервер с помощью FTP после его редактирования:В месте замены текста в файле в Python

import fileinput 

file = open('example.php','rb+') 

for line in fileinput.input('example.php'): 
    if 'Original' in line : 
     file.write(line.replace('Original', 'Replacement')) 

file.close()  

Существует одна вещь, вместо того, чтобы заменить текст в его оригинальное место, код добавляет замененный текст в конце, а текст в оригинальном месте не изменяется.

Кроме того, вместо всего лишь замененного текста он печатает всю строку. Может ли кто-нибудь рассказать мне, как разрешить эти две ошибки?

+0

Поскольку вы используете fileinput, почему вы не просто 'fileinput.input ('example.php', inplace = True)'? –

+0

А как насчет других линий? –

+0

@PadraicCunningham Это позволило сделать ошибку. Есть ли другой способ сделать это, помимо использования 'fileinput' вообще? –

ответ

0

1) Код добавляет замененный текст в конце, а текст в оригинальном месте не изменяется.

Вы не можете заменить его в теле файла, так как вы открываете его с помощью сигнала +. Таким образом, он будет добавлен в конец файла.

file = open('example.php','rb+') 

Но это работает только, если вы хотите добавить в конце документа.

обход это можно использовать seek(), чтобы перейти к определенной строке и заменить ее. Или создайте 2 файла: input_file и output_file.


2) Кроме того, вместо того, чтобы просто заменяемого текста, он выводит всю строку.

Это потому, что вы используете:

file.write(line.replace('Original', 'Replacement')) 

свободный Код:

Я разделены на 2 файлов, в InputFile и файл_вывода.

Сначала он откроет ifile и сохранит все строки в списке под названием lines.

Во-вторых, он прочитает все эти строки, и если присутствует 'Original', это будет replace.

После замены он сэкономит ofile.

ifile = 'example.php' 
ofile = 'example_edited.php' 

with open(ifile, 'rb') as f: 
    lines = f.readlines() 

with open(ofile, 'wb') as g: 
    for line in lines: 
     if 'Original' in line: 
      g.write(line.replace('Original', 'Replacement')) 

Тогда, если вы хотите, вы можете os.remove() неофициальный отредактированный файл с:


Дополнительная информация:Tutorials Point: Python Files I/O

+0

Спасибо за ответ dot.Py, но есть ли способ сделать это без создания двух файлов? –

+2

@SanJeetSingh использовать ifile в обоих случаях. Сначала он будет читаться в строках, затем он откроет файл example.php, очистит его, а затем вы запишете строки обратно, оставив вам отредактированный файл, но возможность вырезанного файла, если что-то пойдет не так. –

-1

Замена материала в файле только хорошо работает, если оригинал и замена имеют одинаковый размер (в байтах), то вы можете сделать

with open('example.php','rb+') as f: 
    pos=f.tell() 
    line=f.readline() 
    if b'Original' in line: 
     f.seek(pos) 
     f.write(line.replace(b'Original',b'Replacement')) 

(В этом случае b'Original' и b'Replacement' не имеют одинаковый размер так что ваш файл будет выглядеть смешно после этого)

Edit:

Если оригинал и замена не одинакового размера, существует различные возможности, такие как надстройка g байт, чтобы заполнить отверстие или перемещать все после строки.

+0

'Замена материала в файле работает только в том случае, если оригинал и замена имеют одинаковый размер (в байтах)'. Можете ли вы опубликовать источник этой информации? –

+0

Я только что попробовал 's = 'abc'; t = s.replace ('a', 'aaa'); print t', и он отлично работает. –

+0

Для того, чтобы добавлять и удалять элементы, нет никаких проблем, поскольку новый создается в любом случае, но если вы хотите добавить или удалить некоторые байты в файле, вам нужно переместить все после него, что означает чтение и запись больших частей. – janbrohl

0

Вторая ошибка в том, как работает метод replace().

Он возвращает целую строку ввода с заменой только указанной подстроки. См. Пример here.

Чтобы записать в определенное место в файле, вы должны сначала указать seek() в нужное положение.

Я думаю, что эта проблема была задана раньше в нескольких местах, я бы сделал быстрый поиск StackOverflow.

Возможно, this поможет?