Pandas | read_csv各種報錯解決辦法

在使用pandas讀入csv文件時,有如下幾種常見錯誤類型

  • 路徑錯誤:文件名中存在中文名轉義字元
  • 數據格式錯誤:由於欄位中存在分隔符逗號,導致數據串列
  • 編碼錯誤:讀取文件的解碼模式不同於文件編碼格式。例如文件使用utf-8編碼,讀取時指定編碼格式為gbk。文本中存在一些特殊字元超出了解碼範圍,例如生僻繁體字或日文

通常報錯為:

FileNotFoundError: File b../數據.csv does not exist

gbk/utf-8 codec cant decode byte 0xa2 in position 147: illegal multibyte sequence

Error tokenizing data. C error: Expected 3 fields in line 3, saw 5

解決方法

  1. 當文件名存在中文和轉義字元時,前面加上u或者r指定字元串編碼,並且盡量避免使用中文作為文件名

# False
data = pd.read_csv(u./數據.csv)
# Right
data = pd.read_csv(u./data.csv)

2. 文件解碼格式存在錯誤時,查看源文件編碼或更換幾個常用編碼格式讀取試試。

for i in (gbk,utf-8,gb18030,ansi):
try:
data = pd.read_csv(./data.csv,encoding = i)
print(i + decode success)
except:
print(i + decode fail)

3.當文件僅有很少的行出現錯誤時,如數據不是太重要,可選擇跳過錯誤的行。

#跳過錯誤的行
data = pd.read_csv(./data.csv,error_bad_lines = False)
with open(./data.csv,r) as file:
rows = len(file.readlines())-1

#列印跳過的行數
print(len(data)-rows)

4. 在寫入文件時,使用在未在欄位中出現的符號作為分隔符!!!使用在未在欄位中出現的符號作為分隔符!!!使用在未在欄位中出現的符號作為分隔符!!!

由於逗號引號等符號容易出現在json子串中如{"姓名":"老吳","職業":"歌手","興趣":"hiphop"},建議使用Tab(/t)等生僻符號進行分隔

Fig1:現在有某表格如上,個人信息一欄含有逗號

Fig2:當使用excel打開,個人信息欄由於存在逗號,發生串列

找出分割錯的符號的出現規律,根據規律利用正則表達式進行替換或分割,如Fig1發現json子串內逗號都包含在{}括弧內,且前後都存在"引號,因此可利用正則表達式選擇後沒有引號的逗號分隔,sep = ,(?!")

#查看串列列分隔符規律
with open(./data.csv,r,encoding=utf-8) as file:
rows = file.readlines()
sep_cnt = rows[0].count(,)
for i in rows:
cnt = i.count(,)
if cnt!=sep_cnt:
print(i)

###查看報錯行分隔符規律
吳哥,{"年齡":28,"興趣":"拉麵","口頭禪":"又大又圓"},666

熱貓,{"年齡":38,"興趣":"交友","口頭禪":"這是我的小老弟"},88

阿越,{"年齡":39,"興趣":"打籃球","口頭禪":"我覺得不行"},66

###利用正則表達式正確分隔
import pandas as pd
data = pd.read_csv(./data.csv,sep = ,(?!"),encoding=utf8)
data.head()

Fig3.已正確讀取DataFrame

萬能糾錯模式

import pandas as pd

for decode in (gbk,utf-8,gb18030):
try:
data = pd.read_csv(./data.csv,encoding=decode,error_bad_lines=False)
print(data- + decode + -success!!)
break
except:
pass

更多關於python數據分析與挖掘內容請關注我的專欄:數與碼

或者關注我的知乎賬號:知行

歡迎交流討論和點贊~~

推薦閱讀:

TAG:Python | csv | 數據分析 |