首页 > 解决方案 > 打开随机文件时出现UnicodeDecodeError错误?

问题描述

我正在尝试在目录中打开一个随机文件并搜索一个字符串。但是,我得到一个错误。是我使用的路径错误还是我试图读取文件的方式错误?

path = "C:\\Users\\ASDF\\Desktop\\profiles2\\"
random_file = random.choice(os.listdir(path))
filepath = os.path.join(path, random_file)
data = open(filepath).read()
if 'xpression' in data:
    print("true")
return codecs.charmap_decode(input,self.errors,decoding_table)[0]

UnicodeDecodeError:“charmap”编解码器无法解码位置 9502 中的字节 0x9d:字符映射到

标签: python

解决方案


首先,您提供的代码无法运行;你忘记了一些必要的import陈述。

你得到 UnicodeDecodeError 是因为 Python 文本文件的默认编码是 UTF-8,如果你从计算机中选择任何随机文件,它可能根本不是 UTF-8 编码的——或者甚至不是一个文本文件开头。此时,Unicode UTF8 字符解码器无法解码输入。

如果将编码指定为latin1,则 Python 假定字节到字符的一对一编码,并且它不会再尝试“好像”解码它是 UTF-8。这就解决了一个问题。

解决这个问题后,我的随机实验中又出现了一个:os.listdir不仅返回文件列表,还可能包括文件夹。您可以让程序停止并显示相应的错误消息,但您也可以在选择文件夹之前从列表中删除文件夹。有几种方法可以做到这一点——os.walk例如——但我发现了一条神奇的线,可以os.listdir如何列出目录的所有文件?.

以下代码在我的系统上正常工作;一次又一次地运行它,有时它会说“真”(诚然,我不得不为此更改测试文本;您的原始文本xpression在我自己的文件中出现的频率太低而无法测试)。

import random,os

path = "."
random_file = random.choice([f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))])
print (random_file)

filepath = os.path.join(path, random_file)

with open(filepath, encoding='latin1') as file:
    data = file.read()
    if 'test' in data:
        print("true")

这适用于编码设置为,latin1因为它处理纯 ASCII 数据,并且不打扰任何二进制内容。但是,如果您的搜索文本包含非 ASCII 字符(例如重音字母),它将随机失败或成功。(仅当该随机文件恰好也被编码为 Latin-1时才会成功,但如果它是 UTF-8 则失败。)


推荐阅读