2015-12-21 72 views
0

我有一個xml文件,我想添加一些數據。我不想搞亂python中的XML工具,所以我修改了我的輸入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() 

問題是,如果我這樣做,我會在output.xml中獲得每行4次。

我只想替換這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 
      )) 

注:蟒蛇變量lowercase_underscore_separated變量。檢查PEP8能夠編寫更多pythonic代碼。

0

讀你的代碼中,我們可以看到你寫的,你是從f1閱讀每行3條線...

您計劃這樣想:

對於每一行f1,我將在f2中創建1行代替 CommercialReferenceNumber。然後我不會停止!我將另外寫入DestinationCountry更多行,另外還有另外1行TotalGrossMassMeasure,另外還有另外1行LocalReferenceNumber

因此,對於我的f1文件中的每一行,我會在f2輸出文件中寫入4行。

相反,你可以嘗試使用這段代碼:

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讀每一行,我會寫只有1次進入F2。

如果你的線路不符合要求,那麼當前線路將不會發生任何事情。

Ex。:

a = "ABC" 

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

>>> testBC 
>>> ABC