目录
问题
想用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()
这个方法基本适用绝大多数情况了