2014-09-01 63 views
2

這是我如何轉儲文件如何在python傾倒JSON不帶引號

with open('es_hosts.json', 'w') as fp: 
    json.dump(','.join(host_list.keys()), fp) 

結果是

"a,b,c" 

我想:

a,b,c 

感謝

+2

是什麼讓你認爲你想要的輸出是有效的JSON?爲什麼你需要它沒有報價? – 2014-09-01 20:19:39

+0

我知道......但是我不需要在輸出 – Tampa 2014-09-02 02:52:56

+0

@MartijnPieters的角落案件的一部分OP沒有建議不加引號的字符串將被直接用作JSON。最近我遇到了類似的情況,在這個過程中後面添加了雙引號,所以我需要不帶引號的JSON轉義字符串。 – 2016-11-08 09:21:54

回答

0

使用python的內置字符串替換函數

with open('es_hosts.json', 'w') as fp: 
    json.dump(','.join(host_list.keys()).replace('\"',''), fp) 
+0

此解決方案也刪除字符串中的雙引號。 – 2016-11-08 09:14:21

1

之前執行字符串替換,你可能想strip引號:

print '"a,b,c"'.strip('"') 

輸出:

a,b,c 

這是更接近你想要達到的目標。即使只是刪除第一個和最後一個字符作品:'"a,b,c"'[1:-1]

但你有沒有看過this question

+0

該解決方案比建議替換所有雙引號的解決方案要好,但當(無引號)字符串的最後一個字符是(轉義)雙引號時,它仍然刪除太多,如''我的名字是\'安迪\ 「」'。你想要的只是刪除前面的雙引號和後面的雙引號。 – 2016-11-08 09:17:28

+0

我應該補充一點,我的評論適用於答案中提出的第一個解決方案(使用'strip()')。第二種解決方案(使用切片)適用於所有情況(並且應該有自己的答案,因此可以將其投票)。仍然投票這個答案。 – 2016-11-08 09:27:57

0

那麼,這不是有效的JSON,所以json模塊不會幫你寫這些數據。但是,你可以這樣做:

import json 

with open('es_hosts.json', 'w') as fp: 
    data = ['a', 'b', 'c'] 
    fp.write(json.dumps(','.join(data)).replace('"', '')) 

那是因爲你問json,但由於這不是JSON,這應該足夠了:

with open('es_hosts.json', 'w') as fp: 
    data = ['a', 'b', 'c'] 
    fp.write(','.join(data)) 
0

要卸下鍵只,引號這如果稍後解析它可能很重要(推測可能有一些寬容的解析器,或者你可能因爲奇怪的原因直接將它輸入node),你可以嘗試下面的正則表達式。

re.sub(r'(?<!:)"(\S*?)"', '\\1', json_string) 

的一個問題是,這個正則表達式預計領域被分隔key: value,它會失敗key:value。你可以使它適用於後者,但稍有改動,但類似地,它不適用於可變數量的空白:

可能還有其他邊緣情況,但它將與輸出json.dumps一起使用,但結果將會不能被json解析。一些更寬容的解析器如yaml可能能夠讀取結果。

import re 
regex = r'(?<!:)"(\S*?)"' 
o = {"noquotes" : 127, "put quotes here" : "and here", "but_not" : "there"} 
s = json.dumps(o) 
s2 = json.dumps(o, indent=3) 
strip_s = re.sub(regex,'\\1',s) 
strip_s2 = re.sub(regex,'\\1',s2) 

print(strip_s) 
print(strip_s2) 

assert(json.loads(strip_s) == json.loads(s) == json.loads(strip_s2) == json.loads(s2) == object) 

將引發ValueError但打印你想要什麼。