首先我們看看正常的讀取數據過程:
with open('test.txt','r',encoding='utf-8') as f:
#很多時候由於數據量比較大,所以並不建議一次性讀取,這裏我們選擇的是逐行一次讀取數據
for i in f:
pass
在讀取數據的過程中有時候會因爲某一行數據中有一些特殊字符而出現編碼錯誤,
這裏我們先看一張報錯的圖片:
從報錯中我們可以看到這裏說是,'utf-8’編解碼器不能解碼字節0x9g在位置3703的無效字節,出現這個錯誤的時候我第一時間想到的是通過異常處理直接跳過,但是想想 try加在哪裏呢?加在 for i in f: 這裏嗎?但是想想這樣就算跳過了異常那不還是拿不到後面的數據嗎?加 for 循環裏面就更加不可能了,因爲出錯是錯現在讀取過程中,而不是讀取之後。
突然發現這個問題真的很惱火呀,如果是數據量比較小我倒是可以直接打開文件到出錯的地方將錯誤數據修改,或者將那條數據刪除都行,但是文件太大了,此時又無法通過打開文件去修改。之後在朋友的提醒下我發現可以通過在讀取的時候將數據以其他的方式來編碼,這個時候是可以正常讀取到數據的。
例:
with open('test.txt','r', encoding='ISO-8859-1') as f:
for i in f:
pass
這裏我們將編碼格式改爲 ‘ISO-8859-1’,此時我們將數據打印出來看看,
這都是什麼東西啊,我的數據明明是中文的,現在成這樣了,這也不是我想要的結果啊。不要着急,接下來的操作就是將你的數據還原了。
with open('test.txt','r', encoding='ISO-8859-1') as f:
for i in tqdm(f):
#此處將數據打印出來的時候我們會發現數據中中文部分會如上圖一樣。
print(i)
#因此處可能還是會因爲數據中的特出字符導致報錯,所以添加一個try在這裏
#假如該條數據出錯你可以選擇不要或者選擇將該條數據記錄都行,這個看個人了。
try:
#在這裏我們將讀取出來的數據先用 ‘ISO-8859-1’格式給它編碼,然後通過‘utf-8’給它解碼
x = i.encode('ISO-8859-1').decode('utf-8')
except:
x = ''
if x != '':
#此處打印出來的你就會發現你需要的數據出來了。
print(x)
with open('test1.txt', 'a', encoding='utf-8') as f:
f.write(x)
將打印結果貼在此處: