【问题标题】:Invalid start byte error using replace() function in python在 python 中使用 replace() 函数出现无效的起始字节错误
【发布时间】:2019-01-28 04:34:20
【问题描述】:

我正在运行一个简单的代码来用我的文件中的另一个单词替换一个单词,如下所示:

import random
import os

path = '/path/of/file/'
files = os.listdir (path)

for file in files:
    with open (path + file) as f:
        newText = f.read().replace('Plastic Ba','PlasticBag')

    with open (path + file, "w") as f:
        f.write(newText)

在这样做的过程中,我遇到了一个我以前从未遇到过的错误:

Traceback (most recent call last):
  File "replaceText.py", line 9, in <module>
    newText = f.read().replace('Plastic Ba', 'PlasticBag')
  File "/Users/vivek/anaconda3/lib/python3.6/codecs.py", line 321, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 3131: invalid start byte

我不确定这意味着什么或这里的错误是什么?我过去曾多次运行此脚本,没有任何问题。解决这个问题的任何帮助都会很棒!

【问题讨论】:

  • 文本文件的编码是什么?你能提供一个文件在第 3131 个字节附近的样例吗?
  • replace 在这里完全不相关;例外来自read(),甚至在您到达那里之前。异常意味着该文件不是 UTF-8(例如,它是 Latin-1 或 cp1252),但您尝试将其打开为 UTF-8。 (或者,可能是 UTF-8 但已损坏,但可能性较小。)
  • 您可以通过以二进制模式打开文件并仅使用字节字符串进行替换来解决问题。但可能更好的解决方案是使用正确的编码打开文件(是的,CP 1252 可能是一个不错的猜测,如果它不是 UTF-8,但它是 ASCII 的超集)。
  • 具体来说:UnicodeDecodeError 表示您正在尝试read/decode/等。编码错误的文本。 'utf-8' 是您尝试使用的编码(它是当今大多数事物的默认值)。 byte 0x80 in position 3131 有助于告诉您问题发生在哪里,因此您可以,例如,with open(path+file, 'rb') as f: print(f.read()[3100:3200]) 来调试问题。 (或者将其发布在 Stack Overflow 上,以便其他人可以调试它。)
  • @DanielPryden 另外,与 Latin-1 不同,cp1252 是 ASCII 的超集,其中 \x80'€',而不是非打印控制字符,所以……我可能应该首先建议一个。

标签: python replace


【解决方案1】:

您是否尝试将文件编码为 'UTF-8' ? 请检查Open函数参数,

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

在你的脚本中,尝试使用,

with open (path + file, 'r', encoding='windows-1252') as f:

您还可以查看编解码器库中提供的 open 方法。 请检查此问题。 Unicode (UTF-8) reading and writing to files in Python

UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 3131: invalid start byte

【讨论】:

  • 问题中的错误信息表明utf-8编解码器已经被使用(并且解码失败),所以这不是答案。
  • 什么,您找到了另一个问题的链接,该问题无法读取文件,并且在同一位置失败3131,并出现相同的错误?这很奇怪。
猜你喜欢
  • 1970-01-01
  • 2019-06-05
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 2019-08-21
  • 2022-01-12
  • 1970-01-01
相关资源
最近更新 更多