我的 LAN 网络中的外部计算机上有一个日志文件。日志是一个 XML 文件。文件无法从 http 访问,并且每秒更新一次。 目前我正在将日志文件复制到我的计算机并运行解析器,但我想直接从外部主机解析文件。
如何在 Python 中完成?是否有可能一次解析整个文件,然后在以后的版本中仅解析添加到末尾的新内容?
最佳答案
您可以使用 paramiko
和 xml.sax
的默认解析器 xml.sax.expatreader
,它实现了 xml.sax.xmlreader.IncrementalParser
。
我在本地虚拟机上运行了以下脚本来生成 XML。
#!/bin/bash
echo "<root>" > data.xml
I=0
while sleep 2; do
echo "<entry><a>value $I</a><b foo='bar' /></entry>" >> data.xml;
I=$((I + 1));
done
这是增量消费者。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import xml.sax
from contextlib import closing
import paramiko.client
class StreamHandler(xml.sax.handler.ContentHandler):
lastEntry = None
lastName = None
def startElement(self, name, attrs):
self.lastName = name
if name == 'entry':
self.lastEntry = {}
elif name != 'root':
self.lastEntry[name] = {'attrs': attrs, 'content': ''}
def endElement(self, name):
if name == 'entry':
print({
'a' : self.lastEntry['a']['content'],
'b' : self.lastEntry['b']['attrs'].getValue('foo')
})
self.lastEntry = None
def characters(self, content):
if self.lastEntry:
self.lastEntry[self.lastName]['content'] += content
if __name__ == '__main__':
# use default ``xml.sax.expatreader``
parser = xml.sax.make_parser()
parser.setContentHandler(StreamHandler())
client = paramiko.client.SSHClient()
# or use ``client.load_system_host_keys()`` if appropriate
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('192.168.122.40', username = 'root', password = 'pass')
with closing(client) as ssh:
with closing(ssh.open_sftp()) as sftp:
with closing(sftp.open('/root/data.xml')) as f:
while True:
buffer = f.read(4096)
if buffer:
parser.feed(buffer)
else:
time.sleep(2)
关于python - 在 Python 中将附加数据增量解析到外部 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28826085/