python 3.0 open() 默认编码
Posted
技术标签:
【中文标题】python 3.0 open() 默认编码【英文标题】:python 3.0 open() default encoding 【发布时间】:2016-07-18 03:59:55 【问题描述】:我正在尝试计算 JSON 文件中的行数。 Click HERE to access my JSON file .
我尝试使用下面的代码来计算行数。
input = open("json/world_bank.json")
i=0
for l in input:
i+=1
print(i)
但是上面的代码抛出了一个 UniCodeDecode 错误,如下所示。
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
<ipython-input-17-edc88ade7225> in <module>()
2
3 i=0
----> 4 for l in input:
5 i+=1
6
C:\Users\Subbi Reddy\AppData\Local\Continuum\Anaconda3\lib\encodings\cp1252.py in decode(self, input, final)
21 class IncrementalDecoder(codecs.IncrementalDecoder):
22 def decode(self, input, final=False):
---> 23 return codecs.charmap_decode(input,self.errors,decoding_table)[0]
24
25 class StreamWriter(Codec,codecs.StreamWriter):
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 3979: character maps to <undefined>
然后我在open函数中包含编码参数,如下所示。
input = open("json/world_bank.json",encoding="utf8")
然后它开始工作并输出为 500。
据我所知,python open 应该将“utf8”视为默认编码。
这里哪里出错了。
【问题讨论】:
sys.getfilesystemencoding()
在您的系统上返回什么?
这里是“mbcs”@marcelm
啊嗯,这并没有告诉我太多;你能检查一下open("json/world_bank.json").encoding
吗?
【参考方案1】:
Python 3 的默认 UTF-8 编码仅扩展到 byte->str 转换。 open()
而是使用您的环境来选择合适的编码:
从 Python 3 docs 到 open()
:
encoding
是用于对文件进行解码或编码的编码名称。这应该只在文本模式下使用。默认编码取决于平台(无论 locale.getpreferredencoding() 返回什么),但可以使用 Python 支持的任何文本编码。请参阅编解码器模块以获取支持的编码列表。
就您而言,由于您使用的是西欧/北美的 Windows,因此您将获得 8 位 Windows-1252 字符集。将 encoding
设置为 utf-8
会覆盖此内容。
【讨论】:
幸运的是有recent attempts 来结束这种疯狂......总有一天。 3.9 安装在我的机器上,它仍然使用 Windows 1252 编码。 @Jeyekomon 链接的 PEP 597 现在表示 Python 3.10。 @StefanBerger 伙计们,阅读 PEP。当encoding
参数未设置时,它只是发出警告。他们提到他们知道编码问题,但变化太大了。当有一天实际的默认 utf-8 开放编码 PEP 将被起草时,这个 PEP 应该会简化这个过程。
这是很久以前做出的一个非常糟糕的决定的一个很好的例子。当不必跨平台的东西默认不是跨平台的时候,为什么要假装是跨平台的。以上是关于python 3.0 open() 默认编码的主要内容,如果未能解决你的问题,请参考以下文章