无法从txt文件制作字典

时间:2018-08-12 12:45:36

标签: python file dictionary

因此,我全局定义了一个空白字典,称为 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!")

1 个答案:

答案 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模块的机会有关,您应该尝试将收到的建议纳入其中您的代码。

我的示例仅针对您所面临问题的一​​侧,即当前困扰您的那一面...