lxml.etree.iterparse关闭输入文件处理程序?

2024-04-19 19:07:59 发布

您现在位置:Python中文网/ 问答频道 /正文

filteris是usingiterparse来解析unit test中的一个简单XML ^{} object。但是,当随后尝试访问StringIO对象时,Python会退出并显示“ValueError: I/O operation on closed file”消息。根据^{} documentation,“从lxml2.3开始,在错误情况下也将调用.close()方法”,但我没有收到错误消息或Exception来自iterparse。我的IO-foo显然没有跟上速度,所以有人有什么建议吗?在

命令和(希望)相关代码:

$ python2.6 setup.py test

在设置.py公司名称:

^{pr2}$

测试/测试.py公司名称:

from cStringIO import StringIO
import unittest

from filterous import filterous

XML = '''<posts tag="" total="3" ...'''

class TestSearch(unittest.TestCase):
    def setUp(self):
        self.xml = StringIO(XML)
        self.result = StringIO()
    ...
    def test_empty_tag_not(self):
        """Empty tag; should get N results."""
        filterous.search(
            self.xml,
            self.result,
            {'ntag': [u'']},
            ['href'],
            False)
        self.assertEqual(
            len(self.result.getvalue().splitlines()),
            self.xml.getvalue().count('<post '))

肮脏的/肮脏的.py公司名称:

from lxml import etree
...
def search(file_pointer, out, terms, includes, human_readable = True):
    ...
    context = etree.iterparse(file_pointer, tag='posts')

回溯:

ERROR: Empty tag; should get N results.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/victor/dev/filterous/tests/tests.py", line 149, in test_empty_tag_not
    self.xml.getvalue().count('<post '))
ValueError: I/O operation on closed file

PS:测试在2010-07-27上运行良好。在


Tags: frompytestimportself名称deftag
2条回答

傅医生就是问题所在。您引用的“从lxml2.3开始,在错误情况下也将调用.close()方法”,这与iterparse无关。它会出现在你的链接页面上的iterparse部分之前。它是目标解析器接口文档的一部分。它引用目标(output!)的close()方法反对,和你的StringIO无关。在任何情况下,你似乎也忽略了这个词。在2.3之前,lxml只有在解析成功时才关闭目标对象。现在它也会在出错时关闭它。在

为什么要在解析完成后“访问”StringIO对象?在

更新之后尝试访问数据库,您是指所有这些self.xml.getvalue()在你的测试中打电话?[在你的问题中显示出费斯伦金纳的回溯,这样我们就不需要猜测了!]如果这是导致问题的原因(它确实算作IO操作),请忽略getvalue()。。。如果它可以工作,它会返回(非常规命名)(不变)XML吗?在

似乎与StringIO一起工作,请尝试使用它而不是cStringIO。不知道为什么要关门了。在

相关问题 更多 >