錯誤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)