读取utf-8编码文件

时间:2018-03-22 12:29:12

标签: python file-io encoding pathlib

今天我了解到,open(filename).read()虽然我在我的系统上观察到了这一点,但是我认为绑定到隐藏文件对象的资源会立即返回是不安全的。 (请参阅问题the accepted answerReading 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

0 个答案:

没有答案