【问题标题】:Basic Python file searching and I/O基本的 Python 文件搜索和 I/O
【发布时间】:2011-04-26 23:25:52
【问题描述】:

我正在尝试用 Python 完成一项简单的任务,而且我是该语言的新手(我是 C++)。我希望有人能指出我正确的方向。

问题: 我有一个充满数据的 XML 文件 (12mb),文件中有开始标签“xmltag”和结束标签“/xmltag”,它们代表我想要提取的数据部分的开始和结束。

我想通过循环浏览这个打开的文件,并为每个实例找到一个开始标记并将该部分中的数据复制到一个新文件,直到结束标记。然后,我想在文件末尾重复此操作。

我对文件 I/O 很满意,但不是最有效的数据循环、搜索和提取。

我真的很喜欢这种语言的外观,希望我能更多地参与进来,这样我就可以回馈社区。

非常感谢!

【问题讨论】:

    标签: python xml file search text


    【解决方案1】:

    查看BeautifulSoup

    from BeautifulSoup import BeautifulSoup
    
    with open('bigfile.xml', 'r') as xml:
        soup = BeautifulSoup(xml):
        for xmltag in soup('xmltag'):
            print xmltag.contents
    

    【讨论】:

      【解决方案2】:

      Dive Into Python 3 有一个很棒的章节:

      这是一本很棒的关于python的免费书籍,值得一读!

      【讨论】:

        【解决方案3】:
        xml=open("xmlfile").read()
        x=xml.split("</xmltag>")
        for block in x:
            if "<xmltag>" in block:
                print block.split("<xmltag>")[-1]
        

        【讨论】:

        • 好是主观的!要求很简单,使用简单的Python字符串方法就足够了。
        • OP没有说明xmltag是否有一些属性。
        • 没错。除了想要找到指定标签的开始和结束之外,他没有说明任何其他内容。有了这些信息,我的解决方案就简单明了,至少现在不需要下载任何东西。
        • 那么就OK了。但主观上仍然不好;-)
        • 不,这客观上并不好。这只是一个“简单的要求”,因为 OP 不理解 XML。任何延续使用字符串操作来处理 XML 的想法的东西,就像想法本身一样,都是错误的,除非并且直到要求中的具体细节另有说明。
        【解决方案4】:

        无需安装 BeautifulSoup,Python 在其标准库中包含 ElementTree 解析器。

        from xml.etree import cElementTree as ET
        tree = ET.parse('myfilename')
        new_tree = ET('new_root_element')
        for element in tree.findall('.//xmltag'):
            new_tree.append(tree.element)
        print ET.tostring(new_tree)
        

        【讨论】:

          【解决方案5】:

          BeautifulSoup 答案很好,但执行速度更快,并且不需要外部库:

          import xml.etree.cElementTree as ET
          tree = ET.parse('xmlfile.xml')
          results = (elem for elem in tree.getiterator('xmltag'))
          
          # in Python 2.7+, getiterator() is deprecated; use tree.iter('xmltag')
          

          【讨论】:

            猜你喜欢
            • 2014-03-12
            • 1970-01-01
            • 1970-01-01
            • 2012-07-06
            • 1970-01-01
            • 2015-11-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多