使用Pandas读取英国制裁名单ODS文件时编码乱码求助
问题描述
尝试读取以下数据集:
path = "https://assets.publishing.service.gov.uk/government/uploads/system/uploads/attachment_data/file/1165013/UK_Sanctions_List.ods"
采用遍历编码的方式尝试读取,代码如下:
encoding_list = ['ascii', 'big5', 'big5hkscs', 'cp037', 'cp273', 'cp424', 'cp437', 'cp500', 'cp720', 'cp737' , 'cp775', 'cp850', 'cp852', 'cp855', 'cp856', 'cp857', 'cp858', 'cp860', 'cp861', 'cp862' , 'cp863', 'cp864', 'cp865', 'cp866', 'cp869', 'cp874', 'cp875', 'cp932', 'cp949', 'cp950' , 'cp1006', 'cp1026', 'cp1125', 'cp1140', 'cp1250', 'cp1251', 'cp1252', 'cp1253', 'cp1254' , 'cp1255', 'cp1256', 'cp1257', 'cp1258', 'euc_jp', 'euc_jis_2004', 'euc_jisx0213', 'euc_kr' , 'gb2312', 'gbk', 'gb18030', 'hz', 'iso2022_jp', 'iso2022_jp_1', 'iso2022_jp_2' , 'iso2022_jp_2004', 'iso2022_jp_3', 'iso2022_jp_ext', 'iso2022_kr', 'latin_1', 'iso8859_2' , 'iso8859_3', 'iso8859_4', 'iso8859_5', 'iso8859_6', 'iso8859_7', 'iso8859_8', 'iso8859_9' , 'iso8859_10', 'iso8859_11', 'iso8859_13', 'iso8859_14', 'iso8859_15', 'iso8859_16', 'johab' , 'koi8_r', 'koi8_t', 'koi8_u', 'kz1048', 'mac_cyrillic', 'mac_greek', 'mac_iceland', 'mac_latin2' , 'mac_roman', 'mac_turkish', 'ptcp154', 'shift_jis', 'shift_jis_2004', 'shift_jisx0213', 'utf_32' , 'utf_32_be', 'utf_32_le', 'utf_16', 'utf_16_be', 'utf_16_le', 'utf_7', 'utf_8', 'utf_8_sig'] for encoding in encoding_list: worked = True try: df = pd.read_csv(path, encoding=encoding, nrows=5) print(df) except: worked = False if worked: print(encoding, ':\n', df.head())
但输出的DataFrame内容为乱码,示例如下:
ËäjñEÎÜ'g «sQğøÆÿŞmÿ´;Ğ´³µÇÇm®©sbH«iw... ¿`Òìş#mxOnBXvFî&ƪPÊz1á3uoj_g ¢x>æi7¸}Z«¤õÔ3ÎílW|ùÍx¡c;PÓ©kê+_ëͪ... NaN qJ|HfÆzÖ¤c[¨ÿ`ÉŞ` *ª b¾?]ÔüR~ ¾GÌOmxÜ?=v좦Í` NaN D¾Å¢ Æ·äÎQ´ ûò£^×%óÒ·$]qÓ´În[l'ß NaN &. ËäjñEÎ"'g «sQ}øÆÿ@mÿ´;!´³µ¢¢m®©sbH«iw... ¿ýÒì¦ÖmxOnBXvFî&ƪPÊz1á3uoj_g ^x>æi7¸ðZ«€õÔ3ÎílW]ùÍx¡c;PÓ©kê+_ëͪ... NaN qJ]HfÆz#€cǨÿýÉ@ý *ª b¾?ÐÔ\Rö ¾GÌOmx"?=vì^þÍý NaN D¾Å^ Æ·äÎQ´ ûò£¬×%óÒ·ÝÐqÓ´ÎnÇl'ß NaN cp1140 : &. ËäjñEÎ"'g «sQ}øÆÿ@mÿ´;!´³µ¢¢m®©sbH«iw... ¿ýÒì¦ÖmxOnBXvFî&ƪPÊz1á3uoj_g ^x>æi7¸ðZ«€õÔ3ÎílW]ùÍx¡c;PÓ©kê+_ëͪ... NaN qJ]HfÆz#€cǨÿýÉ@ý *ª b¾?ÐÔ\Rö ¾GÌOmx"?=vì^þÍý NaN D¾Å^ Æ·äÎQ´ ûò£¬×%óÒ·ÝÐqÓ´ÎnÇl'ß NaN
请问如何正确读取该文件?
解决方案
核心问题是你用pd.read_csv()读取ODS格式的文件,ODS是OpenDocument电子表格格式,属于二进制结构化文件,并非纯文本CSV,所以遍历编码的方法完全不适用,必然出现乱码。
正确读取步骤如下:
- 先安装处理ODS格式的依赖库
odfpy:
pip install odfpy
- 使用
pandas.read_excel()并指定engine='odf'读取文件:
import pandas as pd path = "https://assets.publishing.service.gov.uk/government/uploads/system/uploads/attachment_data/file/1165013/UK_Sanctions_List.ods" df = pd.read_excel(path, engine='odf') print(df.head())
通过这种方式就能正确解析ODS文件的内容,不会出现乱码问题。
内容的提问来源于stack exchange,提问作者Giampaolo Levorato
相关产品推荐
相关产品推荐

