【发布时间】: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是'€',而不是非打印控制字符,所以……我可能应该首先建议一个。