python 3 open()默认编码

9rbhqvlz  于 2022-12-24  发布在  Python
关注(0)|答案(2)|浏览(425)

我正在尝试计算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>

然后,我在打开函数中包含编码参数,如下所示。

input = open("json/world_bank.json",encoding="utf8")

然后它开始工作,并给出输出为500。
据我所知,python open应该考虑“utf8”作为默认编码。
我错在哪里了。

qlzsbp2j

qlzsbp2j1#

Python 3默认的UTF-8编码只扩展到byte-〉str转换。open()使用你的环境来选择一个合适的编码:
来自Python 3文档的open()
encoding是用于解码或编码文件的编码名称。这只应该在文本模式下使用。默认编码依赖于平台(无论locale.getpreferredencoding()返回什么),但是Python支持的任何文本编码都可以使用。参见codecs模块以获得支持的编码列表。
在您的情况下,由于您使用的是西欧/北美的Windows,您将获得8位Windows-1252字符集。将encoding设置为utf-8将覆盖此设置。

lf5gs5x2

lf5gs5x22#

今天在venv(@python 3.10.5)中升级我的pygments-csv-lexer包时遇到了同样的问题。
I finally found a working solution here
在机器级别上设置环境变量PYTHONUTF8=1就可以了,这会将默认编码(如果open()上没有指定)设置为UTF8

相关问题