有时候我们要读取txt文档,然后以中文的形式输出返回,但是有时候txt文档的保存格式为ANSI、Unicode等,这样读取出来的文本是乱码的。
下面我们把txt文档另存为Unicode格式,
然后读取
try:
#打开txt文档
f = open('E:\\a file.txt','rb')
#读取
r = f.read()
print(r)
f.close()
except:
if f:
f.close()
print('err')
我们可以看到“谈笑有鸿儒,往来无白丁”变成这样了!
这是正常的读取方法,我在网上找了很多以x开头的编码格式,还是没有找到,一开始以为是二进制的编码格式,可是二进制的编码格式为:这样的才对???
咋一看差别还是挺大的
这里有一个最麻烦的解决办法,就是把txt另存为UTF-8格式,这里就不演示了
接下来我们来看看大招:
chardet.detect() #必杀:读取文本编码格式
try:
f = open('E:\\a file.txt','rb') #打开txt文档
r = f.read() #读取
f_charInfo = chardet.detect(r) #获取文本编码信息
print(f_charInfo)
f.close()
except:
if f:
f.close()
print('err')
然后输出结果
编码格式为UTF-16?????
行,我们改造一下代码,以UTF-16的格式读取不就行了嘛
try:
f = open('E:\\a file.txt','rb') #打开txt文档
r = f.read() #读取
f_charInfo = chardet.detect(r) #获取文本编码信息
print(r.decode('UTF-16')) #-------------------------只修改这一句-------------------
f.close()
except:
if f:
f.close()
print('err')
输出结果很舒服
但是问题来了
每次都要读取编码格式
然后再修改读取格式,岂不是很麻烦?
我们来看看之前的输出结果
try:
f = open('E:\\a file.txt','rb') #打开txt文档
r = f.read() #读取
f_charInfo = chardet.detect(r) #获取文本编码信息
print(f_charInfo)
print('Type:',type(f_charInfo))
f.close()
except:
if f:
f.close()
print('err')
他返回的是一个idct(字典)
那只要取出UTF-16就行了啊,类似于键值对,encoding是键,UTF-16是值,值会因为txt文档的存储格式而改变
f_charInfo['encoding'] = 'UTF-16'啊
所以我们把通过key取得的value作为一个文本读取的变量就行了啊???
try:
f = open('E:\\a file.txt','rb')
r = f.read()
#获取文本的编码方式
f_charInfo = chardet.detect(r)
print(f_charInfo) #输出文本格式信息
print(f_charInfo['encoding']) #取得文本格式
print(r.decode(f_charInfo['encoding'])) #通过取得的文本格式读取txt
f.close()
except:
if f:
f.close()
print('err')
这样就变成了万能的读取文本的工具了!
接下来我们尝试读取不同编码格式的文件
首先另存为ANSI???
然后是Unicodie bing endian
完美
谢谢!