【发布时间】:2018-08-12 12:45:35
【问题描述】:
所以我在全局范围内定义了一个名为 library 的空白字典。我已经知道如何将字典保存到 txt 文件中。
txt 文件的输出如下所示(称为 bookList0.txt):
{'Hobbit': {'author': 'J.R.R.Tolkien', 'year': '1937', 'genre': 'fantasy'}}
我做了一个函数来加载这个文件:
library = {}
def load():
print("Loading library..")
f = open("bookList0.txt", "r")
library = eval(f.readline())
if len(library) > 0:
print("Library successfully loaded!")
else:
print("Library didn't load!")
如果我使用此功能,它会显示“库已成功加载!”。但是当我在控制台中输入print(library) 时,它只显示{}。
但是,如果我在控制台中输入f = open(str("bookList0.txt"), "r") 然后library = eval(f.readline()),然后在控制台中再次输入print(library),它会给我文件中的字典。这样就可以了。
我不知道为什么这在函数中不起作用,但在控制台中起作用。感谢您的帮助!
更新:我尝试使用 json 模块加载,但它仍然没有加载任何内容。这是我为 json 编写的代码:
json_file = open("bookList.json")
json_str = str(json_file.read())
json_data = json.loads(json_str)
library = json_data
问题解决了!这是似乎可以工作的代码:
def load():
print("Loading library..")
json_file = open("bookList.json")
json_str = str(json_file.read())
json_data = json.loads(json_str)
library.update(json_data)
if len(library) > 0:
print("Library successfully loaded!")
else:
print("Library didn't load!")
【问题讨论】:
-
你不应该使用
eval,看看the json module -
minimal reproducible example,拜托。 (即告诉我们你把你声称产生错误输出的
print(library)放在哪里) -
@ThierryLathuille 在这种情况下给出了引用 -
ast.literal_eval可能更好...... -
你应该使用带有
loads和dumps函数的JSON模块来处理编码/解码dicts -
@Barnistic 好的,但是你的
load函数没有返回任何东西,所以print(library)应该在控制台中抛出一个NameError。除非您之前定义了一个名为library的全局变量。所以我重复了我对 MCVE 的要求。
标签: python file dictionary