2017-08-08 38 views
-1

我從外部json文件加載一些數據到Python,大多數情況下工作正常。然而偶爾有些數據包含轉義字符,我需要保留。Python:防止json.load(文件)從剝離轉義字符

原始輸入文件:

{ 
    "version": 1, 
    "query": "occasionally I \"need\" to escape \"double\" quotes" 
} 

加載到蟒蛇:

import json 

with open('input_file', 'r') as f: 
    file = json.load(f) 

編輯

道歉,我應該更清楚。我所試圖做的是像下面這樣:

'{}'.format(file['query']) 

使用json.dumps

actual_query = '"datadog.agent.up".over("role:dns").by("host").last(1).count_by_status()' 

json.dumps(actual_query) 
'"\\"datadog.agent.up\\".over(\\"role:dns\\").by(\\"host\\").last(1).count_by_status()"' 
+0

輸入文件似乎給正確的結果,我在Python 3.6,您使用的是什麼版本? –

+0

@AnandSKumar 3.5.2所以,當你加載它保留逃生字符? –

+0

你想做什麼?如果你想讓json格式化轉義回去,你可以使用'json.dumps(file)' – Stael

回答

0

這正是你應該期待什麼,我不知道爲什麼它不你想要什麼。請記住,print命令返回變量的表示形式,例如print('\"')給出"

使用你的榜樣,你可以看到你的輸出結果時,你將如何讓轉義字符後面:

import json 

a = r"""{ 
    "version": 1, 
    "query": "occasionally I \"need\" to escape \"double\" quotes" 
}""" 

j = json.loads(a) 


print j 

print json.dumps(j) 

這給了我:

{u'query': u'occasionally I "need" to escape "double" quotes', u'version': 1} 
{"query": "occasionally I \"need\" to escape \"double\" quotes", "version": 1} 

(如果你不介意的python2 )


在repsonse您的編輯:

'{}'.format(file['query']) == file['query']返回True - 您正在將字符串對象格式化爲字符串。正如我剛纔所說,使用

json.dumps(file['query']) 

回報

"occasionally I \"need\" to escape \"double\" quotes" 

它的方式是字符串:

'"occasionally I \\"need\\" to escape \\"double\\" quotes"' 

這樣的情況下,也爲您的實際查詢「:

query = '"\\"datadog.agent.up\\".over(\\"role:dns\\").by(\\"host\\").last(1).count_by_status()"' 

給出

print json.dumps(query) 
# "\"datadog.agent.up\".over(\"role:dns\").by(\"host\").last(1).count_by_status()" 


with open('myfile.txt', 'w') as f: 
    f.write(json.dumps(query)) 


# file contents: 
# "\"datadog.agent.up\".over(\"role:dns\").by(\"host\").last(1).count_by_status()" 

\\

看,這就是爲什麼你需要明確什麼你實際上是試圖做。

用於加倍\一招是把一個repr()

如:

print repr(json.dumps(query))[1:-1] # to remove the ' from the beginning and end 

# "\\"datadog.agent.up\\".over(\\"role:dns\\").by(\\"host\\").last(1).count_by_status()" 

with open('myfile.txt', 'w') as f: 
    f.write(repr(json.dumps(actual_query))[1:-1]) 

# file: 
# "\\"datadog.agent.up\\".over(\\"role:dns\\").by(\\"host\\").last(1).count_by_status()" 

你也可以做一個.replace(r'\', r'\\')

0

當我運行程序時,JSON我得到看起來有點不同。 您的輸出中的第二行周圍有單引號。我不明白。

無論如何。儘管單引號解決了逃生問題,但它並不是Json的有效方式。有效的Json需要雙引號。單引號只是Python中的一個字符串分隔符。

替換你的代碼的最後一行用 print(json.dumps(file))

,並返回正確的JSON。 { "query": "occasionally I \"need\" to escape \"double\" quotes", "version": 1 }

問候,

梅勒