parsing - 如果文件以 utf-8 编码打开,0x85 windows 1252 会换行
问题描述
我有一个 70 年代旧格式的文件,用于 Companies House(英国公司注册处)。
我继承了一个 6 年前编写的解析器,它逐行并根据一组条件从行中提取信息并将它们插入字典。
有一个奇怪的角色正在断线。
我将此行复制到一个新文件awk '{if(NR==33411) print $0}' PROD216_1950_ew_1.dat > broken
并broken
在 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...
解决方案
vim 显示<85>
指示在当前编码中无效的十六进制 85 字节(即,它用于解码文件的编码)。
我的猜测是文件的编码是Windows-1252,其中十六进制 85 表示省略号字符。
因此,解析器的解决方案可能就像在调用中更改'utf-8'
为一样简单。'cp1252'
codecs.open
推荐阅读
- excel - VBA使用选定的列过滤器创建一个新的数据透视表
- javascript - 节点模块导出子功能优化
- c# - 用 C# 计算我的 datagridview 中一列中“✓”的数量
- c# - C# 模拟 - 条纹服务 - 返回 null
- google-apps-script - 用户需要遮蔽受保护的单元格
- react-native - 如何让 ScrolltoIndex 在 FlatList 上工作
- c# - 当参数是列表字符串时,Dapper sql 太慢了
- android - 使用无法在 android 设备上运行的 expo-three 组件在 react native 3 中加载 glb 模型。该模型虽然出现在网络版本上
- database - 将数据构建回 ListView Builder [Flutter]
- c++ - 多重采样帧缓冲区仅适用于 Nvidia 卡,而不是 AMD 或 Intel HD Graphics