admin管理员组文章数量:1610834
目录
问题
以下是踩过的坑:
解决方案
读取单个文件
批量读取文件
方法一:
方法二
参考博客:(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()
这个方法基本适用绝大多数情况了
版权声明:本文标题:UnicodeDecodeError: ‘‘ codec can‘t decode byte 0xb0 in position : invalid start byte,批量读取不同编码文件的解决方法 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1728604045a1165226.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论