在使用pandas讀取文件以前,必備的內容,必然屬於官方文檔,官方文檔查閱地址html
http://pandas.pydata.org/pandas-docs/version/0.24/reference/io.htmlhtml5
文檔操做屬於pandas裏面的Input/Output
也就是IO操做,基本的API都在上述網址,接下來本文核心帶你理解部分經常使用的命令python
讀取txt文件須要肯定txt文件是否符合基本的格式,也就是是否存在\t
,` ,
,`等特殊的分隔符
通常txt文件長成這個樣子git
txt文件舉例github
下面的文件爲空格間隔正則表達式
1 2019-03-22 00:06:24.4463094 中文測試 2 2019-03-22 00:06:32.4565680 須要編輯encoding 3 2019-03-22 00:06:32.6835965 ashshsh 4 2017-03-22 00:06:32.8041945 eggg
讀取命令採用 read_csv或者 read_table均可以apache
import pandas as pd df = pd.read_table("./test.txt") print(df) import pandas as pd df = pd.read_csv("./test.txt") print(df)
可是,注意,這個地方讀取出來的數據內容爲3行1列的DataFrame類型,並無按照咱們的要求獲得3行4列json
import pandas as pd df = pd.read_csv("./test.txt") print(type(df)) print(df.shape) <class 'pandas.core.frame.DataFrame'> (3, 1)
默認: 從文件、URL、文件新對象中加載帶有分隔符的數據,默認分隔符是逗號。api
上述txt文檔並無逗號分隔,因此在讀取的時候須要增長sep分隔符參數數組
df = pd.read_csv("./test.txt",sep=' ')
參數說明,官方Source : https://github.com/pandas-dev/pandas/blob/v0.24.0/pandas/io/parsers.py#L531-L697
中文說明以及重點功能案例
參數 | 中文釋義 |
---|---|
filepath_or_buffer | 能夠是URL,可用URL類型包括:http, ftp, s3和文件,本地文件讀取實例:file://localhost/path/to/table.csv |
sep | str類型,默認',' 指定分隔符。若是不指定參數,則會嘗試使用默認值逗號分隔。分隔符長於一個字符而且不是‘\s+’,將使用python的語法分析器。而且忽略數據中的逗號。正則表達式例子:'\r\t' |
定界符,備選分隔符(若是指定該參數,則sep參數失效) 通常不用 | |
True or False 默認False, 用空格做爲分隔符等價於spe=’\s+’若是該參數被調用,則delimite不會起做用 | |
header | 指定第幾行做爲列名(忽略註解行),若是沒有指定列名,默認header=0; 若是指定了列名header=None |
names | 指定列名,若是文件中不包含header的行,應該顯性表示header=None ,header能夠是一個整數的列表,如[0,1,3]。未指定的中間行將被刪除(例如,跳過此示例中的2行) |
index_col(案例1) | 默認爲None 用列名做爲DataFrame的行標籤,若是給出序列,則使用MultiIndex。若是讀取某文件,該文件每行末尾都有帶分隔符,考慮使用index_col=False使panadas不用第一列做爲行的名稱。 |
usecols | 默認None 可使用列序列也可使用列名,如 [0, 1, 2] or [‘foo’, ‘bar’, ‘baz’] ,使用這個參數能夠加快加載速度並下降內存消耗。 |
squeeze | 默認爲False, True的狀況下返回的類型爲Series,若是數據經解析後僅含一行,則返回Series |
prefix | 自動生成的列名編號的前綴,如: ‘X’ for X0, X1, ... 當header =None 或者沒有設置header的時候有效 |
mangle_dupe_cols | 默認爲True,重複的列將被指定爲’X.0’…’X.N’,而不是’X’…’X’。若是傳入False,當列中存在重複名稱,則會致使數據被覆蓋。 |
dtype | 例子: {‘a’: np.float64, ‘b’: np.int32} 指定每一列的數據類型,a,b表示列名 |
engine | 使用的分析引擎。能夠選擇C或者是python,C引擎快可是Python引擎功能更多一些 |
converters(案例2) | 設置指定列的處理函數,能夠用"序號"也可使用「列名」進行列的指定 |
true_values / false_values | 沒有找到實際的應用場景,備註一下,後期完善 |
skipinitialspace | 忽略分隔符後的空格,默認false |
skiprows | 默認值 None 須要忽略的行數(從文件開始處算起),或須要跳過的行號列表(從0開始) |
skipfooter | 從文件尾部開始忽略。 (c引擎不支持) |
nrows | 從文件中只讀取多少數據行,須要讀取的行數(從文件頭開始算起) |
na_values | 空值定義,默認狀況下, ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’, ‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’. 都表現爲NAN |
keep_default_na | 若是指定na_values參數,而且keep_default_na=False,那麼默認的NaN將被覆蓋,不然添加 |
na_filter | 是否檢查丟失值(空字符串或者是空值)。對於大文件來講數據集中沒有N/A空值,使用na_filter=False能夠提高讀取速度。 |
verbose | 是否打印各類解析器的輸出信息,例如:「非數值列中缺失值的數量」等。 |
skip_blank_lines | 若是爲True,則跳過空行;不然記爲NaN。 |
parse_dates | 有以下的操做 1. boolean. True -> 解析索引 2. list of ints or names. e.g. If [1, 2, 3] -> 解析1,2,3列的值做爲獨立的日期列; 3. list of lists. e.g. If [[1, 3]] -> 合併1,3列做爲一個日期列使用 4. dict, e.g. {‘foo’ : [1, 3]} -> 將1,3列合併,並給合併後的列起名爲"foo" |
infer_datetime_format | 若是設定爲True而且parse_dates 可用,那麼pandas將嘗試轉換爲日期類型,若是能夠轉換,轉換方法並解析。在某些狀況下會快5~10倍 |
keep_date_col | 若是鏈接多列解析日期,則保持參與鏈接的列。默認爲False |
date_parser | 用於解析日期的函數,默認使用dateutil.parser.parser來作轉換。Pandas嘗試使用三種不一樣的方式解析,若是遇到問題則使用下一種方式。 1.使用一個或者多個arrays(由parse_dates指定)做爲參數; 2.鏈接指定多列字符串做爲一個列做爲參數; 3.每行調用一次date_parser函數來解析一個或者多個字符串(由parse_dates指定)做爲參數。 |
dayfirst | DD/MM格式的日期類型 |
iterator | 返回一個TextFileReader 對象,以便逐塊處理文件。 |
chunksize | 文件塊的大小 |
compression | 直接使用磁盤上的壓縮文件。若是使用infer參數,則使用 gzip, bz2, zip或者解壓文件名中以‘.gz’, ‘.bz2’, ‘.zip’, or ‘xz’這些爲後綴的文件,不然不解壓。若是使用zip,那麼ZIP包中國必須只包含一個文件。設置爲None則不解壓。 |
新版本0.18.1版本支持zip和xz解壓 | |
thousands | 千分位符號,默認‘,’ |
decimal | 小數點符號,默認‘.’ |
lineterminator | 行分割符,只在C解析器下使用 |
quotechar | 引號,用做標識開始和解釋的字符,引號內的分割符將被忽略 |
quoting | 控制csv中的引號常量。可選 QUOTE_MINIMAL (0), QUOTE_ALL (1), QUOTE_NONNUMERIC (2) or QUOTE_NONE (3) |
doublequote | 雙引號,當單引號已經被定義,而且quoting 參數不是QUOTE_NONE的時候,使用雙引號表示引號內的元素做爲一個元素使用。 |
escapechar | 當quoting 爲QUOTE_NONE時,指定一個字符使的不受分隔符限值。 |
comment | 標識着多餘的行不被解析。若是該字符出如今行首,這一行將被所有忽略。這個參數只能是一個字符,空行(就像skip_blank_lines=True)註釋行被header和skiprows忽略同樣。例如若是指定comment='#' 解析‘#empty\na,b,c\n1,2,3’ 以header=0 那麼返回結果將是以’a,b,c'做爲header |
encoding | 編碼方式,指定字符集類型,一般指定爲'utf-8' |
dialect | 若是沒有指定特定的語言,若是sep大於一個字符則忽略。具體查看csv.Dialect 文檔 |
error_bad_lines | 若是一行包含太多的列,那麼默認不會返回DataFrame ,若是設置成false,那麼會將改行剔除(只能在C解析器下使用) |
warn_bad_lines | 若是error_bad_lines =False,而且warn_bad_lines =True 那麼全部的「bad lines」將會被輸出(只能在C解析器下使用) |
low_memory | 分塊加載到內存,再低內存消耗中解析。可是可能出現類型混淆。確保類型不被混淆須要設置爲False。或者使用dtype 參數指定類型。注意使用chunksize 或者iterator 參數分塊讀入會將整個文件讀入到一個Dataframe,而忽略類型(只能在C解析器中有效) |
delim_whitespace | New in version 0.18.1: Python解析器中有效 |
memory_map | 若是爲filepath_or_buffer提供了文件路徑,則將文件對象直接映射到內存上,並直接從那裏訪問數據。使用此選項能夠提升性能,由於再也不有任何I / O開銷,使用這種方式能夠避免文件再次進行IO操做 |
float_precision | 指定C引擎應用於浮點值的轉換器 |
該表格部分參考 博客 http://www.javashuo.com/article/p-nmbkbeht-gm.html 感謝博主的翻譯,O(∩_∩)O哈哈~
index_col 使用
首先準備一個txt文件,這個文件最大的問題是在每行的末尾多了一個',' ,按照提示解釋爲,若是每行末尾都有分隔符,會出現問題,可是在實際測試的時候發現須要配合names參數,才能夠出現效果
goof,1,2,3,ddd, u,1,3,4,asd, as,df,12,33,
編寫以下代碼
df = pd.read_csv("./demo.txt",header=None,names=['a','b','c','d','e']) print(df) df = pd.read_csv("./demo.txt",header=None,index_col=False,names=['a','b','c','d','e']) print(df)
其實發現意義還真不是很大,可能文檔並無表述清楚他的具體做用。接下來講一下index_col的常見用途
在讀取文件的時候,若是不設置index_col列索引,默認會使用從0開始的整數索引。當對錶格的某一行或列進行操做以後,在保存成文件的時候你會發現老是會多一列從0開始的列,若是設置index_col參數來設置列索引,就不會出現這種問題了。
converters 設置指定列的處理函數,能夠用"序號"也可使用「列名」進行列的指定
import pandas as pd def fun(x): return str(x)+"-haha" df = pd.read_csv("./test.txt",sep=' ',header=None,index_col=0,converters={3:fun}) print(type(df)) print(df.shape) print(df)
解決辦法
import pandas as pd #df=pd.read_csv('F:/測試文件夾/測試數據.txt') f=open('F:/測試文件夾/測試數據.txt') df=pd.read_csv(f)
排除某些行 使用 參數 skiprows.它的功能爲排除某一行。
要注意的是:排除前3行是skiprows=3 排除第3行是skiprows=[3]
對於不規則分隔符,使用正則表達式讀取文件
文件中的分隔符采用的是空格,那麼咱們只須要設置sep=" "來讀取文件就能夠了。當分隔符並非單個的空格,也許有的是一個空格有的是多個空格時,若是這個時候仍是採用sep=" "來讀取文件,也許你就會獲得一個很奇怪的數據,由於它會將空格也作爲數據。
data = pd.read_csv("data.txt",sep="\s+")
讀取的文件中若是出現中文編碼錯誤
須要設定 encoding 參數
爲行和列添加索引
用參數names添加列索引,用index_col添加行索引
read_csv該命令有至關數量的參數。大多數都是沒必要要的,由於你下載的大部分文件都有標準格式。
基本用法是一致的,區別在於separator分隔符。
csv是逗號分隔值,僅能正確讀入以 「,」 分割的數據,read_table默認是'\t'(也就是tab)切割數據集的
讀取具備固定寬度列的文件,例如文件
id8141 360.242940 149.910199 11950.7 id1594 444.953632 166.985655 11788.4 id1849 364.136849 183.628767 11806.2 id1230 413.836124 184.375703 11916.8 id1948 502.953953 173.237159 12468.3
read_fwf 命令有2個額外的參數能夠設置
colspecs :
須要給一個元組列表,元組列表爲半開區間,[from,to) ,默認狀況下它會從前100行數據進行推斷。
例子:
import pandas as pd colspecs = [(0, 6), (8, 20), (21, 33), (34, 43)] df = pd.read_fwf('demo.txt', colspecs=colspecs, header=None, index_col=0)
widths:
直接用一個寬度列表,能夠代替colspecs
參數
widths = [6, 14, 13, 10] df = pd.read_fwf('demo.txt', widths=widths, header=None)
read_fwf 使用並非很頻繁,能夠參照 http://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#files-with-fixed-width-columns 學習
pandas支持的一種新的可序列化的數據格式,這是一種輕量級的可移植二進制格式,相似於二進制JSON,這種數據空間利用率高,在寫入(序列化)和讀取(反序列化)方面都提供了良好的性能。
讀取剪貼板中的數據,能夠看做read_table的剪貼板版本。在將網頁轉換爲表格時頗有用
這個地方出現以下的BUG
module 'pandas' has no attribute 'compat'
我更新了一下pandas 既能夠正常使用了
還有一個比較坑的地方,就是在讀取剪切板的時候,若是複製了中文,很容易讀取不到數據
解決辦法
依舊是官方文檔一碼當先:http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html#pandas.read_excel
參數 | 中文釋義 |
---|---|
io | 文件類對象 ,pandas Excel 文件或 xlrd 工做簿。該字符串多是一個URL。URL包括http,ftp,s3和文件。例如,本地文件可寫成file://localhost/path/to/workbook.xlsx |
sheet_name | 默認是sheetname爲0,返回多表使用sheetname=[0,1],若sheetname=None是返回全表 。注意:int/string返回的是dataframe,而none和list返回的是dict of dataframe,表名用字符串表示,索引表位置用整數表示; |
header | 指定做爲列名的行,默認0,即取第一行,數據爲列名行如下的數據;若數據不含列名,則設定 header = None; |
names | 指定列的名字,傳入一個list數據 |
index_col | 指定列爲索引列,也可使用u」strings」 ,若是傳遞一個列表,這些列將被組合成一個MultiIndex。 |
squeeze | 若是解析的數據只包含一列,則返回一個Series |
dtype | 數據或列的數據類型,參考read_csv便可 |
engine | 若是io不是緩衝區或路徑,則必須將其設置爲標識io。 可接受的值是None或xlrd |
converters | 參照read_csv便可 |
其他參數 | 基本和read_csv一致 |
錯誤爲:ImportError: No module named 'xlrd'
pandas讀取excel文件,須要單獨的xlrd模塊支持 pip install xlrd 便可
參數 | 中文釋義 |
---|---|
path_or_buf | 一個有效的JSON文件,默認值爲None,字符串能夠爲URL,例如file://localhost/path/to/table.json |
orient (案例1) | 預期的json字符串格式,orient的設置有如下幾個值: 1. 'split' : dict like {index -> [index], columns -> [columns], data -> [values]} 2. 'records' : list like [{column -> value}, ... , {column -> value}] 3. 'index' : dict like {index -> {column -> value}} 4. 'columns' : dict like {column -> {index -> value}} 5. 'values' : just the values array |
typ | 返回的格式(series or frame), 默認是 ‘frame’ |
dtype | 數據或列的數據類型,參考read_csv便可 |
convert_axes | boolean,嘗試將軸轉換爲正確的dtypes,默認值爲True |
convert_dates | 解析日期的列列表;若是爲True,則嘗試解析相似日期的列,默認值爲True 參考列標籤 it ends with '_at', it ends with '_time', it begins with 'timestamp', it is 'modified', it is 'date' |
keep_default_dates | boolean,default True。若是解析日期,則解析默認的日期樣列 |
numpy | 直接解碼爲numpy數組。默認爲False;僅支持數字數據,但標籤多是非數字的。還要注意,若是numpy=True,JSON排序MUST |
precise_float | boolean,默認False。設置爲在將字符串解碼爲雙精度值時啓用更高精度(strtod)函數的使用。默認值(False)是使用快速但不太精確的內置功能 |
date_unit | string,用於檢測轉換日期的時間戳單位。默認值無。默認狀況下,將檢測時間戳精度,若是不須要,則經過's','ms','us'或'ns'之一分別強制時間戳精度爲秒,毫秒,微秒或納秒。 |
encoding | json編碼 |
lines | 每行將文件讀取爲一個json對象。 |
若是JSON不可解析,解析器將產生ValueError/TypeError/AssertionError之一。
import pandas as pd s = '{"index":[1,2,3],"columns":["a","b"],"data":[[1,3],[2,5],[6,9]]}' df = pd.read_json(s,orient='split')
import pandas as pd s = '[{"a":1,"b":2},{"a":3,"b":4}]' df = pd.read_json(s,orient='records')
orient='index'
以索引爲key,以列字段構成的字典爲鍵值。如:
s = '{"0":{"a":1,"b":2},"1":{"a":2,"b":4}}'
orient='columns' 或者 values 本身推斷便可
部分中文翻譯,能夠參考github> https://github.com/apachecn/pandas-doc-zh
讀取json文件出現 ValueError: Trailing data
,JSON格式問題
原格式爲
{"a":1,"b":1},{"a":2,"b":2}
調整爲
[{"a":1,"b":1},{"a":2,"b":2}]
或者使用lines參數,而且JSON調整爲每行一條數據
{"a":1,"b":1} {"a":2,"b":2}
若JSON文件中有中文,建議加上encoding參數,賦值'utf-8',不然會報錯
參數 | 中文釋義 |
---|---|
io | 接收網址、文件、字符串。網址不接受https,嘗試去掉s後爬去 |
match | 正則表達式,返回與正則表達式匹配的表格 |
flavor | 解析器默認爲‘lxml’ |
header | 指定列標題所在的行,list爲多重索引 |
index_col | 指定行標題對應的列,list爲多重索引 |
skiprows | 跳過第n行(序列標示)或跳過n行(整數標示) |
attrs | 屬性,好比 attrs = {'id': 'table'} |
parse_dates | 解析日期 |
使用方法,在網頁中右鍵若是發現表格 也就是 table 便可使用
例如: http://data.stcn.com/2019/0304/14899644.shtml
<table class="..." id="..."> <thead> <tr> <th>...</th> </tr> </thead> <tbody> <tr> <td>...</td> </tr> <tr>...</tr> </tbody> </table> <table> : 定義表格 <thead> : 定義表格的頁眉 <tbody> : 定義表格的主體 <tr> : 定義表格的行 <th> : 定義表格的表頭 <td> : 定義表格單元
出現以下報錯 ImportError: html5lib not found, please install it
安裝html5lib便可,或者使用參數
import pandas as pd df = pd.read_html("http://data.stcn.com/2019/0304/14899644.shtml",flavor ='lxml')
更多參考源碼,能夠參考 > http://pandas.pydata.org/pandas-docs/stable/user_guide/io.html
截止到如今,本篇博客已經完成,對於pandas讀取文件,相信你應該已經有一個深刻的理解了。在pandas讀取文件的過程當中,最常出現的問題,就是中文問題與格式問題,但願當你碰到的時候,能夠完美的解決。
有任何問題,但願能夠在評論區給我回復,期待和你一塊兒進步,博客園-夢想橡皮擦