2016-10-01 25 views
0

我爲我的Python項目創建了一個安裝腳本。該腳本從json文件讀取構建配置,如下所示:json.dump()不可讀的文件json.load()

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"} 

我沒有在那裏這可以從未來絲毫的想法。任何幫助是極大的讚賞!

UPDATE

我發現上面非常相同的代碼工作在現場解釋器會話。我從這個結論中得出結論:圍繞這一點的代碼中必然會出現一些奇怪的現象,但我在這裏也很失落:房間裏可能有一頭明顯的大象,但我看不見它。周圍的代碼如下所示:

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,OS是Ubuntu 16.04 x86_64,內核版本是4.4.0.38-兩種機器都是通用的...

+0

你確定你正在閱讀你寫的同一個文件嗎? – Blender

+0

@Blender:是的,我引用的文件是正確的。 –

+0

嘗試在模式「wb」中寫入。 – JulienD

回答

-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

+0

複製和粘貼的字符串文字也適用於我。並且它變得更加奇怪:按照你的想法,我用文件行而不是json.load()在文件上嘗試了json.loads(),即:'with open(path +'/app.conf','r' )as configfile: for configfile中的r: print r config = json.loads(r)'這給了我相同的異常。奇怪的是,同樣的代碼在解釋器會話中工作,所以在周圍的代碼中一直存在一些奇怪的現象,而我一直都在思念。 –