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() 默认编码的主要内容,如果未能解决你的问题,请参考以下文章

Python 文件操作

Python----空空如也

python之文件读写详解

python_文件操作

python基础语法_字符串编码

python基础09_文件操作