【问题标题】:File written by json.dump() not readable by json.load()json.dump() 写入的文件无法被 json.load() 读取
【发布时间】:2017-02-10 05:57:36
【问题描述】:

我正在为我的 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...

【问题讨论】:

  • 你确定你正在阅读你写的同一个文件吗?
  • @Blender:是的,我引用的文件是正确的。
  • 尝试在“wb”模式下写入。
  • 只是一个疯狂的猜测......您可能在文件的开头有一些垃圾。也许是BOM? print(repr(open(filaname).read())) 说什么?
  • 这个错误simplejson.scanner.JSONDecodeError: Expecting value: line 1 column 1 (char 0),表明文件为空。除了在交互式会话中工作的事实之外,它让我说:您尝试阅读的文件不是您期望的文件。你应该控制两次所有路径,至少有一个可能是错误的

标签: python json python-2.7


【解决方案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 的内容

【讨论】:

  • 复制和粘贴的字符串文字也适用于我。而且它变得更加奇怪:按照您的想法,我尝试了带有文件行的 json.loads() 而不是文件上的 json.load() ,即:with open(path + '/app.conf','r') as configfile: for r in configfile: print r config = json.loads(r) 这给了我同样的例外。奇怪的是,同样的代码在解释器会话中工作,所以周围的代码中肯定有一些奇怪的东西我一直都在想念..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
  • 2014-07-01
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多