【问题标题】:Python file.next() is messing the for loopPython file.next() 弄乱了 for 循环
【发布时间】:2012-05-26 23:33:11
【问题描述】:

我尽力寻找答案,但找不到适合我需要的东西。我正在尝试将 XML 文件重新格式化为自定义格式并遇到问题。这是我的要求。

我有以下 XML 文件:

<parameters>
  <parameter name="name1" value="value1"/>
  <parameter name="name2" value="value2"/>
  <parameter name="name3" value="value3"/>
  <parameter name="name4" value="value4"/>
</parameters>

我希望将其转换为以下内容。

(param().name("name1").value("value1"),
param().name("name2").value("value2"),
param().name("name3").value("value3"),
param().name("name4").value("value4"));

我尝试使用以下代码,它似乎将一些数据从原始文件跳过到输出。

with open("myfile","r") as f:
    for each_line in f:
        current_line = each_line
        if current_line.strip().startswith('<'):
            split_line = current_line.strip().split(' ')
            if split_line[0].lstrip('<') == "parameter":
               if f.next().strip() == "</parameters":
                  print 'param().name(' + split_line[1].split('=')[1] + ').value('+ split_line[2].split('=')[1][:-2] + '));\n\n'
               else:
                  print 'param().name(' + split_line[1].split('=')[1] + ').value('+ split_line[2].split('=')[1][:-2] + ')'

我看到使用 f.next() 会导致问题...不知道我还能如何解决这个问题。

【问题讨论】:

    标签: python file-io next


    【解决方案1】:

    您可能应该为此使用 XML 解析器。

    要修复您的代码,您可以将结果存储在列表中并将其连接在一起并在最后打印出来:

    result = []
    
    with open("myfile","r") as f:
        for each_line in f:
            current_line = each_line.strip()
            if current_line.startswith('<parameter '):
                split_line = current_line.split(' ')     # Breaks if there are spaces in name or value.
                name = split_line[1].split('=')[1]       # Yuck.
                value = split_line[2].split('=')[1][:-2] # Yuck.
                result.append('param().name({0}).value({1})'.format(name, value)
    
    print '(' + ',\n'.join(result) + ');\n\n'
    

    请注意,您在 XML 中查找字符串的方式并不可靠,对文档的微小更改会产生问题。使用 XML 解析器会降低它被破坏的可能性。

    相关

    【讨论】:

    • 嗯...我真的应该考虑一下 XML Parser :) 马克,我想用逗号结束该行,如果它有任何一行,并且只在最后一行加一个分号。
    • @BalajiCuttackam:哦,添加逗号需要完全重写。也许是时候彻底抛弃这段代码,改用 XML 解析器了。
    • 我现在正在尝试...感谢您的建议!
    • @BalajiCuttackam:我建议您使用您的 XML 解析器版本的代码创建一个新问题。
    【解决方案2】:

    好吧,f.next() 只是进行了一次迭代,因此改变了当前行迭代器。 这似乎不是你想要的。

    但是你不只使用 xml 解析器吗?

    【讨论】:

      猜你喜欢
      • 2021-10-22
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多