PETL文档指出,为了加载JSON、HTML、XML或文本,数据只能来自文件。如何从内存中以任何这些格式将数据加载到 PETL 中,例如字符串变量而不是文件?
这在加载已经被上游代码清理或生成的数据时很有用。仅写入文件以重新读取文件是一种浪费且有风险的(竞争条件等)操作。
以下感觉有点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 |
+-----+-----+