2012-10-31 109 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,好,我仅仅指刚复制那些从你的问题。我已将它们带出来以减少混淆 –