2012-10-31 744 views
1

我正在嘗試創建一個應用程序來創建一個xml文件,並且我想將文本分配給某些元素。此文本由文件夾上的圖像文件組成。代碼如下:Python - for循環僅輸出最後一次迭代

import glob 
    import os 
    import os.path 

    from xml.etree import ElementTree 
    from xml.dom import minidom 
    import xml.etree.ElementTree as ET 

    def prettify(elem): 
    """Return a pretty-printed XML string for the Element. 
    """ 
     rough_string = ElementTree.tostring(elem, 'utf-8') 
     reparsed = minidom.parseString(rough_string) 
     return reparsed.toprettyxml(indent=" ") 

    path = "/home/unkuiri/Ubuntu One/Wallpapers/*" 


    background = ET.Element('background') 
    starttime = ET.SubElement(background, 'starttime') 
    year = ET.SubElement(starttime, 'year') 
    month = ET.SubElement(starttime, 'month') 
    day = ET.SubElement(starttime, 'day') 
    hour = ET.SubElement(starttime, 'hour') 
    minute = ET.SubElement(starttime, 'minute') 
    second = ET.SubElement(starttime, 'second') 
    static = ET.SubElement(background, 'static') 
    duration_stat = ET.SubElement(static, 'duration') 
    files = ET.SubElement(static, 'file') 
    transition = ET.SubElement(background, 'transition') 
    duration_trans = ET.SubElement(transition, 'duration') 
    from1 = ET.SubElement(transition, 'from') 
    to = ET.SubElement(transition, 'to') 

    dirList = glob.glob(path) 

    while len(background.findall("./static/file")) <= len([name for name in os.listdir('.') if os.path.isfile(name)]): 
      background.append(static) 
      background.append(transition) 
      continue 

    for fname in dirList: 

     to.text = fname 
     files.text = fname 
     from1.text = fname 


    print prettify(background) 

此代碼輸出一個正確格式化的XML,但只與最後一次的路徑,重複任意多次在文件夾中的文件的數目。我想要的是它爲每個「文件」元素打印一個路徑,並在前面的「to」元素和下一個「元素」上打印相同的路徑。也許這是一個我不知道的簡單解決方案。我仍然是一個新手。在每次迭代

在此先感謝

回答

0

我已經成功地解決了這個代碼這個問題:

import glob 
    from xml.etree import ElementTree 
    from xml.dom import minidom 

    def prettify(elem): 
     """Return a pretty-printed XML string for the Element. 
     """ 
     rough_string = ElementTree.tostring(elem, 'utf-8') 
     reparsed = minidom.parseString(rough_string) 
     return reparsed.toprettyxml(indent=" ") 

    import xml.etree.ElementTree as ET 

    path = "/home/unkuiri/Ubuntu One/Wallpapers/*" 


    background = ET.Element('background') 
    dirList = glob.glob(path) 
    starttime = ET.SubElement(background, 'starttime') 
    year = ET.SubElement(starttime, 'year') 
    year.text = '2012' 
    month = ET.SubElement(starttime, 'month') 
    month.text = '10' 
    day = ET.SubElement(starttime, 'day') 
    day.text = '10' 
    hour = ET.SubElement(starttime, 'hour') 
    hour.text = '00' 
    minute = ET.SubElement(starttime, 'minute') 
    minute.text = '00' 
    second = ET.SubElement(starttime, 'second') 
    second.text = '00' 


    for i,fname in enumerate(dirList):  

     static = ET.SubElement(background, 'static') 
     duration_stat = ET.SubElement(static, 'duration') 
     duration_stat.text = '1795.0' 
     files = ET.SubElement(static, 'file') 
     transition = ET.SubElement(background, 'transition') 
     duration_trans = ET.SubElement(transition, 'duration') 
     duration_trans.text = '5.0' 
     from1 = ET.SubElement(transition, 'from') 
     to = ET.SubElement(transition, 'to') 

     from1.text = dirList[i-1] 

     files.text = dirList[i-1] 

     to.text = dirList[i] 


    print prettify(background) 
0

你跺腳到/文件/ 1跳轉,而不會有任何保存它們。在你有機會對數據做任何事情之前,每次迭代都會覆蓋先前迭代的內容。

您是否意味着將這些變量存儲起來?你的意思是在每次迭代時都做print prettify(background)

+0

謝謝您的回答。我設法解決它。 – Unkuiri

3

你只是建立一個單一的元素,加入此相同的元素多次。

在你的循環,你一遍遍分配該元素的成員,所以最後它結束了僅在過去fname

你需要創建一個新的元素,每次填充它在for循環

也許你應該有更多的東西像這樣的

background = ET.Element('background') 
dirList = glob.glob(path) 

for fname in dirList: 

    starttime = ET.SubElement(background, 'starttime') 
    year = ET.SubElement(starttime, 'year') 
    month = ET.SubElement(starttime, 'month') 
    day = ET.SubElement(starttime, 'day') 
    hour = ET.SubElement(starttime, 'hour') 
    minute = ET.SubElement(starttime, 'minute') 
    second = ET.SubElement(starttime, 'second') 
    static = ET.SubElement(background, 'static') 
    duration_stat = ET.SubElement(static, 'duration') 
    files = ET.SubElement(static, 'file') 
    transition = ET.SubElement(background, 'transition') 
    duration_trans = ET.SubElement(transition, 'duration') 
    from1 = ET.SubElement(transition, 'from') 
    to = ET.SubElement(transition, 'to') 

    to.text = fname 
    files.text = fname 
    from1.text = fname 
+0

感謝您的快速回答,但您的解決方案並沒有解決我的問題完全...我必須拿出兩個「background.append」功能,因爲...他們拿這些分支的額外拷貝。 – Unkuiri

+0

@Unkuiri,好,我僅僅指剛複製那些從你的問題。我已將它們帶出來以減少混淆 –