首页 > 解决方案 > 将 JSON、HTML、XML 或文本从内存而不是文件加载到 PETL

问题描述

PETL文档指出,为了加载JSONHTMLXML文本,数据只能来自文件。如何从内存中以任何这些格式将数据加载到 PETL 中,例如字符串变量而不是文件?

这在加载已经被上游代码清理或生成的数据时很有用。仅写入文件以重新读取文件是一种浪费且有风险的(竞争条件等)操作。

标签: python-3.xfilememorypetl

解决方案


以下感觉有点hacky,但至少它避免了将任何内容写入磁盘。

import petl
from io import StringIO


d = '''<table>
        <tr>
            <td>foo</td><td>bar</td>
        </tr>
        <tr>
            <td>a</td><td>1</td>
        </tr>
        <tr>
            <td>b</td><td>2</td>
        </tr>
        <tr>
            <td>c</td><td>2</td>
        </tr>
    </table>'''


class OpenableString():

    def __init__(self, str):
        self.value = StringIO(str)

    def open(self, mode):
        return self

    def __exit__(self, type, value, traceback):
        pass

    def __enter__(self):
        return self.value


os = OpenableString(d)

table1 = petl.fromxml(os, 'tr', 'td')

print(table1)

输出:

+-----+-----+
| foo | bar |
+=====+=====+
| a   | 1   |
+-----+-----+
| b   | 2   |
+-----+-----+
| c   | 2   |
+-----+-----+

推荐阅读