Python读取文件时出现UnicodeDecodeError,如何忽略错误并跳转到下一行?

2023-12-30

我必须将文本文件读入Python。文件编码为:

file -bi test.csv 
text/plain; charset=us-ascii

这是第三方文件,我每天都会收到一个新文件,所以我宁愿不更改它。该文件包含非 ascii 字符,例如 Ö。我需要使用 python 读取这些行,并且我可以忽略具有非 ASCII 字符的行。

我的问题是,当我在 Python 中读取文件时,当到达存在非 ascii 字符的行时,我会收到 UnicodeDecodeError 错误,并且无法读取文件的其余部分。

有没有办法避免这种情况。如果我尝试这个:

fileHandle = codecs.open("test.csv", encoding='utf-8');
try:
    for line in companiesFile:
        print(line, end="");
except UnicodeDecodeError:
    pass;

然后,当出现错误时,for 循环结束,我无法读取文件的其余部分。我想跳过导致错误的行并继续。如果可能的话,我宁愿不对输入文件进行任何更改。

有什么办法可以做到这一点吗? 非常感谢。


您的文件似乎没有使用 UTF-8 编码。打开文件时使用正确的编解码器非常重要。

You can tell open() https://docs.python.org/3/library/functions.html#open如何处理解码错误,用errors关键词:

errors是一个可选字符串,指定如何处理编码和解码错误 - 这不能在二进制模式下使用。有多种标准错误处理程序可用,尽管已注册的任何错误处理名称codecs.register_error()也是有效的。标准名称是:

  • 'strict'提出一个ValueError如果存在编码错误则异常。默认值为None具有相同的效果。
  • 'ignore'忽略错误。请注意,忽略编码错误可能会导致数据丢失。
  • 'replace'导致在存在格式错误的数据的地方插入替换标记(例如“?”)。
  • 'surrogateescape'会将任何不正确的字节表示为 Unicode 专用使用区域中从 U+DC80 到 U+DCFF 的代码点。然后,当surrogateescape写入数据时使用错误处理程序。这对于处理未知编码的文件很有用。
  • 'xmlcharrefreplace'仅在写入文件时受支持。编码不支持的字符将替换为适当的 XML 字符引用&#nnn;.
  • 'backslashreplace'(也仅在写入时支持)用 Python 反斜杠转义序列替换不支持的字符。

使用除以下以外的任何其他方式打开文件'strict' ('ignore', 'replace'等)然后将让您读取该文件而不会引发异常。

请注意,解码是按缓冲的数据块进行的,而不是按文本行进行。如果必须逐行检测错误,请使用surrogateescape处理程序并测试代理范围内代码点读取的每一行:

import re

_surrogates = re.compile(r"[\uDC80-\uDCFF]")

def detect_decoding_errors_line(l, _s=_surrogates.finditer):
    """Return decoding errors in a line of text

    Works with text lines decoded with the surrogateescape
    error handler.

    Returns a list of (pos, byte) tuples

    """
    # DC80 - DCFF encode bad bytes 80-FF
    return [(m.start(), bytes([ord(m.group()) - 0xDC00]))
            for m in _s(l)]

E.g.

with open("test.csv", encoding="utf8", errors="surrogateescape") as f:
    for i, line in enumerate(f, 1):
        errors = detect_decoding_errors_line(line)
        if errors:
            print(f"Found errors on line {i}:")
            for (col, b) in errors:
                print(f" {col + 1:2d}: {b[0]:02x}")

请注意,并非所有解码错误都可以正常恢复。虽然 UTF-8 的设计在面对小错误时具有鲁棒性,但其他多字节编码(例如 UTF-16 和 UTF-32)无法应对丢失或额外的字节,这将影响行分隔符的准确度位于。上述方法可能会导致文件的其余部分被视为一长行。如果文件足够大,则可能会导致MemoryError如果“线”足够大,则例外。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python读取文件时出现UnicodeDecodeError,如何忽略错误并跳转到下一行? 的相关文章

随机推荐

  • 在 UIView 外部绘制阴影

    背景 我有一个UIView具有以下属性 阿尔法 1 背景颜色 白色 不透明度 0 35 圆角 阴影 Code 这就是我创建阴影的方法 UIView扩大 self layer masksToBounds false self layer sh
  • 对于iOS healthkit如何保存收缩压和舒张压值?

    这是在健康套件中保存血压数据的代码 HKUnit BPunit HKUnit millimeterOfMercuryUnit HKQuantity BPSysQuantity HKQuantity quantityWithUnit BPun
  • 在 PHP 中向日期添加三个月

    我有一个变量叫做 effectiveDate包含日期2012 03 26 我试图在此日期基础上增加三个月 但没有成功 这是我尝试过的 effectiveDate strtotime 3 months strtotime effectiveD
  • 按上下文获取所有标签以实现 acts-as-taggable-on

    We use https github com mbleigh acts as taggable on https github com mbleigh acts as taggable on对于我们的 Rails 应用程序 我们遇到了问题
  • 如何与 React Test Renderer / Jest 渲染的组件交互

    我正在使用 Jest 和快照测试 我想做的是渲染一个组件ReactTestRenderer 然后模拟单击其中的按钮 然后验证快照 ReactTestRenderer 返回的对象create呼叫有一个getInstance函数允许我直接调用它
  • 不兼容的片段类型

    你好 我在 android 中有一个小应用程序 我在其中使用带导航抽屉的片段作为菜单 但现在我想在用户单击某些内容时在片段对话框弹出窗口中显示 并且出现以下错误 主要活动 private void displayView int posit
  • shell 脚本参数非位置

    有没有办法将非位置参数提供给 shell 脚本 意思是明确指定某种标志 myscript sh value1 value2 myscript sh val1 value1 val2 value2 您可以使用getopts 但我不喜欢它 因为
  • MySQL 错误 1241:操作数应包含 1 列

    我正在尝试将表1中的数据插入表2中 insert into table2 Name Subject student id result select Name Subject student id result from table1 表2
  • 在.Net Framework中使用最新版本的System.Net.Http

    最新版本System Net Http https www nuget org packages System Net Http nuget 上的版本是 4 3 4 但即使是最新的 Net Framework 4 8 也附带了该库的 4 2
  • 拼写检查等统计句子建议模型

    已经有可用的拼写检查模型 可以帮助我们根据经过训练的正确拼写语料库找到建议的正确拼写 是否可以将粒度从字母表增加到 单词 以便我们可以有均匀的短语建议 这样如果输入了错误的短语 那么它应该从正确短语的语料库中建议最接近的正确短语 当然它是从
  • Google 地图信息窗口中的 YouTube 视频

    我正在尝试将 YouTube 视频放入 Google 地图 v3 信息窗口中 它在 Firefox 和 Internet Explorer 中运行良好 It does not在 Safari 和 Chrome 中工作 在这些浏览器中 定位已
  • 在 Activity.onCreate(..) 中显示警报

    我是 Android 新手 这是我的第一个问题 所以请放轻松 是否可以检查 Activity 的 onCreate 内的某些条件并显示 AlertDialog 我在 Oncreate 中匿名创建一个 AlertDialog 并在该实例上调用
  • 使用 R Markdown 的 Beamer 演示

    我正在使用 R Markdown 来制作投影仪演示我对幻灯片水平有疑问 我选择法兰克福主题 该主题允许制定演示计划 标题中的项目符号 我的问题 当我输入 slide level 2 时 我有内容 但没有演示文稿的计划 当我输入 slide
  • 如何从命令行将错误列表(或任何自定义查询)从 TFS 导出到 Excel?

    我需要将错误列表从 Team Foundation Server 导出到 Excel 手动执行此操作很简单 但我需要命令行版本 因为该任务需要自动化 有人知道该怎么做吗 回答你原来的问题 在 TFS 中添加新查询 创建查询并单击 保存 这应
  • 使用 Visual Studio 创建 MSI 并强制所有用户

    我使用 Visual Studio 2015 带有 Visual Studio 安装程序插件 创建了一个安装程序 目标是始终使用相同的本地资源运行应用程序 无论谁登录 因此我们的目标是 CommonAppDataFolder Win10 上
  • 淡出旧元素,淡入新元素

    我是新来反应并尝试过反应动画 http facebook github io react docs animation html 当在 TransitionGroup 中添加或删除元素时 它们非常有用 但是 如果我用类似的元素替换单个元素
  • 非活动类中的警报对话框

    我有一个代码可以检查一些数据并在非活动类中显示警报 但是在运行应用程序时崩溃并且不显示警报对话框 我使用下面的代码 if str isEmpty strPort isEmpty new AlertDialog Builder Mtx get
  • Kivy (Python) - 椭圆点击事件

    我正在尝试翻译的开头一个简单的画布应用程序 https bloom510 github io pitch canvas 我用 JavaScript 编写了 Kivy 框架 我已经能够沿着圆的周长分布顶点 但是无论是用 Python 还是 K
  • 即使在 conda 中安装后也无法导入 Poppler

    我正在尝试使用 pdf 渲染包 Poppler 我在这里找到了相同的 Anaconda 安装 https anaconda org conda forge poppler https anaconda org conda forge pop
  • Python读取文件时出现UnicodeDecodeError,如何忽略错误并跳转到下一行?

    我必须将文本文件读入Python 文件编码为 file bi test csv text plain charset us ascii 这是第三方文件 我每天都会收到一个新文件 所以我宁愿不更改它 该文件包含非 ascii 字符 例如 我需