python - 打开随机文件时出现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:字符映射到
解决方案
首先,您提供的代码无法运行;你忘记了一些必要的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 则失败。)
推荐阅读
- python - 用相似的索引替换 Pandas DataFrames 中的值
- ruby - 在 Rspec 中的特定测试后运行块
- ruby-on-rails - 可以通过在 Node 上运行的 Socket 从 Rails 发布吗?
- amazon-web-services - Route 53 AWS 配置
- xamarin - Xamarin ListView 绑定不起作用
- java - 使用 java.awt 和 java.swing 获取要在框架上显示的 file.png 图像
- c++ - C ++如何将unique_ptr的队列添加到向量中
- ios - 在容器视图中单击按钮时,是否可以仅更改部分布局?
- salesforce - 试图清除 ApexPages.Messages 容器
- javascript - 在 ThreeJS 中创建一个三折纸示例