1. 程式人生 > >pandas讀csv檔案錯誤解決辦法(重要)

pandas讀csv檔案錯誤解決辦法(重要)

實踐解決辦法---------------------------------------------------------------------

用pandas讀取csv檔案特別說明:

1、檔名稱前加r解決檔名(含路徑中特殊符號)字串轉義問題;如:pd.read_csv(r'd:\bujiao.csv'),bujiao.csv檔案中無中文可正常讀出。

2、encoding='gb2312'解決檔案內容本身含有中文問題。如:pd.read_csv(r'd:\bujiao.csv',encoding='gb2312'),bujiao.csv檔案中有中文可正常讀出。但不可正常讀出:“補繳明細.csv”這個檔案。

問題:UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 2-3: illegal multibyte sequence

如果你的字串string中有諸如某些繁體字,例如"河滘小學"

中的滘,那麼gb2312作為簡體中文編碼是不能進行解析的,必須使用國標擴充套件碼gbk,gbk支援繁體中文和日文假文。

將以上pd.read_csv(r'd:\bujiao.csv',encoding='gbk'),可以正讀寫了。

3、檔名稱中如果有中文,必須進一步處理,如:

f_read=open(r'd:\補繳明細.csv',encoding='gb2312'

)

pd.read_csv(f_read)

可以將檔案內容中有中文字元的,檔名含有中文字元的“補繳明細.csv”這個檔案讀成dataframe格式。

4、如果仍出現codec can't decode byte 0xbc in position 2: invalid start byte等錯誤提示,可能是文字中出現的一些特殊符號超出了gbk的編碼範圍,可以選擇編碼範圍更廣的‘gb18030’去解碼。encoding='gb2312'改成encoding='gbk'或encoding='gb18030'

------------------------------------------------------------------------------------

pandas讀取Excel(或csv)檔案,以0開頭的資料,出現數據缺失

實踐解決方法:加引數converters = {u'code':str}

pd.read_csv(r".\fra\jb\jb.csv" ,encoding='gb18030',index_col=0, converters = {u'code':str})

這裡'code'是dataframe中的股票程式碼列,如果不加converters = {u'code':str}引數,導致讀出的股票程式碼'000539'變成'539'。

直接使用df = pd.read_excel(os.getcwd() + os.sep + 'stock.xlsx')讀取檔案時,證券程式碼被轉換為數字(000001 =>1),0被捨去,導致不正確。

這裡為了省去讀入後在對程式碼進行補全的麻煩,再讀取Excel檔案時: 
df = pd.read_excel(os.getcwd() + os.sep + 'stock.xlsx',converters = {u'證券程式碼':str}) 
證券程式碼按照str型別讀入,不會出現0被捨去的情況

————————————————————————————————————————

import pandas as pd

pd.read_csv('d:\si\a.csv')

當pandas讀入CSV檔案時,因為檔案中有中文字元,結果提示如下錯誤:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xcc in position 468: invalid continuation byte

一、首先,檢視本機的編碼、python版本:#檢視本機器預設的encoding
>>> import sys

>>> sys.getdefaultencoding()

輸出結果為:‘utf-8’

檢視python版本號:import sys回車;sys.version回車

測試:將中文字元刪除,只留數字。執行:pd.read_csv('d:\si\a.csv'),正常讀取資料。

解決辦法:

pd.read_csv('d:\si\a.csv')

錯誤提示:FileNoFoundError:File b'd:\\si\x07.csv'  does not exist!

原因:字串中的“\a”被系統解釋成了轉義的\a,即下六進位制的x07。

解決方案第一步:pd.read_csv(r'd:\si\a.csv'),在字串前加“r”標識。或pd.read_csv('d:\\si\\a.csv‘),結果:

如果csv檔案中無中文字元,可以正常讀出;

如果csv檔案中有中文字元,提示:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcc in position 468: invalid continuation byte

進一步解決辦法:pd.read_csv('d:\\si\\a.csv',encoding='gb2312')

pd.read_csv(r'd:\補繳明細.csv',edcoding='gb2312')

codec:編解碼器,編解碼程式

python字串前面加u,r,b的含義

u/U:表示unicode字串 

不是僅僅是針對中文, 可以針對任何的字串,代表是對字串進行unicode編碼。 
一般英文字元在使用各種編碼下, 基本都可以正常解析, 所以一般不帶u;但是中文, 必須表明所需編碼, 否則一旦編碼轉換就會出現亂碼。 
建議所有編碼方式採用utf8
r/R:非轉義的原始字串 
與普通字元相比,其他相對特殊的字元,其中可能包含轉義字元,即那些,反斜槓加上對應字母,表示對應的特殊含義的,比如最常見的”\n”表示換行,”\t”表示Tab等。而如果是以r開頭,那麼說明後面的字元,都是普通的字元了,即如果是“\n”那麼表示一個反斜槓字元,一個字母n,而不是表示換行了。 
以r開頭的字元,常用於正則表示式,對應著re模組。
b:bytes 
python3.x裡預設的str是(py2.x裡的)unicode, bytes是(py2.x)的str, b”“字首代表的就是bytes 
python2.x裡, b字首沒什麼具體意義, 只是為了相容python3.x的這種寫法

利用十六進位制表示的轉義字元,x07就是字母“a”。

Installation — Matplotlib 2.2.2 documentation  https://matplotlib.org/