对于那些在日常工作中经常处理Unicode文档(也适用于其他编码)的??人来说,这篇文章是必读的。对于自然语言处理的从业者来说,处理Unicode文件是一场噩梦,尤其是在使用Windows操作系统时。想象一下在编码或解码过程中遇到错误时的挫败感,例如:UnicodeEncodeError:'mbcs'codeccan'tdecodecharactersinpositionUnicodeDecodeError:'charmap'codeccan'tdecodebyte0x90inposition大多数时候,除非有人在这个领域有经验,否则错误信息不够丰富。您可能会问为什么需要对字符进行编码和解码。我们可以从Unicode的简单解释来回答这个问题。Unicode(UniversalCodedCharacterSet)是一种基于python官方文档的规范,旨在列出人类语言中使用的每个字符,并为每个字符赋予自己唯一的代码。Unicode规范不断被修订和更新以添加新的语言和符号。所以编码和解码是一种将字符从文本映射到字节的方式,反之亦然。这使得它们可以在计算机之间传输并在日常生活中使用。当您拥有一组不同的操作系统时,事情会变得更加复杂。另外,不同的语言有自己的字符集,只能以特定的字体显示。简单来说,可以看成是把一个外来的字符翻译成机器能看懂的字符。本文将从可用模式和标准编码开始,探讨一些可用于在Python中处理Unicode文件的方法。UnicodeConsortium官方标志通过上下文管理器读写文件打开文件最安全的方法是使用with语句通过上下文管理器。它会自动关闭文件,防止任何可能的问题。withopen('name.txt')asf:f.readlines()默认模式为'rt',读取和发送文件。可以这样写:withopen('name.txt','w')asf:f.write('Helloworld!')以上代码将覆盖并截断文件。在某些情况下,使用模式“a”而不是“w”可能更可取。以下列表显示了可用的完整模式:r:以读方式打开(默认)w:以写方式打开,首先截断文件x:以独占方式打开,如果文件已存在则失败a:以写方式打开,如果文件存在则添加endoffileb:binarymodet:textmode(default)+:openadiskfileforupdate(readandwrite)有些模式可以组合。如原始文档(https://docs.python.org/3.5/library/functions.html#open)中所述,对于二进制读写访问,模式“w+b”打开文件并将其截断为0字节。'r+b'打开文件而不截断。Python中的标准编码要在Python中指定编码,只需在上下文管理器初始化期间传入另一个参数。每当读取或写入Unicode字符时都需要指定它。以下示例显示了将Unicode文本添加到现有文件的正确方法:withopen('name.txt','a',encoding='utf8')asf:f.write('Hello!')ifunsureWhichencodingto使用,只要输入utf8,检查错误即可。在大多数情况下,UTF-8足以对字符进行编码和解码。然而,在某些情况下,需要使用不同的编码。有关可用编码的更多信息:https://docs.python.org/3.7/library/codecs.html#standard-encodings如果您不知道文件中使用的编码怎么办?让我们转到下一节以了解更多信息。通过Notepad++查看编码类型一般优先使用Notepad++查看文件内容。如果您使用Notepad++打开文件,您可以在用户界面的右下角看到使用的编码类型。以UTF-8编码的示例文件。可以通过编码菜单更改编码,该菜单接受许多最常用的编码。单击编码菜单时显示下拉菜单的图像如果您在将文件转换为另一种编码时遇到问题,或者即使指定正确也无法读取某些编码,可以尝试以下方法。这有点愚蠢,但它确实有效。使用所需的编码创建一个空文本文件。复制原始文件中的所有内容。将其粘贴到一个新文件中并保存。在大多数情况下,这会自动将所有字符转换为新编码。请注意,如果无法根据新编码转换字符,可能会导致数据丢失。HandleCharactersinunknownencodings如果遇到无法识别编码,字符未知的情况,可以尝试修改错误参数来解决这个问题:withopen('name.txt','r',encoding='utf8',errors='ignore')asf:f.readlines()error参数是指如何处理编码和解码错误。请注意,此参数不能用于二进制模式。可用的错误处理程序有:Strict:如果存在编码错误,则引发ValueError异常。默认值None具有相同的效果。忽略:忽略错误。请注意,忽略编码错误将导致数据丢失。替换:在有格式错误的数据处插入替换标记(例如'?')。surrogateescape:将UnicodePrivateUseArea中任何不正确的字节表示为代码点,范围从U+DC80到U+DCFF。当使用这个错误处理程序写入数据时,这些私有代码点将被转换为相同的字节。这对于处理未知编码的文件很有用。xmlcharrefreplace:仅在写入文件时受支持。编码不支持的字符将替换为适当的XML字符引用nnn;。backslashreplace:用Python的反斜杠转义字符替换格式错误的数据。namereplace:(仅在写入时支持)替换不支持的\N{...}转义字符。命令提示符显示Unicode字符如果在Windows操作系统下运行命令提示符,多数情况下Unicode字符显示会出现问题,出现乱码,如下图所示:命令提示符显示乱码要解决这个问题,需要将设置更改为正确的字体。右键单击顶部菜单,然后单击“属性”。单击字体菜单。将字体修改为可以显示字符的所需字体。例如,可以使用Kai渲染汉字。命令提示符的字体属性打开一个带有unicode字符的文件路径——通过pandas模块应用于read_csv的部分有点棘手,尤其是在使用某些Python模块(如pandas)时。假设以下非英文文件路径:file_path='C:\path\to\DataAnalysis\data.csv'尝试通过read_csv读取文件将引发错误,因为文件路径包含Unicode字符。在Python中使用内置的open()函数不是问题。要解决这个问题,需要先打开文件,然后传递给read_csv函数:withopen(file_path,'r',encoding='utf-8')asf:df=pd.read_csv(f,encoding='utf-8')
