在工作中常常会伴随着一些沟通问题,主要表现为(经常在日常工作中处理统一码文件(or其他编码)?这篇必读)

全文共2717字,预计学习时长5分钟

图片来源:unsplash.com/@christinnoelle

对于那些经常在日常工作中处理统一码文件(也适用于其他编码)的人来说,这篇文章是必读的。对于自然语言处理的从业者,处理统一码文件是一场噩梦,尤其是使用Windows操作系统。想象一下,当在编码或解码过程中遇到错误时的沮丧,例如:

UnicodeEncodeError: mbcs codec cant decode characters in positionUnicodeDecodeError: charmap codec cant decode byte 0x90 in posi【我爱线报网】tion

大多数时候,除非是这个领域经验丰富的人,否则这样的错误并不能提供足够的信息。你可能会问为什么需要对字符进行编码和解码。我们可以从对统一码的简单解释来回答这个问题。

基于官方python文档,统一码Unicode (通用编码字符集)是一种规范,旨在列出人类语言使用的每个字符,并为每个字符提供各自独特的代码。统一码规范不断被修订和更新,以添加新的语言和符号。

因此,编码和解码是一种将字符从文本映射到字节的方法,反之亦然。这使得它们可在计算机之间传输,并在日常生活中使用。当拥有不同的操作系统集时,情况会更复杂。

此外,不同语言有各自的字符集,只能在特定字体下显示。简单而言,可以看作是将一个外文字符【我爱线报网】翻译成机器能理解的字符。本文将探讨一些可以用于处理Python中统一码文件的方法,从可用模式和标准编码来入手。

统一码联盟的官方标志

通过上下文管理器读写文件

打开文件最安全的方法是通过上下文管理器使用with语句。它将自动关闭文件,防止任何可能出现的问题。

with open(name.txt) as f: f.readlines()

默认模式是rt ,即读取和发送文件。可以使用以下代码编写:

with open(name.txt, w) as f: f.write(Hello world!)

上面的代码将改写并截断文件。在一些情况下,可能更喜欢使用模式 a而不是w。以下列【我爱线报网】表显示了可用的完整模式:

· r:打开阅读(默认)

· w:打开写入,首先截断文件

· x:打开专属创建,如果文件已经存在则失败

· a:打开写入,如果文件存在,则添加到文件末尾

· b:二进制模式

· t:文本模式(默认)

· +:打开一个磁盘文件进行更新(读写)

可以组合一些模式。如原始文档中所述(

https://docs.python.org/3.5/library/functions.html#open),对于二进制读写访问,模式w+b 打开并将文件截断为0字节。r+b 打开文件不会截断。

Python中的标准编码

在Python中指定编码,只需在上下文管理器初始化期间传入另一个参数。无论何时读写统一码字【我爱线报网】符,都需要指定它。以下例子显示了将统一码文本添加到现有文件的正确方法:

with open(name.txt, a, encoding=utf8) as f: f.write(你好!)

如果不确定使用哪种编码,只需输入 utf8并检查是否有误。大多情况下,UTF-8对于编码和解码字符已经够好了。然而在某些情况下,需要使用不同的编码。

更多关于可用编码的信息:

https://docs.python.org/3.7/library/codecs.html#standard-encodings

如果不知道文件中使用的什么编码该怎么办?一起进入下一部分来了解更多。

通过Notepad++检查编码【我爱线报网】类型

一般会更倾向使用Notepad++来查看文件内容。如果使用Notepad++打开一个文件,可以在用户界面的右下角看到使用的编码类型。

一个使用UTF-8编码的示例文件

可以通过编码菜单修改编码,它接受大量最常用的编码。

单击编码菜单时显示下拉菜单的图像

如果曾遇到过无法将文件转换为另一种编码的问题,或者即使正确地指定了某些编码,也无法读取,那么可以尝试以下方法。虽然有点笨,但亲测有效。

1. 用个人希望的编码创建一个空的文本文件。

2. 从原始文件中复制所有内容。

3. 将其粘贴到新文件并保存。

大多数情况下,这将自动将所有字符转换为新的编码。请注意,如果不能根据新的编码转换字符,可能会造成数据丢失。

处理【我爱线报网】未知编码中的字符

如果遇到无法识别编码且字符未知的情况,可以尝试修改错误参数来解决这个问题:

with open(name.txt, r, encoding=utf8, errors=ignore) as f: f.readlines()

错误参数指的是如何处理编码和解码错误。请注意,此参数不能在二进制模式中使用。可用错误的处理程序有:

· 严格:如果存在编码错误,则会造成ValueError 异常。None的默认值有相同效果。

· 忽略:忽略错误。注意,忽略编码错误会导致数据丢失。

· 替换:将替换标记(如?)插入有畸形数据的位置。

· surrogateescape:将统一码私有使用区域【我爱线报网】中的任何不正确字节表示为代码点,范围从U+DC80到U+DCFF。当这个错误处理程序用于编写数据时,这些私有代码点将被转为相同字节。这对于处理未知编码的文件很有用。

· xmlcharrefreplace:仅在写入文件时受支持。不受编码支持的字符将被替换为适当的可扩展标记语言的字符引用 nnn;。

· backslashreplace:用Python的backslash转义字符替换畸形数据。

· namereplace:(仅在编写时支持)替换不支持的 \N{…} 转义字符。

在命令提示符中显示统一码字符

如果在Windows操作系统中运行命令提示符,那么在大多数情况下显示统一码字符都会有问题,出现如【我爱线报网】下图所示的乱码字符:

显示乱码字符的命令提示符

为了解决这个问题,需要将设置更改为正确的字体。

1. 右键单击顶部菜单并单击属性。

2. 单击字体菜单。

3. 将字体修改为可显示字符的所需字体。例如,可以使用楷体来呈现中文字符。

命令提示符的字体属性

打开一个有统一码字符的文件路径——通过pandas模块适用于read_csv

这部分有点棘手,尤其是在使用某些特定Python模块(如pandas)时。假设有以下非英语的文件路径:

file_path = C:\path\to\数据分析\data.csv

试图通过read_csv读取文件将会抛出错误,因为文件路径包含统一码字符。在Python中使用内置的open()【我爱线报网】函数不是问题所在。为了解决这个问题,需要先打开文件,然后传递给read_csv函数:

with open(file_path, r, encoding=utf-8) as f: df = pd.read_csv(f, encoding=utf-8)

留言 点赞 关注

我们一起分享AI学习与发展的干货

编译组:杨雨心、蒋馨怡

相关链接:

https://medium.com/better-programming/tips-and-tricks-for-handling-unicode-files-in-python-e8a88b7ba047

推荐阅读

给力项目线报网会员可免费下载 加入会员
友情提醒: 请尽量登录购买,防止付款了不发货!
QQ交流群:226333560 站长微信:qgzmt2
温馨提示:本站提供的一切软件、教程和内容信息都来自网络收集整理,仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负,版权争议与本站无关。用户必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。如果您喜欢该程序和内容,请支持正版,购买注册,得到更好的正版服务。我们非常重视版权问题,如有侵权请邮件与我们联系处理。敬请谅解!

给TA打赏
共{{data.count}}人
人已打赏
行业资讯

政府会计制度事业支出的明细科目设置(简单学政府会计之:事业支出的处理)

2024-10-9 14:37:16

行业资讯

双阴洗盘法(K线分析之“双阴洗盘”战法大揭秘)

2024-10-9 14:58:46

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索