【Python】讀CSV和狗血的分隔符問題,附解決方法!
今天跟大家分享一個遇到的挺狗血的問題,讀入csv文件關(guān)于分隔符的問題。
1
使用pandas讀入csv文件后,發(fā)現(xiàn)列沒分割開,所以將sep參數(shù)調(diào)整為\t,發(fā)現(xiàn)還是沒分割開,再試空格,再試\s+,即各種空白字符組合,有幾例能分隔開,但是還有些列無法分割開。
左思右想,不得其解。那就去查查csv文件有沒有自動解析出分隔符的工具,其實這種工具并不難做,把每行的分隔符規(guī)律找一遍,按照不同概率給出不同的分隔符可能。
網(wǎng)上并沒有找到,一般網(wǎng)上沒有找到答案的問題,主要分兩類,要么這個問題的關(guān)聯(lián)領(lǐng)域是極其小眾的,要么這個問題本不是問題,可能是因為犯傻導致的極其低級錯誤而出現(xiàn)的問題。
很明顯讀個csv列無法分割不屬于小眾問題,所以應(yīng)該是犯傻導致。
果不其然,等我再三觀察、在群里討論哈佛哥提醒了我一句,才意識到讀入文件沒有分割,也就是行1列的數(shù)據(jù)格式,所以問題出在讀入文件上。
2
作為延伸,我想說下csv文件一個被人詬病的問題,正是由于分割符導致。
如下文件a.csv,分隔符是逗號,你注意看Hi,pythoner單元格,它的取值中含有一個逗號

等我使用pandas讀入此文件時,會發(fā)生什么:
import?pandas?as?pd?
pd.__version__??#?'1.2.4'
pd.read_csv('a.csv',?index_col=False)
讀入后,Hi,pythoner單元格的取值被截斷為Hi

如果多個單元格存在多于1個逗號,因為列無法對其還會拋異常,為此read_csv還提供一個參數(shù)error_bad_lines,專門丟棄這種含有多個逗號的行,這種錯誤在大數(shù)據(jù)量時尤其容易出現(xiàn),為了第一時間讀入數(shù)據(jù)往往將error_bad_lines設(shè)置為False,即丟棄這種多逗號的行。
如果csv文件的分隔符是\t或其他,也同樣面臨一樣的問題,如果分隔符恰好出現(xiàn)在單元格中,這種錯誤是不可避免的。
3
如果你的數(shù)據(jù)恰好又大量出現(xiàn)了分隔符的行,這就需要引起重視了。
為此比較保險的一種做法是,替換單元格中出現(xiàn)的csv文件的分隔符為其他符號,如分隔符為逗號,替換單元格的逗號為空格;如為\t,替換單元格的\t為逗號。
這樣經(jīng)過一遍替換處理后,就不會再出現(xiàn)數(shù)據(jù)缺失、有些行被過濾的問題。
往期精彩回顧 本站qq群554839127,加入微信群請掃碼:
