Python 加载 UTF-8 JSON

2024-01-19

我有以下 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文件 https://stackoverflow.com/questions/13156395/python-load-json-file-with-utf-8-bom-header

如何正确读取 UTF-8 JSON 文件以便能够将其写入 .csv?

任何帮助是极大的赞赏。

Python版本:2.7.2


在 Python 2 中,csv模块不支持编写 Unicode。您需要在此处手动对其进行编码,否则您的 Unicode 值将使用 ASCII 进行编码(这就是您遇到编码异常的原因)。

这也意味着你需要手动编写UTF-8 BOM,但只有当你确实需要它时。 UTF-8 只能以一种方式写入,读取 UTF-8 文件不需要字节顺序标记。 Microsoft 喜欢将其添加到文件中,以便其工具更轻松地执行检测文件编码的任务,但 UTF-8 BOM 实际上可能会使其他工具更难正常工作,因为它们不会忽略额外的初始字符。

Use:

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()call 会在编码之前先将非字符串类型转换为 unicode 字符串。

明确地说:您已经加载了 JSON 数据。它是CSV写入那对你来说失败了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 加载 UTF-8 JSON 的相关文章

随机推荐