2015-12-21 2 views
0

У меня есть xml-файл, где я хочу добавить некоторые данные. Я не хочу испортить инструменты XML в python, поэтому я изменил свой входной XML-файл, чтобы мне просто нужно было заменить некоторые области текста. Вот мой сценарий.Python XML или txt найти и заменить

f1 = open('import.xml', 'r') 
f2 = open('output.xml', 'w') 
InvoiceNo = raw_input('InvoiceNo: ') 
Name = raw_input('Name: ') 
Country = raw_input('Country (Bsp.: US): ') 
GrossWeight = raw_input('GrossWeight (Bsp.: 0.7): ') 
for line in f1: 
    f2.replace('<CommercialReferenceNumber></CommercialReferenceNumber>',  '<CommercialReferenceNumber>%s/%s</CommercialReferenceNumber>' % (Name,  InvoiceNo)) 
    f2.write(line.replace('<DestinationCountry></DestinationCountry>', '<DestinationCountry>%s</DestinationCountry>' % (Country))) 
    f2.write(line.replace('<TotalGrossMassMeasure></TotalGrossMassMeasure>', '<TotalGrossMassMeasure>%s</TotalGrossMassMeasure>' % (GrossWeight))) 
    f2.write(line.replace('<LocalReferenceNumber></LocalReferenceNumber>', '<LocalReferenceNumber>%s</LocalReferenceNumber>' % (InvoiceNo))) 

f1.close() 
f2.close() 

Проблема в том, что если я это сделаю, я получаю каждую строку 4 раза в output.xml.

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

благодаря

ответ

0
for line in f1: 

    f2.replace('<CommercialReferenceNumber></CommercialReferenceNumber>',  '<CommercialReferenceNumber>%s/%s</CommercialReferenceNumber>' % (Name,  InvoiceNo)) 
    line = line.replace('<DestinationCountry></DestinationCountry>', '<DestinationCountry>%s</DestinationCountry>' % (Country)) 
    line = line.replace('<TotalGrossMassMeasure></TotalGrossMassMeasure>', '<TotalGrossMassMeasure>%s</TotalGrossMassMeasure>' % (GrossWeight))   
    line = line.replace('<LocalReferenceNumber></LocalReferenceNumber>', '<LocalReferenceNumber>%s</LocalReferenceNumber>' % (InvoiceNo))   


    f2.write(line) 
+0

«f2.replace» выглядит странно, возможно, вам нужно это сделать, используя переменную строки –

4

Не используйте заменить XML. Изменение XML не так уж трудно:

import xml.etree.ElementTree as ET 

data = ET.parse('input.xml') 
data.find('.//CommercialReferenceNumber').text = '%s/%s' % (Name, InvoiceNo) 
data.find('.//DestinationCountry').text = Country 
data.find('.//TotalGrossMassMeasure').text = GrossWeight 
data.find('.//LocalReferenceNumber').text = InvoiceNo 
data.write('output.xml') 
0

Попробуйте это:

f1 = open('import.xml', 'r') 
f2 = open('output.xml', 'w') 
InvoiceNo = raw_input('InvoiceNo: ') 
Name = raw_input('Name: ') 
Country = raw_input('Country (Bsp.: US): ') 
GrossWeight = raw_input('GrossWeight (Bsp.: 0.7): ') 
data = f1.read() # read whole file 

data = data.replace('<CommercialReferenceNumber></CommercialReferenceNumber>',  '<CommercialReferenceNumber>%s/%s</CommercialReferenceNumber>' % (Name,  InvoiceNo)) 
data = data.replace('<DestinationCountry></DestinationCountry>', '<DestinationCountry>%s</DestinationCountry>' % (Country))) 
data = data.replace('<TotalGrossMassMeasure></TotalGrossMassMeasure>', '<TotalGrossMassMeasure>%s</TotalGrossMassMeasure>' % (GrossWeight))) 
data = data.replace('<LocalReferenceNumber></LocalReferenceNumber>', '<LocalReferenceNumber>%s</LocalReferenceNumber>' % (InvoiceNo))) 

f2.write(data) 

f1.close() 
f2.close() 
0

Это чище и более изощренными, если вы используете The ElementTree XML API, но если вы хотите, чтобы избежать этого, я предлагаю следующее :

template.xml:

<CommercialReferenceNumber>{name}/{invoice}</CommercialReferenceNumber> 
<DestinationCountry>{country}</DestinationCountry> 
<TotalGrossMassMeasure>{gross_weight}</TotalGrossMassMeasure> 
<LocalReferenceNumber>{invoice}</LocalReferenceNumber> 

script.py:

invoice_no = raw_input('InvoiceNo: ') 
name = raw_input('Name: ') 
country = raw_input('Country (Bsp.: US): ') 
gross_weight = raw_input('GrossWeight (Bsp.: 0.7): ') 


with open('template.xml', 'r') as xml_template: 
    with open('output.xml', 'w') as result: 
     xml_data = xml_template.read() 
     result.write(xml_data.format(
      name=name, 
      country=country, 
      gross_weight=gross_weight, 
      invoice=invoice_no 
      )) 

NB: переменные питона являются lowercase_underscore_separated переменные. Проверьте PEP8, чтобы иметь возможность писать больше pythonic-кода.

0

Чтение кода, мы можем видеть, что вы пишете больше 3 строки для каждой строки, что вы читаете из f1 ...

программы Вы думает так:

Для каждой строки f1, я создам 1 строку в f2, заменяя CommercialReferenceNumber. Тогда я не остановлюсь! Я напишу еще 1 строку с заменой DestinationCountry, еще 1 строку с TotalGrossMassMeasure и еще 1 строку для LocalReferenceNumber.

Итак, для каждой строки в моем файле f1 я напишу 4 строки в выходной файл f2.

Вместо этого, вы можете попробовать использовать этот кусок кода:

for line in f1: 
    line = line.replace('<CommercialReferenceNumber></CommercialReferenceNumber>',  '<CommercialReferenceNumber>%s/%s</CommercialReferenceNumber>' % (Name,  InvoiceNo)) 
    line = line.replace('<DestinationCountry></DestinationCountry>', '<DestinationCountry>%s</DestinationCountry>' % (Country)) 
    line = line.replace('<TotalGrossMassMeasure></TotalGrossMassMeasure>', '<TotalGrossMassMeasure>%s</TotalGrossMassMeasure>' % (GrossWeight)) 
    line = line.replace('<LocalReferenceNumber></LocalReferenceNumber>', '<LocalReferenceNumber>%s</LocalReferenceNumber>' % (InvoiceNo)) 

    f2.write(line) 

Для каждой строки, которые я прочитал от f1, напишу только один раз в f2.

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

Ex.:

a = "ABC" 

print a.replace("A", "test") 
print a.replace("D", "test") 

>>> testBC 
>>> ABC 
Смежные вопросы