2015-03-03 77 views
2

我有一個文件,其中每一行是一個JSON對象,像這樣:的Python 2.7 JSON傾倒UnicodeEncodeError

{"name": "John", ...} 

{...} 

我試圖創建具有相同對象的新文件,但所有的移除某些屬性他們。

當我這樣做,我得到一個UnicodeEncodeError。奇怪的是,如果我反過來range(n)(對於某些編號n)並使用infile.next(),它的工作原理與我想要的一樣。

爲什麼這麼說?我如何通過迭代infile來實現這個功能?我嘗試使用dumps()而不是dump(),但這只是在outfile中產生了一堆空行。

with open(filename, 'r') as infile: 
    with open('_{}'.format(filename), 'w') as outfile: 
     for comment in infile: 
      decodedComment = json.loads(comment) 
      for prop in propsToRemove: 
       # use pop to avoid exception handling 
       decodedComment.pop(prop, None) 
      json.dump(decodedComment, outfile, ensure_ascii = False) 
      outfile.write('\n') 

以下是錯誤:

UnicodeEncodeError: 'ascii' codec can't encode character u'\U0001f47d' in position 1: ordinal not in range(128) 

感謝您的幫助!

+0

你真的應該複製/粘貼整個錯誤信息。但即使沒有它,我猜測JSON的元素與您的控制檯編碼不兼容。 – 2015-03-03 05:38:19

+0

@MarkRansom:謝謝,我是這麼做的。你能詳細說明一下嗎?爲什麼在我描述的另一種情況下,元素編碼很好? – Dimitrios 2015-03-03 06:25:13

+0

我說*整個*錯誤信息 - 哪一行是錯誤?它來自哪裏?這是非常有用的信息。 – 2015-03-03 13:08:44

回答

11

您面臨的問題是標準file.write()函數(由json.dump()函數調用)不支持unicode字符串。從錯誤消息可知,您的字符串包含UTF字符\U0001f47d(原來代碼爲字符EXTRATERRESTRIAL ALIEN,誰知道?)以及其他可能的UTF字符。要處理這些字符,可以將它們編碼爲ASCII編碼(它們將在輸出文件中顯示爲\XXXXXX),或者您需要使用可以處理unicode的文件編寫器。

做的第一選擇,這條線替換你的寫作路線:

json.dump(unicode(decodedComment), outfile, ensure_ascii = False) 

第二種選擇是更可能你想要什麼,一個容易的選擇是使用codecs模塊。導入它,並將您的第二行更改爲:

with codecs.open('_{}'.format(filename), 'w', encoding="utf-8") as outfile: 

然後,您可以將特殊字符保存爲原始格式。

+0

謝謝!第二種選擇是我正在尋找的。 – Dimitrios 2015-03-03 21:35:11