5

filterous は、単体テストで単純なXMLオブジェクトを解析するために使用 しています。ただし、後でオブジェクトにアクセスしようとすると、Python は " " メッセージで終了します。ドキュメントによると、「lxml 2.3 以降では、.close() メソッドもエラーの場合に呼び出されます」とのことですが、エラー メッセージや. 私のIO-fooは明らかに速度が遅いので、誰か提案がありますか?iterparseStringIOStringIOValueError: I/O operation on closed fileiterparseExceptioniterparse

コマンドと (できれば) 関連するコード:

$ python2.6 setup.py test

setup.py:

from setuptools import setup
from filterous import filterous as package

setup(
    ...
    test_suite = 'tests.tests',

テスト/tests.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 '))

filterous/filterous.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のテストはすべて正常に実行されました。

4

2 に答える 2

1

で問題なく動作するようです。StringIO代わりにそれを使用してみてくださいcStringIO。閉店する理由がわかりません。

于 2011-07-24T12:52:04.907 に答える
0

Docs-fuが問題です。「lxml2.3以降、エラーの場合は.close()メソッドも呼び出されます」と引用したことは、iterparseとは関係ありません。iterparseのセクションのにリンクされたページに表示されます。これは、ターゲットパーサーインターフェイスのドキュメントの一部です。これは、ターゲット(出力!)オブジェクトのclose()メソッドを参照しており、StringIOとは関係ありません。いずれにせよ、あなたもその小さな言葉を無視したようです。2.3より前では、lxmlは、解析が成功した場合にのみターゲットオブジェクトを閉じていました。これで、エラーが発生したときに閉じます。

解析が終了した後、なぜStringIOオブジェクトに「アクセス」したいのですか?

更新後でデータベースにアクセスしようとすると、テストでのすべてのself.xml.getvalue()呼び出しを意味しますか?[質問にferschlugginerトレースバックを表示して、推測する必要がないようにします!]それが問題の原因である場合(IO操作としてカウントされます)、getvalue()を忘れてください...それが機能する場合は、そうではありません。 (型破りな名前の)(不変の)XMLを返しますか?

于 2011-07-24T12:47:24.243 に答える