先看看加上以下两种编码能否解决问题
open('test.txt','r',encoding='utf-8') as f:
如果不能,一行行读取,跳过有问题的行
with open('test.txt', 'r', encoding='utf-8') as f:
while True:
try:
line = f.readline()
print(line)
if not line:
break
except Exception as e:
# 直接跳过
continue
如果一行行读取,也解决不,可以试下下面的办法
首先我们看看正常的读取数据过程:
with open('test.txt','r',encoding='utf-8') as f:
#很多时候由于数据量比较大,所以并不建议一次性读取,这里我们选择的是逐行一次读取数据
for i in f:
pass
在读取数据的过程中,有时候会因为某一行数据中有一些特殊字符而出现编码错误。
'utf-8' codec can't decode byte 0xe8 in position 10
一般想到的是通过异常处理直接跳过,但是想想try加在哪里呢?
加在for i in f这里吗?这样就算跳过了异常那不还是拿不到后面的数据吗?
加 for循环里面就更加不可能了,因为出错是错现在读取过程中,而不是读取之后。
如果是数据量比较小,可以直接打开文件到出错的地方将错误数据修改,或者将那条数据删除都行,但是文件太大了,此时又无法通过打开文件去修改。
其实,可以通过在读取的时候将数据以其他的方式来编码,这个时候是可以正常读取到数据的。
with open('test.txt','r', encoding='ISO-8859-1') as f:
for i in f:
pass
注意编码之后,还需要进行还原
with open('test.txt', 'r', encoding='ISO-8859-1') as f:
for i in tqdm(f):
# 打印出来数据是ISO-8859-1编码
# print(i)
# 此处可能还是会因为数据中的特殊字符导致报错
try:
# 将读取出来的数据先用ISO-8859-1格式给它编码,然后通过utf-8给它解码
x = i.encode('ISO-8859-1').decode('utf-8')
except UnicodeError as e:
print(e)
# 跳过出错的数据
x = ''
if x == '':
print(x)
with open('test_new.txt', 'a', encoding='utf-8') as f:
f.write(x)
问题解决。