如何从文本文件中读取包含函数的字典?

3

我想从文本文件中读取一个字典,它看起来像这样{'key': [1, ord('@')]}。我了解过eval()literal_eval(),但由于ord()的原因,两者都无法使用。

我还尝试了json.loadsjson.dumps,但没有得到积极的结果。

还有哪些其他方法可以使用?


5
你是如何制作文本文件的?如果后续需要使用 JSON 解析器进行读取,你应该使用 json.dump - flakes
3
“eval()”可以完成此任务,但如果某人以恶意控制文本文件,则也会抹掉您的硬盘。你对文件中可使用的函数有任何限制吗?如果只允许使用字符串文字的ord(),那么您可以轻松地将它们替换为相应的数值,然后使用“ast.literal_eval()”函数。 - jasonharper
读入字典后,您期望其中的内容是什么? - martineau
eval 可以工作,类似于 eval(file.read())。但是为什么一开始就是一个文本文件呢?这只是 Python 源代码。 - juanpa.arrivillaga
2个回答

1
假设您使用open将文本文件作为字符串读入,而不是使用json.loads,则可以进行一些简单的正则表达式搜索以查找括号内的内容,例如ord('@') -> @
这是一个最简解决方案,它将文件中的所有内容读取为单个字符串,然后查找所有ord的实例,并将整数表示放入名为ord_的输出列表中。为了测试这个例子,myfile.txt是一个包含以下内容的文本文件。
import json
import re
with open(r"myfile.txt") as f:
    json_ = "".join([line.rstrip("\n") for line in f])

rgx = re.compile(r"ord\(([^\)]+)\)")
rgd = rgx.findall(json_)
ord_ = [ord(str_.replace(r"'", "")) for str_ in rgd]

0
  • json.dump()json.load()无法工作,因为ord()不是JSON可序列化的(这意味着该函数不能成为JSON对象)。
  • 是的,eval确实是非常糟糕的做法,我永远不会建议任何人在任何情况下使用它。

我能想到的最好的解决方法是使用条件和额外的列表。

# data.json = {'key': [1, ['ord', '@']]}    # first one is function name, second is arg
with open("data.json") as f:
    data = json.load(f)
# data['key'][1][0] is "ord"
if data['key'][1][0] == "ord":
    res = ord(data['key'][1][1])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接