首页 > 解决方案 > 如果文件以 utf-8 编码打开,0x85 windows 1252 会换行

问题描述

我有一个 70 年代旧格式的文件,用于 Companies House(英国公司注册处)。

我继承了一个 6 年前编写的解析器,它逐行并根据一组条件从行中提取信息并将它们插入字典。

有一个奇怪的角色正在断线。

我将此行复制到一个新文件awk '{if(NR==33411) print $0}' PROD216_1950_ew_1.dat > brokenbroken在 vim 中打开。

原来 vim a 读取了奇怪的字符<85>

结果是后面的所有内容都MAYFIELD被读取为新行。

在有问题的行下方:

000376702103032986930001        1993010119941024        193709          0105<BARRY ALEXANDER<GROSVENOR<<<<MAYFIELD 3<41 PLANTATION ROAD<THE PEAK<<HONG KONG<BANK EXECUTIVE<BRITISH<<

在 vim 中变成

000376702103032986930001        1993010119941024        193709          0105<BARRY ALEXANDER<GROSVENOR<<<<MAYFIELD <85>3<41 PLANTATION ROAD<THE PEAK<<HONG KONG<BANK EXECUTIVE<BRITISH<<

我正在使用codecs上下文管理器读取此文件,我认为这是处理它的方式 -

有什么我想念的吗?那是什么<85>

with codecs.open(filepath, 'r', 'utf-8') as fh:
    for line in fh:
        linetype = determine_line_type(line)
        if linetype == 'header':
            continue
        elif linetype == 'company':
            do stuff...
        elif linetype == 'officer':
            do stuff...

标签: parsingencodingutf-8character-encoding

解决方案


vim 显示<85>指示在当前编码中无效的十六进制 85 字节(即,它用于解码文件的编码)。

我的猜测是文件的编码是Windows-1252,其中十六进制 85 表示省略号字符。

因此,解析器的解决方案可能就像在调用中更改'utf-8'为一样简单。'cp1252'codecs.open


推荐阅读