如果使用utf-8编码打开文件,则0x85 Windows 1252会换行

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

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

有一个奇怪的字符正在折行。

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

证明<85>是vim读取的奇怪字符。

结果是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...
tracyjuice 回答:如果使用utf-8编码打开文件,则0x85 Windows 1252会换行

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

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

因此,解析器的解决方案可能很简单,只需在'utf-8'调用中将'cp1252'更改为codecs.open

,

经过herehere一段时间后,我想到了这个解决方案,该解决方案有效。

with open(filepath,encoding='utf-8') as fh:

    for line in fh:

        byteline = bytearray(line,encoding='utf-8').replace(b'\xc2\x85',b'')
        line_clean = byteline.decode(encoding='utf-8')

       # do stuff with clean line. 

知道打破字符串的字节序列是b'\ xc2 \ x85'(它被解释为...省略号字符。

首先使用bytearray将字符串编码为字节数组,然后使用bytearray类的replace方法,最后使用decode方法解码干净的行,这将返回转换前没有奇怪字符的字符串。

本文链接:https://www.f2er.com/3150348.html

大家都在问