2012-07-20 10 views
6

2 gün önce Python'a (ve genelde programlamaya) başlamıştım. Bugün sıkıştım. Ben çok önemsiz bir sorun olduğunu düşündüğüm bir yanıt bulmaya çalışıyorum saatler geçirdim, kimse henüz burada sıkışmış değil:)Python - Dosya okuma döngüleri nasıl yuvalanır?

Patron, HUGE .xml dosyalarını elle okunabilir bir şeye manuel olarak temizlememi istiyor . Bunu benim için yapacak bir senaryo oluşturmaya çalışıyorum. Aşağıdaki, .xml dosyasının yanı sıra istediğim çıktı örneğidir.

Girişi (file.xml):

<IssueTracking> 
    <Issue> 
    <SequenceNum>123</SequenceNum> 
    <Subject>Subject of Ticket 123</Subject> 
    <Description>Line 1 in Description field of Ticket 123. 
Line 2 in Description field of Ticket 123. 
Line 3 in Description field of Ticket 123.</Description> 
    </Issue> 
    <Issue> 
    <SequenceNum>124</SequenceNum> 
    <Subject>Subject of Ticket 124</Subject> 
    <Description>Line 1 in Description field of Ticket 124. 
Line 2 in Description field of Ticket 124. 
Line 3 in Description field of Ticket 124.</Description> 
    </Issue> 
</IssueTracking> 

İstenilen Çıktı: İşte

123 Subject of Ticket 123 
Line 1 in Description field of Ticket 123. 
Line 2 in Description field of Ticket 123. 
Line 3 in Description field of Ticket 123. 

124 Subject of Ticket 124 
Line 1 in Description field of Ticket 124. 
Line 2 in Description field of Ticket 124. 
Line 3 in Description field of Ticket 124. 

Ben şimdiye kadar ne var olduğunu.

with open(File.xml, 'r') as SourceFile: # Opens the file 
    while 1: # Keep going through the file to the end 
     SourceFileLine = SourceFile.readline() # Saves lines of the source file 
     if not SourceFileLine: # Skip empty lines 
      break 

     SourceFileLine = SourceFileLine.strip() # Strips the whitespace 

     if "<SequenceNum>" in SourceFileLine: 
      SequenceNum = SourceFileLine[13:-14] # Trims the tags, saves the field. 
      continue 

     if "<Subject>" in SourceFileLine: 
      Subject = SourceFileLine[9:-10] 
      continue 

     #if "<Description>" in SourceFileLine: 
     # last_pos = SourceFile.tell() 
     # while "</Description>" not in SourceFileLine: 
     #  SourceFile.seek(last_pos) 
     #  ????? 
     #  
     # Description = Description[22:] 
     # continue 

     if "</Issue>" in SourceFileLine: 
      print(SequenceNum, end = "\t") 
      print(Subject) 
     # print(Description) 
      print("\n") 

Ben belirlenmesi ve ben kaynak dosyayı aşağı devam etmeden önce yazdırabilirsiniz tek bir dize halinde <Description> etiketleri arasında bu üç satırları istinat sıkışıp kaldım. Şimdi, düzinelerce başka dosya satırı okuma döngüsünü taradıktan sonra, ihtiyacım olan şeyin, hedef alana ulaştığım noktaya işaret etmesi ve dosyada bu noktadan başka bir okuma döngüsünün bulunması gerektiğinden şüpheleniyorum. Ama bunun yapıldığına dair başka bir örnek bulamadım, bu yüzden temel bir şeyi kaçırdığımı veya daha iyi bir yol olduğunu farz ediyorum. Yardım için şimdiden teşekkür ederiz!

+1

Python yerleşik bir XML ayrıştırıcı: http://docs.python.org Giriş, istenen çıktı ve denediğiniz için /library/pyexpat.html –

+3

+1. –

+0

Büyük olasılıkla siz çıktıktan sonra veri çıkışı için YAML gibi insan dostu bir serileştirici kullanmalısınız. Bu verileri bir daha işlemeye ne zaman ihtiyaç duyacağınızı asla bilemezsiniz. –

cevap

7

ederim verilerinizi işlemek için tavsiye LXML kullanımına bir örnek. (Nb: Py2.x için yazılmıştır ama Py3.x için kolayca uyarlanabilen)

from lxml import etree 
xml = """<IssueTracking> 
    <Issue> 
    <SequenceNum>123</SequenceNum> 
    <Subject>Subject of Ticket 123</Subject> 
    <Description>Line 1 in Description field of Ticket 123. 
Line 2 in Description field of Ticket 123. 
Line 3 in Description field of Ticket 123.</Description> 
    </Issue> 
    <Issue> 
    <SequenceNum>124</SequenceNum> 
    <Subject>Subject of Ticket 124</Subject> 
    <Description>Line 1 in Description field of Ticket 124. 
Line 2 in Description field of Ticket 124. 
Line 3 in Description field of Ticket 124.</Description> 
    </Issue> 
</IssueTracking> 
""" 

root = etree.fromstring(xml) 
for issue in root.findall('Issue'): 
    as_list = [issue.find(n).text for n in ('SequenceNum', 'Subject', 'Description')] 
    as_list[2] = as_list[2].split('\n') 
    print as_list 

Baskılar:

['123', 'Subject of Ticket 123', ['Line 1 in Description field of Ticket 123.', 'Line 2 in Description field of Ticket 123.', 'Line 3 in Description field of Ticket 123.']] 
['124', 'Subject of Ticket 124', ['Line 1 in Description field of Ticket 124.', 'Line 2 in Description field of Ticket 124.', 'Line 3 in Description field of Ticket 124.']] 
6

Lütfen XML dosyalarını okumayın, python için XML dosyalarını okumaya yardımcı olacak çeşitli kütüphaneler vardır.

Python kitaplığına bakın lxml XML dosyalarını okumak ve daha sonra ayrıştırmak için çok kolay bir yol sağlar ve kodunuzu büyük ölçüde geliştirir.

Ben kütüphaneyi kendisi nasıl kullanılacağını açıklıyor, ama bu metin alanına seyirci kapasitesinden daha kendi dokümantasyon çok daha iyidir: http://lxml.de/tutorial.html

+0

Teşekkür ederim, bunu inceleyeceğim ve anlayacağım. Yardımın için minnettarım. – phlogiston