pandas读取文件官方提供的文档
在使用pandas读取文件之前,必备的内容,必然属于官方文档,官方文档查阅地址
文档操作属于pandas里面的Input/Output
也就是IO操作,基本的API都在上述网址,接下来本文核心带你理解部分常用的命令
pandas读取txt文件
读取txt文件需要确定txt文件是否符合基本的格式,也就是是否存在\t
,` ,
,`等特殊的分隔符
一般txt文件长成这个样子
txt文件举例
下面的文件为空格间隔
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都可以
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列
import pandas as pd
df = pd.read_csv("./test.txt")
print(type(df))
print(df.shape)
<class 'pandas.core.frame.DataFrame'>
(3, 1)
read_csv函数
默认: 从文件、URL、文件新对象中加载带有分隔符的数据,默认分隔符是逗号。
上述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
中文说明以及重点功能案例
该表格部分参考 博客 https://www.cnblogs.com/datablog/p/6127000.html 感谢博主的翻译,O(∩_∩)O哈哈~
案例1
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的常见用途
案例2
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)
read_csv函数过程中常见的问题
- 有的IDE中利用Pandas的read_csv函数导入数据文件时,若文件路径或文件名包含中文,会报错。
解决办法
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_table函数
基本用法是一致的,区别在于separator分隔符。
csv是逗号分隔值,仅能正确读入以 “,” 分割的数据,read_table默认是'\t'(也就是tab)切割数据集的
read_fwf 函数
读取具有固定宽度列的文件,例如文件
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 学习
read_msgpack 函数
pandas支持的一种新的可序列化的数据格式,这是一种轻量级的可移植二进制格式,类似于二进制JSON,这种数据空间利用率高,在写入(序列化)和读取(反序列化)方面都提供了良好的性能。
read_clipboard 函数
读取剪贴板中的数据,可以看作read_table的剪贴板版本。在将网页转换为表格时很有用
这个地方出现如下的BUG
module 'pandas' has no attribute 'compat'
我更新了一下pandas 既可以正常使用了
还有一个比较坑的地方,就是在读取剪切板的时候,如果复制了中文,很容易读取不到数据
解决办法
- 打开site-packages\pandas\io\clipboard.py 这个文件需要自行检索
- 在 text = clipboard_get() 后面一行 加入这句: text = text.decode('UTF-8')
- 保存,然后就可以使用了
read_excel 函数
依旧是官方文档一码当先:http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html#pandas.read_excel
pandas 读取excel文件如果报错,一般处理为
错误为:ImportError: No module named 'xlrd'
pandas读取excel文件,需要单独的xlrd模块支持 pip install xlrd 即可
read_json 函数
案例1
- orient='split'
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')
- orient='records'
成员为字典列表
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
read_json()常见BUG
读取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',否则会报错
read_html 函数
使用方法,在网页中右键如果发现表格 也就是 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> : 定义表格单元
常见BUG
出现如下报错 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读取文件的过程中,最常出现的问题,就是中文问题与格式问题,希望当你碰到的时候,可以完美的解决。
有任何问题,希望可以在评论区给我回复,期待和你一起进步,博客园-梦想橡皮擦