赞
踩
一般会出现的问题
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position 0: invalid continuation byte
UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 2: illegal multibyte sequence
主要原因是:文件夹中的txt文件包含不同种的编码格式。
如何查看txt文件的编码格式:
打开txt文件,选择文件->另存为,下面就可以看到编码格式了,我遇到的情况是txt文件有两种格式UTF-8和ANSI两种格式。
具体使用是try except去解决这个问题
- try:
- 正常的操作
- ......................
- except:
- 发生异常,执行这块代码
- ......................
法一
- import os
-
- if __name__ == '__main__':
- imageDir = "test/"
- for imageName in os.listdir(imageDir):
- txtPATH = os.path.join(imageDir, imageName)
- print("txtPATH \t", txtPATH)
- try:
- f = open(txtPATH, 'r', encoding='gbk')
- lines = f.readlines()
- except:
- print("enter except")
- f = open(txtPATH, 'r', encoding='utf8')
- lines = f.readlines()
- print(lines)
注意:encoding=gbk解决的是ANSI编码格式的txt文件,utf8解决的是UTF-8编码格式的txt文件
其中f = open(txtPATH, 'r', encoding='gbk')是不会报错的,只有读取f.readlines()的时候才会报错。
法二
- import os
-
- if __name__ == '__main__':
- imageDir = "test/"
- for imageName in os.listdir(imageDir):
- txtPATH = os.path.join(imageDir, imageName)
- print("txtPATH \t", txtPATH)
- f = open(txtPATH, 'rb')
- line = f.readlines()[0]
- try:
- line = line.decode('utf8')
- except:
- line = line.decode('gbk')
- print(line)
法三
知道txt文件的编码格式,然后再进行读取,理论上是可以的。但是在读取ANSI编码格式的txt文件,每次读取的编码格式都不一样。
这里面只是做了一个测试,没有解决问题,主要原因是chardet库得到txt编码格式不是很准确。
- import chardet
- import os
-
- if __name__ == '__main__':
- imageDir = "test/"
- for imageName in os.listdir(imageDir):
- txtPATH = os.path.join(imageDir, imageName)
- print("txtPATH \t", txtPATH)
-
- f = open(txtPATH, 'rb')
- r = f.read()
- # 获取文本的编码方式
- f_charInfo = chardet.detect(r)
- print(f_charInfo['encoding']) # 取得文本格式
- f.close()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。