python - 如何读取多个已知文件编码
问题描述
我一直在网上搜索解决读取具有不同编码的文件的解决方案,并且我发现了许多“无法分辨文件是什么编码”的实例(因此,如果有人正在阅读此内容并有链接,我将不胜感激它)。但是,我正在处理的问题比“打开任何文件编码”更集中,而是打开一组已知编码。我绝不是这个主题的专家,但我想我会发布我的解决方案,以防有人遇到这个问题。
具体例子:
已知文件编码:utf8 和 windows ansi
初始问题:据我所知,没有为 python 的open('file', 'r')
命令指定编码自动默认为 encoding='utf8' 在尝试f.readline()
使用 ansi 文件时在运行时引发 UnicodeDecodeError。对此的常见搜索是:“UnicodeDecodeError: 'utf-8' codec can't decode byte”
次要问题:所以我想好吧,很简单,我们知道正在引发的异常,所以请阅读一行,如果它引发了这个 UnicodeDecodeError 然后关闭文件并使用open('file', 'r', encoding='ansi')
. 这样做的问题是,有时 utf8 能够很好地读取 ansi 编码文件的前几行,但在后面的行中却失败了。现在解决方案变得清晰了;我必须用 utf8 通读整个文件,如果失败了,我就知道这个文件是 ansi。
我将对此发表我的看法作为答案,但如果有人有更好的解决方案,我也将不胜感激:)
解决方案
如果将链接问题中的编解码器替换为tripleee,则为
import codecs
last_position = -1
def mixed_decoder(unicode_error):
global last_position
string = unicode_error[1]
position = unicode_error.start
if position <= last_position:
position = last_position + 1
last_position = position
new_char = string[position].decode("ansi")
#new_char = u"_"
return new_char, position + 1
codecs.register_error("mixed", mixed_decoder)
奖励:在发生错误之前读取为 UTF-8,并且不需要就地错误处理。
推荐阅读
- bash - 如何将变量设置为 Bash 中两个命令的输出
- mongodb - 命令“mongod --auth --bind_ip_all”无限运行并消耗太多RAM - Mongo with Docker
- reactjs - 如何在 Apexchart 中自定义工具提示的标题和正文?
- python - Python3.8 `all()` 不短路
- reactjs - jsPDF 中的矩阵类在 React 中无法访问
- javascript - 想确认对使用 create-react-app 导入 index.js 的默认行为的理解
- node.js - 如何使用 discord.js 检查有多少人有角色?
- vue.js - vue-router 嵌套路由和多个路由器视图没有内容
- javascript - 以编程方式确定 S3 存储桶中是否存在文件前缀
- typo3 - TYPO3 4.5:升级到新版本 - 一次还是增量?