加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python使用lxml和fileinput

发布时间:2020-12-20 13:38:58 所属栏目:Python 来源:网络整理
导读:有一个简单的xml ?xml version="1.0" encoding="UTF-8" ?root childabc/child/root 我想从文件中解析它,这很有效: with open('tst.xml') as test_xml: for _,element in lxml.etree.iterparse(test_xml,tag='child'): print element.text # prints abc as e
有一个简单的xml

<?xml version="1.0" encoding="UTF-8" ?>
<root>
    <child>abc</child>
</root>

我想从文件中解析它,这很有效:

with open('tst.xml') as test_xml:
    for _,element in lxml.etree.iterparse(test_xml,tag='child'):
        print element.text # prints abc as expected

但是,我尝试修改脚本然后允许它从文件或stdin解析xml并且没有成功:

fi = fileinput.input('tst.xml')
for _,element in lxml.etree.iterparse(fi,tag='child'):
    print element.text

# File "iterparse.pxi",line 371,in lxml.etree.iterparse.__init__ (src/lxml/lxml.etree.c:97283)
# File "apihelpers.pxi",line 1411,in lxml.etree._encodeFilename (src/lxml/lxml.etree.c:22515)
# TypeError: Argument must be string or unicode.

我不确定我做错了什么. FileInput对象在python中不是类文件对象吗?

解决方法

没有深入调查,似乎异常的原因是FileInput类不提供读取方法.
为了实现我的目标,我现在最终编写了自己的包装器:

class FileInput(object):
    def __init__(self,filename=None,*args,**kwargs):
        self.file = open(filename,**kwargs) if filename and filename != "-" else sys.stdin

    def __enter__(self):
        return self.file

    def __exit__(self,type,value,traceback):
        if self.file is not sys.stdin:
            self.file.close()

    def __getattr__(self,name):
        return getattr(self.file,name)

我会等待更好的答案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读