Python 3.3 和 3.4 `open` 默认编码之间的区别?

Difference between Python 3.3 and 3.4 `open` default encoding?

我有一个包含一些非 ASCII 字符的文件。

$ file bi companies.txt
text/plain; charset=utf-8

在我的桌面上 Python 3.4 我可以 open 这个文件没有问题:

>>> open('companies.txt').read()
'...'

在 CI 系统上 Python 3.3 我得到这个:

>>> open('companies.txt').read()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.3/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 1223: ordinal not in range(128)

但如果我明确指定 encoding='utf8',它会起作用:

>>> open('companies.txt', encoding='utf8').read()
'...'

在两个系统上,sys.getdefaultencoding returns 'utf-8'

知道是什么导致系统行为不同吗?为什么 CI 系统尝试使用 ascii?

文本文件的编码由locale.getpreferredencoding, rather than sys.getdefaultencoding决定。