今天我了解到,open(filename).read()
虽然我在我的系统上观察到了这一点,但是我认为绑定到隐藏文件对象的资源会立即返回是不安全的。 (请参阅问题the accepted answer的Reading entire file in Python)。
The second answer让我拒绝推出自己的帮助功能,它告诉我pathlib
已经提供了这个功能。
但实际上,这似乎并非如此。使用以下脚本(比如t.py
),我会得到不同的结果:
# The German accent characters are Ä,Ö,Ü,ä,ö,ü, and ß.
from pathlib import Path;
def pathlib_read_text(filename, encoding=None):
return Path(filename, encoding=encoding).read_text()
def mylocal_read_text(filename, encoding=None):
with open(filename, encoding=encoding) as f:
return f.read()
def test(fun):
print(fun+'_read_text:')
print(eval(fun+'_read_text')(__file__, 'utf-8'))
test('pathlib')
test('mylocal')
Windows控制台(python test.py
)的输出在第一个块中包含Ã",Ã-,Ão,ä,ö,ü, and ÃY.
,当我将输出重定向到文件时,我得到第二个块错误(在Notepad ++中它是' s如果文件被视为utf-8,则显示在白色黑色中xC4,xD6,xDC,xE4,xF6,FC, and xDF
。
有什么我忽略的吗?
我尝试检查3.6.3代码,但到目前为止没有发现任何错误......
以下版本强化了我的感觉,它是pathlib
或其中一个底层库/函数中的错误。也许它只是一个Windows问题,默认编码与utf-8
大不相同。现在,它足以在控制台窗口中运行测试。
accents = '''
Ä,Ö,Ü,ä,ö,ü,ß
'''
from pathlib import Path;
import codecs
def pathlib_read_text(filename, encoding=None, errors=None):
return Path(filename, encoding=encoding, errors=errors).read_text()
def mylocal_read_text(filename, encoding=None, errors=None):
with open(filename, encoding=encoding, errors=errors) as f:
return f.read()
def space_it(error):
return ' ';
codecs.register_error('space_it', space_it)
def test(fun):
s = eval(fun+'_read_text')(__file__, 'utf-8', errors='space_it')
print(fun+'_read_text:', s.split("\n")[1] == accents.strip())
test('pathlib')
test('mylocal')
它产生以下输出:
pathlib_read_text: False
mylocal_read_text: True