因此,我全局定义了一个空白字典,称为 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!")
答案 0 :(得分:0)
在我看来,您对Python的name scopes不太清楚。
我写了一个小脚本,其中有两个不同的load
定义(load_01
,(例如,不需要任何外部文件...)在您的代码中,没有return
语句,而load_02
没有return
语句,并且在这里我以不同的方式调用了这两个函数,即没有或没有相应的赋值,并且在这四种情况下,脚本都会打印出其对library
值的想法。
$ cat delendo.py
library = {}
data = '''{
'Hobbit':
{'author': 'J.R.R.Tolkien', 'year': '1937', 'genre': 'fantasy'}}'''
def load_01(s):
library = eval(s)
print('Loaded 01')
def load_02(s):
library = eval(s)
print('Loaded 02')
return library
print('='*64)
print('Initial value of _library_')
print(library)
print('='*64)
print('No return, no assignment')
load_01(data) ; print(library)
print('No return, assignment')
library = load_01(data) ; print(library)
print('='*64)
print('Reset value of _library_')
library = {}
print(library)
print('='*64)
print('Return, no assignment')
load_02(data) ; print(library)
print('Return, assignment')
library = load_02(data) ; print(library)
这里有执行我准备好的脚本的结果
$ python delendo.py
================================================================
Initial value of _library_
{}
================================================================
No return, no assignment
Loaded 01
{}
No return, assignment
Loaded 01
None
================================================================
Reset value of _library_
{}
================================================================
Return, no assignment
Loaded 02
{}
Return, assignment
Loaded 02
{'Hobbit': {'author': 'J.R.R.Tolkien', 'year': '1937', 'genre': 'fantasy'}}
$
我希望通过研究代码并面对输出,您可以更好地理解Python中的名称范围。
ps(注释中提供的所有内容)都与eval
的使用以及使用json
模块的机会有关,您应该尝试将收到的建议纳入其中您的代码。
我的示例仅针对您所面临问题的一侧,即当前困扰您的那一面...