UnicodeDecodeError: ‘‘ codec can‘t decode byte 0xb0 in position : invalid start byte,批量读取不同编码文件的解决方法

目录

问题

以下是踩过的坑:

 解决方案

读取单个文件

批量读取文件

方法一:

方法二


参考博客:(45条消息) Python读取各种格式的txt文档(ANSI、Unicode、Unicode big endian、UTF-8等)_Ltinginger的博客-CSDN博客_python读取ansi编码文件

问题

想用python打开一个.dat的文件,代码及报错如下:

以下是踩过的坑:

默认编码格式是utf-8,这个格式读取错误,就看看文件是什么格式,把编码格式换一换呗

最简单的方法,用记事本打开,另存为 这个时候可以看到编码格式为ANSI,ok,那就把解码格式改为这个

修改过后,还是报错

 也尝试了gbk,gb18030等等什么的,弄了好大一圈也没有解决,直到看到这篇可以查看具体编码格式的博客:(45条消息) Python读取各种格式的txt文档(ANSI、Unicode、Unicode big endian、UTF-8等)_Ltinginger的博客-CSDN博客_python读取ansi编码文件

 解决方案

读取单个文件

用代码查看,这个文件用的到底是哪种格式的编码

try:
	f = open('171017-1656_#24.txt','rb')	#打开txt文档
	r = f.read()	#读取
	f_charInfo = chardet.detect(r) #获取文本编码信息
	print(f_charInfo)
	f.close()
except:
	if f:
		f.close()
		print('err')

 输出:{'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''}

不得不说标准是真多,完全没听说过的,修改后尝试

fp=open('171017-1656_#23.txt',encoding='ISO-8859-1')  #gb18030
lines = fp.readline()
fp.close()
print(lines)

 输出:

EXPLAIN

就是文件第一行内容,完全输出对比查看也是正确的。

如果只读取一个文件,到这里就可以结束了

批量读取文件

如果需要批量读取文件,上面的方法一个一个的去查看就有点麻烦了,我提供两种解决思路,仅供参考

方法一:

循环输出每个文件的编码格式

import os
import chardet

path = r"C:\Users\Desktop\learn\金属腐蚀\qwe" #文件夹目录
files= os.listdir(path) #得到文件夹下的所有文件名称

for file in files: #遍历文件夹
    position = path+'\\'+ file
    print (file) 
    try:
	    f = open(position,'rb')	#打开文档
	    r = f.read()	#读取
	    f_charInfo = chardet.detect(r) #获取文本编码信息
	    print(f_charInfo)
	    f.close()
    except:
	    if f:
		    f.close()
		    print('err')

 看输出结果编码格式都是一样的,读取的时候统一修改就好,如果有不同格式的编码文件,这样就行不通了,看下面的方法二

方法二

顺序读出各个文件的编码格式,并将其保存在一个字典当中,然后读取的时候将解码格式设置为其对应的编码格式即可

a = {}
for file in files: #遍历文件夹
	position = path+'\\'+ file
	#print (file)
	fr = open(position,'rb')	    #打开文档
	r = fr.read()	  #读取
	fr_charInfo = chardet.detect(r)    #获取文本编码信息
	#print(f_charInfo['encoding'])
	a[file] = fr_charInfo['encoding']
	fr.close()

#a的结果
"""a = {'171017-1656_#23.txt': 'utf-8', '171017-1656_#24.txt': 'ISO-8859-1', 
'171017-1656_#25.txt': 'ISO-8859-1', '171017-1656_#26.txt': 'ISO-8859-1', 
'171017-1656_#27.txt': 'ISO-8859-1', '171017-1656_#28.txt': 'ISO-8859-1', 
'171017-1656_#29.txt': 'ISO-8859-1', '171017-1656_#30.txt': 'ISO-8859-1', 
'171017-1656_#31.txt': 'ISO-8859-1', '171017-1656_#32.txt': 'ISO-8859-1',
 '171017-1656_#33.txt': 'ISO-8859-1', '171017-1656_#34.txt': 'ISO-8859-1', 
'171017-1656_#35.txt': 'ISO-8859-1'}"""

#读取的时候加上其对应格式
with open(position, "r",encoding=a[file]) as fp:    #打开文件        
        lines = fp.readlines()   #读取文件中
        fp.close()

这个方法基本适用绝大多数情况了

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值