有一個簡單的XMLPython的使用LXML用的FileInput
<?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
不過,我試圖修改腳本,然後允許它解析XML無論是從文件或stdin
並沒有成功:
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.
我不知道在什麼我做錯了。在Python中,FileInput對象不是文件類對象嗎?
也許'lxml.etree.iterparse()'僅處理一個真正的文件,並沒有任何類似文件的對象。 –
這可能不是真的,因爲'sys.stdin'被認爲是一個類似文件的對象,並且被'iterparse()'解析沒有任何問題。 – Ixanezis
在Python 2.x中,'sys.stdin'默認是一個真實的文件對象 - 我的意思是它的'type()'是'file'。 'fileinput.input()'不是這種情況。請注意後者有一個'fileno()'方法,但它返回-1。我不確定讓一個返回-1的方法'fileno()'有什麼意義,因爲任何試圖通過查詢文件描述符來嘗試使用文件類對象的C代碼都會嘗試使用-1 .. 。 –