Python去除\ufeff、\xa0、\u3000等字符 - iyuluo
文章推薦指數: 80 %
在使用Python处理一些txt或者csv文件过程中,在输出的一些结果里面会有一些特殊的字符例如:\ufeff、\xa0、\u3000 简单来说,这三个字符串分别是字节 ...
HomeArchivesCategoriesTagsAboutPosted 2022-08-31Updated 2022-08-31Python12minutesread(About1776words)Python去除\ufeff、\xa0、\u3000等字符在使用Python处理一些txt或者csv文件过程中,在输出的一些结果里面会有一些特殊的字符例如:\ufeff、\xa0、\u3000
简单来说,这三个字符串分别是字节顺序标记,不间断空白符,全角的空白符。
分别可以使用以下的方法去除。
1、去除\ufeff一般会出现在文件的最开始,也叫头文件,表明了改文件的编码方式。
一般在读取的时候提示FileNotFoundError:「Errno2]Nosuchfileordirectory:'\ufeffA.txt'一般只需改一下编码,把utf-8编码改成utf-8-sig
12withopen(file_path,'r',encoding='UTF-8-sig')asf:s=f.read()
2、去除\xa0\xa0是不间断空白符
我们通常所用的空格是\x20,是在标准ASCII可见字符0x200x7e范围内。
而\xa0属于latin1(ISO/IEC_8859-1)中的扩展字符集字符,代表空白符nbsp(non-breakingspace)。
latin1字符集向下兼容ASCII(0x200x7e)。
通常我们见到的字符多数是latin1的,比如在MySQL数据库中。
1str.replace(u'\xa0',u'')
3、去除\u3000根据Unicode编码标准及其基本多语言面的定义,\u3000属于CJK字符的CJK标点符号区块内,是空白字符之一。
它的名字是IdeographicSpace,有人译作表意字空格、象形字空格等。
顾名思义,就是全角的CJK空格。
它跟nbsp不一样,是可以被换行间断的。
常用于制造缩进.
1str.replace(u'\u3000',u'')
同时去除空格和\xa0、\u3000
1title.strip().replace(u'\u3000',u'').replace(u'\xa0',u'')
编码概念ANSCII:标准的ANSCII编码只使用7个比特来表示一个字符,因此最多编码128个字符。
扩充的ANSCII使用8个比特来表示一个字符,最多也只能编码256个字符。
Unicode:使用2个甚至4个字节来编码一个字符,因此可以将世界上所有的字符进行统一编码。
UTF:Unicode编码转换格式,就是用来指导如何将Unicode编码成适合文件存储和网络传输的字节序列的形式(unicode->str)。
像其他的一些编码方式gb2312,gb18030,big5和UTF的作用是一样的,只是编码方式不同。
在Windows下用文本编辑器创建的文本文件,如果选择以UTF-8等Unicode格式保存,会在文件头(第一个字符)加入一个BOM标识。
BOMBOM=ByteOrderMark是Unicode规范中推荐的标记字节顺序的方法。
比如说对于UTF-16,如果接收者收到的BOM是FEFF,表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。
UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明“我是UTF-8编码”。
BOM的UTF-8编码是EFBBBF(用UltraEdit打开文本、切换到16进制可以看到)。
所以如果接收者收到以EFBBBF开头的字节流,就知道这是UTF-8编码了。
关于\ufeff字节顺序标记(英语:byte-ordermark,BOM)是位于码点U+FEFF的统一码字符的名称。
当以UTF-16或UTF-32来将UCS/统一码字符所组成的字符串编码时,这个字符被用来标示其字节序。
它常被用来当做标示文件是以UTF-8、UTF-16或UTF-32编码的记号。
字符U+FEFF如果出现在字节流的开头,则用来标识该字节流的字节序,是高位在前还是低位在前。
如果它出现在字节流的中间,则表达零宽度非换行空格的意义,用户看起来就是一个空格。
从Unicode3.2开始,U+FEFF只能出现在字节流的开头,只能用于标识字节序,就如它的名称——字节序标记——所表示的一样;除此以外的用法已被舍弃。
取而代之的是,使用U+2060来表达零宽度无断空白。
在UTF-16中,字节顺序标记被放置为文件或字符串流的第一个字符,以标示在此文件或字符串流中,以所有十六比特为单位的字码的尾序(字节顺序)。
如果十六比特单位被表示成大尾序,这字节顺序标记字符在序列中将呈现0xFE,其后跟着0xFF(其中的0x用来标示十六进制)。
如果十六比特单位使用小尾序,这个字节序列为0xFF,其后接着0xFE。
而统一码中,值为U+FFFE的码位被保证将不会被指定成一个统一码字符。
这意味着0xFF、0xFE将只能被解释成小尾序中的U+FEFF(因为不可能是大尾序中的U+FFFE)。
UTF-8则没有字节顺序的议题。
UTF-8编码过的字节顺序标记则被用来标示它是UTF-8的文件。
它只用来标示一个UTF-8的文件,而不用来说明字节顺序。
[1]许多视窗程序(包含记事本)会添加字节顺序标记到UTF-8文件。
然而,在类Unix系统(大量使用文本文件,用于文件格式,用于进程间通信)中,这种做法则不被建议采用。
因为它会妨碍到如解译器脚本开头的Shebang等的一些重要的码的正确处理。
它亦会影响到无法识别它的编程语言。
如gcc会报告源码档开头有无法识别的字符。
而在PHP中,如果没有激活输出缓冲(outputbuffering),它会使得页面内容开始被送往浏览器(即:用户头文件已被提交),这使PHP脚本无法指定用户头文件(HTTPHeader)。
字节顺序标记在UTF-8中被表示为序列EFBBBF,对大部分未准备好处理UTF-8的文本编辑器及网页浏览器而言,在ISO-8859-1的环境中则会显示。
虽然字节顺序标记亦可以用于UTF-32,但这个编码很少用于传输,其规则如同UTF-16。
对于已于IANA注册的字符集UTF-16BE、UTF-16LE、UTF-32BE和UTF-32LE等来说,不可使用字节顺序标记。
文档开头的U+FEFF会被解释成一个(已舍弃的)”零宽度无断空白”,因为这些字符集的名字已决定了其字节顺序。
对于已注册字符集UTF-16和UTF-32来说,一个开头的U+FEFF则用来表示字节顺序。
#csvLikethisarticle?SupporttheauthorwithBuymeacoffeePython更美观输出字典使用Python获取csv的某行、列的数据CommentsyuluoMyvisionMylifeEarthPosts203Categories21Tags48FollowRecents2022-09-01Python更美观输出字典Python2022-08-31Python去除\ufeff、\xa0、\u3000等字符Python2022-08-31使用Python获取csv的某行、列的数据Python2022-08-29在Debian上安装pip包管理器Python2022-08-09Python的Yaml用法PythonYourbrowserisout-of-date!Updateyourbrowsertoviewthiswebsitecorrectly.&npsb;Updatemybrowsernow××
延伸文章資訊
- 1How to read correctly Japanese characters from a file without ...
I've got the next result in the python prompt for the list. >>> jP ['\ufeffさよなら\u3000夜の教室',]. Is ...
- 2python:unicode問題 - 程式人生
Downloads/lamp-post.csv", 'r') data = file.readlines() data[0] ... \u7000\u7000\u7000\u6f00\u7300...
- 3第二十五天Jenkins 之旅: 我的BI 報表Pipeline (5) - iT 邦幫忙
下面程式為範例我寫的Python script,讓我們可以在command line 操作與Mongo 資料 ... _clean_data(text: str) -> str: return ...
- 4Python去除抓取字段中的特殊字符 - 台部落
import re str =' \n \u3000\u30001912年4月10日,號稱“世界工業史上的奇蹟”的 ... Python處理csv文件CSV(Comma-Separated Va...
- 5python UTF-8转GBK字符编码问题(BOM) - SegmentFault
python去除ufeff、xa0、u3000 不知道为什么,明明是utf-8偏偏会遇到bom的问题, ... 'r', encoding='utf-8') as f: reader = csv...