Заменить несколько строк в Jython - PullRequest
0 голосов
/ 06 декабря 2009

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

Помимо этого я также хочу добавить скобку после случайного набора символов.

Это моя программа

file_read=open('<%=odiRef.getOption("READ")%>/EXPORT.XML','r')
file_write=open('<%=odiRef.getOption("READ")%>/EXPORT_1.XML','w')
count_record=file_read.read()
while count_record :
    s=count_record.replace('<Field name="ExeDb"type="java.lang.String"><![CDATA[S]]></Field>','<Field name="ExeDb" type="java.lang.String"><![CDATA[W]]></Field>')
    file_write.write(s)
    t=count_record.replace('<Field name="Txt" type="java.lang.String"><![CDATA[','<Field name="Txt" type="java.lang.String"><![CDATA[TRIM(')
    file_write.write(t)
    count_record=file_read.read()
    print s
file_read.close()
file_write.close()

Как вы можете видеть, когда я пытаюсь выполнить чтение строки, я получаю две строки в конечном файле.

1) Я хочу, чтобы обе команды замены работали, но только с одним файлом.

2) Также есть какой-либо способ чтения и записи в одном файле, я не знаю, почему r + не работал должным образом.

3) Я также хочу изменить строку

t=count_record.replace('<Field name="Txt" type="java.lang.String"><![CDATA[','<Field name="Txt" type="java.lang.String"><![CDATA[TRIM(')

с чем-то вроде

t=count_record.replace('<Field name="Txt" type="java.lang.String"><![CDATA[','<Field name="Txt" type="java.lang.String"><![CDATA[TRIM($$$) ')

где $$$ представляет слова или символы, присутствующие в исходном файле.

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

Большое спасибо за вашу помощь.

1 Ответ

3 голосов
/ 06 декабря 2009

Это неправильно на многих уровнях - вы не можете одновременно читать и писать из одного и того же файла, команда file.read () считывает все содержимое, и вам не нужно сохранять после каждой замены. Примерно так:

file = open('myfile', 'r+')
contents = file.read()
file.seek(0) # rewind    
file.write(contents.replace('something', 'else').replace('and this too', 'replaced'))

Код комментария искажен, в том числе и здесь ... Вам необходимо заменить его с помощью регулярных выражений. Смотрите описание модуля "re", вам в основном нужно что-то вроде этого:

import re
contents = re.sub(
  '<Field name="Txt" type="java.lang.String"><!\[CDATA\[TRIM\(([^)]*)\]\]></Field>', 
  '<Field name="Txt" type="java.lang.String"><![CDATA[TRIM(\1)]]></Field>', 
  contents
)
...