\ufeff的解决方法
用"utf-8"编码方式读取带有BOM的文件时,它会把BOM当做是文件内容来处理, 也就会发生错误.
解决方法
str.encode('utf-8').decode('utf-8-sig')
实例
with open("path.txt", "r", encoding="utf-8") as f: # 第一步:打开文件
text = f.readline() # 第二步:读取文件
print(text)
print(type(text))
text = text.encode('utf-8').decode('utf-8-sig')
dddd = os.listdir(text)
print(dddd)
问题产生的原因
UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明“我是UTF-8编码”
什么是BOM?
BOM = Byte Order Mark
BOM是Unicode规范中推荐的标记字节顺序的方法。
比如说对于UTF-16,如果接收者收到的BOM是FEFF,表明这个字节流是Big-Endian的;
如果收到FFFE,就表明这个字节流是Little-Endian的。
# conding=utf-8
f = open("news.txt", "r",encoding='utf-8')
file = f.read()
file_list = file.split(",")
print(file_list)
file_list2 = file.encode('utf-8').decode('utf-8-sig')
print(file_list2)
#打印结果如下
['\ufeff新华社北京2月8日电2月8日']
新华社北京2月8日电2月8日
utf-8 与utf-8-sig的区别如下:
1、”utf-8“ 是以字节为编码单元,它的字节顺序在所有系统中都是一样的,没有字节序问题,因此它不需要BOM,所以当用"utf-8"编码方式读取带有BOM的文件时,它会把BOM当做是文件内容来处理, 也就会发生错误.
2、“utf-8-sig"中sig全拼为 signature 也就是"带有签名的utf-8”, 因此"utf-8-sig"读取带有BOM的"utf-8文件时"会把BOM单独处理,与文本内容隔离开,也是我们期望的结果.