簡體   English   中英

Python加載UTF-8 JSON

[英]Python Load UTF-8 JSON

我有以下JSON(為簡單起見,我只使用一個,但實際上有100個條目):

{
    "Active": false, 
    "Book": "US Derivat. London, Mike Übersax/Michael Jealous", 
    "ExpirationDate": "2006-10-12", 
    "Isin": "CH0013096497", 
    "IssueDate": "2001-10-09", 
    "KbForXMonths": "0", 
    "KbPeriodDay": "Period", 
    "KbType": "Prozent", 
    "KbYear": "0.5", 
    "Keyinvest_IssueRetro": "0.50%", 
    "Keyinvest_RecurringRetro": "1.00% pro rata temporis", 
    "Keyinvest_RetroPayment": "Every month", 
    "LastImportDate": "2008-12-31", 
    "LiberierungDate": "1900-01-01", 
    "NominalCcy": "USD", 
    "NominalStueck": "5,000", 
    "PrimaryCCR": "0", 
    "QuoteType": "Nominal", 
    "RealValor": "0", 
    "Remarks": "", 
    "RwbeProductId_CCR": "034900", 
    "RwbeProductId_EFS": "034900", 
    "SecName": "Cliquet GROI on Nasdaq", 
    "SecType": "EQ", 
    "SubscriptionEndDate": "1900-01-01", 
    "TerminationDate": "2003-10-19", 
    "TradingCcy": "USD", 
    "Valor": 1309649
}

我正在嘗試讀取此JSON以將其保存為.csv(以便我可以將其導入數據庫)

但是,當我嘗試將此JSON數據寫為csv時,如下所示:

with codecs.open('EFSDUMP.csv', 'w', 'utf-8-sig') as csv_file:
    content_writer = csv.writer(csv_file, delimiter=',')
    content_writer.writerow(data.values())

我收到一個錯誤:

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

那是因為JSON中有一個變音符號(參見屬性“Book”)。

我試着像這樣閱讀JSON:

data = json.loads(open('EFSDUMP.json').read().decode('utf-8-sig'))

有趣的是這個:

print data

給我這個:

{u'PrimaryCCR': u'0', u'SecType': u'EQ', u'Valor': 1309649, u'KbType': u'Prozent', u'Book': u'US Derivat. London, Mike \xdcbersax/Michael Jealous', u'Keyinvest_RecurringRetro': u'1.00% pro rata temporis', u'TerminationDate': u'2003-10-19', u'RwbeProductId_CCR': u'034900', u'SubscriptionEndDate': u'1900-01-01', u'ExpirationDate': u'2006-10-12', u'Keyinvest_RetroPayment': u'Every month', u'Keyinvest_IssueRetro': u'0.50%', u'QuoteType': u'Nominal', u'KbYear': u'0.5', u'LastImportDate': u'2008-12-31', u'Remarks': u'', u'RealValor': u'0', u'SecName': u'Cliquet GROI on Nasdaq', u'Active': False, u'KbPeriodDay': u'Period', u'Isin': u'CH0013096497', u'LiberierungDate': u'1900-01-01', u'IssueDate': u'2001-10-09', u'KbForXMonths': u'0', u'NominalCcy': u'USD', u'RwbeProductId_EFS': u'034900', u'TradingCcy': u'USD', u'NominalStueck': u'5,000'}

顯然變音符號變成'\\ xdc'

但是當我這樣做時:

print data['Book']

意思是我直接訪問該屬性,我得到:

US Derivat. London, Mike Übersax/Michael Jealous

因此變音符號再次成為真正的變音符號。

我很確定JSON是沒有BOM的UTF-8(Notepad ++聲稱如此)

我已經嘗試了所有這些建議而沒有任何成功: Python加載帶有UTF-8 BOM頭的json文件

如何才能正確讀取UTF-8 JSON文件才能將其寫為.csv?

任何幫助是極大的贊賞。

Python版本:2.7.2

在Python 2中, csv模塊不支持編寫Unicode。 您需要在此處手動編碼,否則您的Unicode值將使用ASCII為您編碼(這就是您獲得編碼異常的原因)。

這也意味着您需要手動編寫UTF-8 BOM, 但前提是您確實需要它 UTF-8只能以單向編寫,不需要字節順序標記來讀取UTF-8文件。 微軟喜歡將它添加到文件中,以便為他們的工具更輕松地檢測文件編碼,但UTF-8 BOM實際上可能使其他工具更難以正常工作,因為他們不會忽略額外的初始字符。

采用:

with open('EFSDUMP.csv', 'wb') as csv_file:
    csv_file.write(codecs.BOM_UTF8)
    content_writer = csv.writer(csv_file)
    content_writer.writerow([unicode(v).encode('utf8') for v in data.values()])

請注意,這將以任意(字典)順序寫入您的值。 unicode()調用將在編碼之前首先將非字符串類型轉換為unicode字符串。

要明確:你已經加載了JSON數據就好了。 CSV編寫失敗了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM