2021-04-25 pandas 讀取csv文件報錯

錯誤1: pandas.errors.ParserError: Error tokenizing data. C error: EOF inside string starting at row 56789

參考

原因:

因為在解析時出現(xiàn)了意外的文件結束符??赡苁窃撔谐霈F(xiàn)了亂碼,或者有一個雙引號;
所以實際上,該報錯是因為pandas讀取csv文件時,會默認把csv文件中兩個雙引號之間的內容解析為一個string,作為一個字段域讀入,并且忽略兩個雙引號之間的分隔符。所以,在默認方式下,一旦文件中出現(xiàn)了奇數(shù)個雙引號,那么最后一個引號從所在的行開始,直到文件結束也沒有對應的結束引號形成單個字段域,就會報這個異常,即文件結束符(EOF)出現(xiàn)在了字符串中。

解決方法:

解決辦法就是改變pandas在讀取csv的這種默認行為。在pandas的read_csv函數(shù)中,有兩個參數(shù)和這個行為有關,分別是quotechar引用符和quoting引用行為,如下所示,摘自pandas的官方文檔。

quotechar : str (length 1), optional

The character used to denote the start and end of a quoted item. Quoted items can include the delimiter and it will be ignored.
quoting : int or csv.QUOTE_* instance, default 0

Control field quoting behavior per csv.QUOTE_* constants. Use one of QUOTE_MINIMAL (0), QUOTE_ALL (1), QUOTE_NONNUMERIC (2) or QUOTE_NONE (3).
   quotechar引用符參數(shù)是表示在讀取解析時,將指定的符號認為是引用符,不僅僅限制于雙引號,默認情況下是雙引號。被設為引用符之后,就會按照上面所述的那樣,在引用符之間的內容會被解析為單個域讀入,包括換行符和分隔符。而quoting表示引用行為,即如何對待引用符的解析。這里具有四種情況,分別是csv.QUOTE_MINIMAL, csv.QUOTE_ALL, csv.QUOTE_NONNUMERIC, csv.QUOTE_NONE.默認是csv.QUOTE_MINIMAL.這四個參數(shù)的解釋如下:

csv.QUOTE_MINIMAL:只有當遇到引用符時,才會將引用符之間的內容解析為一個字符域讀入,并且讀取之后的域是沒有引用符的,即引用符本身只作為一個域的邊界界定,不會顯示出來;在寫入時,也只有具有引用符的域會在文件中加上引用符。

csv.QUOTE_ALL:在寫入文件時,將所有的域都加上引用符。

csv.QUOTE_NONNUMERIC:寫入文件時,將非數(shù)字域加上引用符。

csv.QUOTE_NONE:讀取文件時,不解析引用符,即把引用符當做普通字符對待并且讀入,不做特殊的對待;在寫入文件時,也不對任何域加上引用符。

代碼

import csv
data = pd.read_csv(filename,error_bad_lines=False, sep=',', encoding='utf-8',quoting=csv.QUOTE_NONE) 

錯誤2: 讀取某一行出錯

原因:

按照 sep 切分后,列數(shù)跟表頭對應不上

解決方法

  • 定位到具體的行,修改正確。比如去掉多余的英文逗號
  • 跳過錯誤行 pd.read_csv(filename,error_bad_lines=False)
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容