json.dump()编写的文件不能被json.load()

时间:2016-10-01 22:43:03

标签: python json python-2.7

我正在为我的Python项目创建一个安装脚本。该脚本从json文件中读取构建配置,如下所示:

with open('setup.conf','r') as configfile:
    config = json.load(configfile)

完美无缺。稍后在脚本中,我将自己约束到该对象的一部分,并将此部分写入另一个文件:

config = config[arg]
[...]
with open('kivy/app.conf','w') as appconfig:
    json.dump(config,appconfig)

至少不会产生任何错误。 启动我的主应用程序后,我想读取我刚刚创建的文件:

path = os.path.dirname(os.path.abspath(__file__))
with open(path + '/app.conf','r') as configfile:
    config = json.load(configfile)

然而,

失败了
simplejson.scanner.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

表示json.dump()本身写的json从第一个字符开始无效。数据本身就像它可以得到的一样不可靠,所有纯ASCII字符,没有奇怪的行结尾等等。

{"deploy_server": false, "run_server": true, "server": "127.0.0.1", "run_app": true, "deploy_iOS": false, "user": "", "debug": true, "path": "", "deploy_android": false, "port": "8000"}

我不知道这可能来自哪里。非常感谢任何帮助!

更新

我发现上面的代码完全适用于实时解释器会话。我从中得出结论,围绕这个问题的代码肯定会有一些奇怪的事情,但我也在这里失去了:房间里可能有一只明显的大象,但我无法看到它。周围的代码如下所示:

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from foodcalendar import CalendarWidget
from kivy.resources import resource_add_path
import os
import requests
import json


[...]

class MyApp(App):
    def __init__(self):
        super(MyApp,self).__init__()
        path = os.path.dirname(os.path.abspath(__file__))
        print path
        with open(path + '/app.conf','r') as configfile:
            for r in configfile:
                print r
                config = json.loads(r)
        self.server = config["server"]

更新2

事实证明,我面临的错误与requests模块有某种关联:如果我评论import requests,一切都按预期工作,但我一无所知为什么会发生这种情况,因为jsonrequests模块的文档对任何不兼容性保持沉默...

更新3

这似乎是机器相关的问题。我在另一台机器上运行我的代码,然后运行完美无缺。 Python是版本2.7.12,操作系统是Ubuntu 16.04 x86_64,内核版本是4.4.0.38-generic在两台机器上......

1 个答案:

答案 0 :(得分:-1)

我将您提供的文本作为文件内容复制并粘贴到变量中。

>>> import json
>>> a=""" {"deploy_server": false, "run_server": true, "server": "127.0.0.1", "run_app": true, "deploy_iOS": false, "user": "", "debug": true, "path": "", "deploy_android": false, "port": "8000"}"""
>>> json.loads(a)
{'deploy_android': False, 'run_app': True, 'port': '8000', 'debug': True, 'deploy_server': False, 'server': '127.0.0.1', 'user': '', 'run_server': True, 'deploy_iOS': False, 'path': ''}
>>> 

一切正常。你也可以尝试一下。如果你得到的结果与文字文本相同,那么你可以确定错误是在读取和写入文件时。你可以尝试打印'你将要提供给json.loads