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)

深入理解pandas读取excel,txt,csv文件等命令-LMLPHP
其实发现意义还真不是很大,可能文档并没有表述清楚他的具体作用。接下来说一下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)

深入理解pandas读取excel,txt,csv文件等命令-LMLPHP

read_csv函数过程中常见的问题

  1. 有的IDE中利用Pandas的read_csv函数导入数据文件时,若文件路径或文件名包含中文,会报错。

解决办法

import pandas as pd
#df=pd.read_csv('F:/测试文件夹/测试数据.txt')
f=open('F:/测试文件夹/测试数据.txt')
df=pd.read_csv(f)
  1. 排除某些行 使用 参数 skiprows.它的功能为排除某一行。
    要注意的是:排除前3行是skiprows=3 排除第3行是skiprows=[3]

  2. 对于不规则分隔符,使用正则表达式读取文件
    文件中的分隔符采用的是空格,那么我们只需要设置sep=" "来读取文件就可以了。当分隔符并不是单个的空格,也许有的是一个空格有的是多个空格时,如果这个时候还是采用sep=" "来读取文件,也许你就会得到一个很奇怪的数据,因为它会将空格也做为数据。

     data = pd.read_csv("data.txt",sep="\s+")  
  3. 读取的文件中如果出现中文编码错误
    需要设定 encoding 参数

  4. 为行和列添加索引
    用参数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 既可以正常使用了

深入理解pandas读取excel,txt,csv文件等命令-LMLPHP
还有一个比较坑的地方,就是在读取剪切板的时候,如果复制了中文,很容易读取不到数据
解决办法

  1. 打开site-packages\pandas\io\clipboard.py 这个文件需要自行检索
  2. 在 text = clipboard_get() 后面一行 加入这句: text = text.decode('UTF-8')
  3. 保存,然后就可以使用了

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

  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')
  1. orient='records'
    成员为字典列表
import pandas as pd
s = '[{"a":1,"b":2},{"a":3,"b":4}]'
df = pd.read_json(s,orient='records')
  1. orient='index'
    以索引为key,以列字段构成的字典为键值。如:

     s = '{"0":{"a":1,"b":2},"1":{"a":2,"b":4}}'
  2. 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读取文件的过程中,最常出现的问题,就是中文问题与格式问题,希望当你碰到的时候,可以完美的解决。

有任何问题,希望可以在评论区给我回复,期待和你一起进步,博客园-梦想橡皮擦

03-06 11:04