我有一个带关键字的文本文件,我使用
with open('filename.txt','r') as file:
list_of_words = [x.strip('\n') for x in file.readlines()
我得到了: UnicodeDecodeError:'ascii'编解码器无法解码位置5595中的字节0xc4:序号不在范围内(128) 在第2行
我理解错误。我不明白为什么会在第2行。
根据python docs:https://docs.python.org/3/library/functions.html#open
在文本模式下(默认情况下,或模式中包含“t”时) 参数),文件的内容以str,字节为单位返回 首先使用平台相关编码或使用解码 给定的指定编码。
这意味着在打开文件时,解密过程在打开文件时发生并在'file'变量中返回。
为什么我在第2行会收到错误?
答案 0 :(得分:3)
打开文件实际上并未检查内容。只有当某些文件数据通过执行读取的多种方法之一返回时,才能解码内容。
答案 1 :(得分:2)
您不会立即收到错误,因为文件刚刚打开,而不是从第1行读取。打开文件只涉及从操作系统获取文件的句柄 - 没有正在读取的内容。
仅当您调用readlines
,read
,迭代文件或以其他方式从文件中读取实际获取内容时,最初为字节。然后解码这些字节,然后才发现它们在指定的编码中不是有效的。
如果你没有指定编码,python guesses it from the operating system configuration:
encoding
是用于解码或编码(...)的编码的名称。默认编码取决于平台(无论locale.getpreferredencoding()返回什么)
您的系统locale.getpreferredencoding()
似乎返回ASCII,并且该文件未以ASCII编码。
只需指定正确的编码:
with open('filename.txt', 'r', encoding='utf-8') as file:
list_of_words = [line.strip('\n') for line in file]
答案 2 :(得分:2)
对于从文件对象中读取的实际过程,您似乎对open()
调用返回的file object感到困惑。
Python在您阅读时解码文件的内容。打开文件对象不会读取文件中的任何数据,只会创建文件对象。此时没有从文件中读取数据,Python没有字节可以处理 。
在第2行中,您使用file.readlines()
方法从文件中实际读取。 该方法告诉文件对象从文件系统中获取数据(字节)并解码这些字节。只有然后才能让Python知道数据实际上无法解码为ASCII。
答案 3 :(得分:0)
实际上,这只是文档中措辞不当的解释。 Open函数不读取任何内容,它只返回具有指定模式的文件句柄和从OS传递给它的编码。