【问题标题】:python 3.0 open() default encodingpython 3.0 open() 默认编码
【发布时间】: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吗?

标签: python-3.x utf-8 character-encoding


【解决方案1】:

Python 3 的默认 UTF-8 编码仅扩展到 byte->str 转换。 open() 而是使用您的环境来选择合适的编码:

从 Python 3 docsopen()

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 应该会简化这个过程。
  • 这是很久以前做出的一个非常糟糕的决定的一个很好的例子。当不必跨平台的东西默认不是跨平台的时候,为什么要假装是跨平台的。
猜你喜欢
  • 2014-09-13
  • 2021-08-02
  • 2015-02-11
  • 2018-10-04
  • 2021-02-21
  • 2014-04-23
  • 1970-01-01
相关资源
最近更新 更多