c++读取utf8文件_经常在日常工作中处理统一码文件(or其他编码)?这篇必读
全文共2717字,预计学习时长5分钟
对于那些经常在日常工作中处理统一码文件(也适用于其他编码)的人来说,这篇文章是必读的。对于自然语言处理的从业者,处理统一码文件是一场噩梦,尤其是使用Windows操作系统。想象一下,当在编码或解码过程中遇到错误时的沮丧,例如:
UnicodeEncodeError: 'mbcs' codec can't decode characters in positionUnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position
大多数时候,除非是这个领域经验丰富的人,否则这样的错误并不能提供足够的信息。你可能会问为什么需要对字符进行编码和解码。我们可以从对统一码的简单解释来回答这个问题。
基于官方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:patho数据分析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
c++读取utf8文件_经常在日常工作中处理统一码文件(or其他编码)?这篇必读相关推荐
- java 删除过期文件_定时脚本: 删除HDFS中的过期文件
1. 基本原理: 通过hadoop fs -ls *命令获取相关文件或目录的修改时间,然后与设定的过期时间进行比较,之后执行删除操作即可 2. 相关代码: #!/bin/bash source ~/. ...
- 拆分文件_领导让把工作表拆分每个文件,我花半个小时,同事1分钟搞定了
领导发给我1个工作簿文件,希望我把里面每个工作里面都单独保存出来 如果工作表比较少,可以一个个手动的复制粘贴,花了将近半个小时,同事用这个技巧,直接1分钟就拆分完成了. 操作的步骤如下: ❶点击开发工 ...
- 大华视频服务器系统日志怎么看,日常工作中查看工控机Windows日志的方法
原标题:日常工作中查看工控机Windows日志的方法 工控机Windows日志位于工控机管理的事件查看器中,主要是用于存储来自应用程序以及整个系统的文件.一般可以分为应用程序日志.安全日志.系统日志这 ...
- 办公室计算机知识论文,办公室日常工作中办公自动化的运用-计算机应用技术论文-计算机论文.docx...
办公室日常工作中办公自动化的运用-计算机应用技术论文-计算机论文 --文章均为WORD文档,下载后可直接编辑使用亦可打印-- 摘 要: 办公室管理是企业发展的重要组成部分, 传统办公室管理需使用大量的 ...
- 日常工作中如何自我提升?
阅读本文耗时5分钟左右 不知道大家有没有遇到 虽然做了很多事情,但遇到类似的问题还是没有解决思路.同类型的问题还是很迷茫.接下来给大家3秒钟思考一下原因 ? 我相信大家已经有了答案.比如工作很忙没有时 ...
- 日常工作中常用的几个git指令
前言 最近,我的主管让我就git 使用做个组内分享,分享一下我在日常工作中是如何使用git的.现在我整理成文章,分享出来,希望对你有所帮助. 基础概念 git有三个分区,分别是: 工作区(Workin ...
- 日常工作中,软件测试人员如何避免“背锅”
作为一名软件测试工程师,日常工作中最常打交道的肯定就是开发和产品经理.有沟通就会问题,有问题难免会有争执.那么你肯定听过这些话: "这么弱智的bug你都测不出来吗?" " ...
- 业务团队如何在日常工作中做稳定性?涵盖事前、事中、事后的方方面面
你好呀,我是Bella酱- "又不是不能用,能用就行.""又不是不能跑,能跑就行.程序和人有一个能跑就行." 相信很多同学都听过这2句话.乍听没毛病.编程3部曲 ...
- RIP 此篇用来记录日常工作中使用到的正则表达式
在工作中偶尔会使用到正则表达式, 每次用到之后都是上网找, 太浪费时间了, 所以此贴专门用于收录日常工作中使用到的正则表达式 ( 不要问我为什么不自己学学正则表达式, 因为: lan ) 用心 ...
最新文章
- node.js开发环境配置
- 雅虎将于4月底关闭自助式广告测试
- AdlinkMotionCardLibrary函数C++
- 玩转 VS Code 专栏
- css如何做玻璃效果_3种常见的断桥铝门窗玻璃,它们的隔音降噪效果如何?
- (python)7-6 sdut-数制转换
- php5.6获取文件名,PHP 5.6:headers_sent间歇性地返回true,空文件名和第0行
- POJ3262 Protecting the Flowers【贪心】
- stl vector 容量与大小之间的关系
- 关于前端样式定位的一些自己的看法
- python字典成绩_python字典总结
- 现代软件工程团队项目贝塔阶段_大规模测试结果_2018.02.08
- GDT 全局描述符表
- ASTC压缩格式总结
- Panda白话 - G1垃圾收集器
- 2.Java语言基础——流程控制语句与方法
- 利用Spire实现对Word模板的指定文字替换(文字、图片、表格)
- 分享Silverlight/WPF/Windows Phone一周学习导读(06月20日-06月26日)
- 如何转换图片格式为jpg?教你两种转换方法
- 我参加了资金盘培训,get了这些“知识点”
热门文章
- getDeclaredFields()应用
- shell 变量定义使用
- 聚焦智造 共筑生态——“2016智能硬件生态圈品牌交流会”即将举行
- vmware克隆Centos6.4虚拟机网卡无法启动问题
- nginx 服务脚本编写模板
- Node服务一键离线部署
- 在cshtml中显示FCKeditor编辑器控件
- 与afreez一起学习DirectFB之:一个linux下的framebuffer例子的学问
- 6个炫酷又好用的 Python 工具,个个都很奔放呀
- 软件问题造成的经济损失案例_公司印章管理使用哪些行为会造成法律风险隐患...