07-读取文本格式的数据

【英文API】:http://pandas.pydata.org/pandas-docs/stable/io.html#io-sql
pandas提供了一些用于将表格型数据读取为DataFrame对象的函数,如下所示图,其中的read_csv和read_table以后用的最多

读取以逗号分隔符的(CSV)文本文件【read_csv默认分隔符是逗号,read_table默认分隔符是制表符”\t”】

先显示一下文本的全部内容

1
2
!type H:\学习\专业学习\python\学习\ch06\ch06\ex1.csv
#如果是UNIX要使用 !cat H:\学习\专业学习\python\学习\ch06\ch06\ex1.csv,地址改成自己的地址

读取固定分隔符分隔的文件

读取带有标题行的文件

文件是使用逗号分隔的,我们就使用read_csv

1
pd.read_csv('ch06/ex1.csv')


也可以用read_table,但是要指定分隔符

1
pd.read_table('ch06/ex1.csv',sep = ',')

读取没有标题行的文件

不是所有的文件都有标题行的,比如下面的文件

解决的方法有两个:

  1. 让pandas分配默认的列名
    1
    pd.read_csv('ch06\ex2.csv',header = None)

  1. 自定义列名

    如果希望message作为DataFrame的索引。可以通过index_col参数指定
    1
    2
    names = ['a','b','c','d','message']
    pd.read_csv('ch06\ex2.csv',names = names,index_col = 'message')


[多层次索引先空着]

读取不是固定分隔符分隔的文件

  • 有些表格不是用固定的分隔符来分隔字段的(比如空白符或者其他模式),这个时候就需要编写一个正则表达式来作为read_table的分隔符
    1
    list(open('ch06/ex3.txt'))#打开文件并且以列表的形式显示

本例的这个情况可以用正则表达式\s+
【注】关于正则表达式的学习,大家可以访问这两个网站:
http://tool.chinaz.com/regex
http://tool.lu/regex/

1
2
3
#使用正则表达式\s+
result = pd.read_table('files/ex3.txt',sep = '\s+')
result

  • 这些解析器函数还有许多参数可以帮助你处理各种各样的异形文件格式。比如说用skiprows跳过文件的第一行、第三行和第四行
1
pd.read_csv('files\ex4.csv',skiprows = [0,2,3])

下图是read_csv/read_table函数的参数


缺失值处理

缺失数据经常是要么没有(空字符串),要么用某个标记值表示。默认情况下,pandas会用一组经常出现的标记值进行识别,比如NA,-1.#IND以及NULL

1
2
result = pd.read_csv('files\ex5.csv')
result


可以用字典为各列指定不同NA标记值

1
2
sentinels = {'message':['foo','NA'],'something':['two']}
pd.read_csv('files\ex5.csv',na_values = sentinels)

逐块读取文本

在处理很大的文件时,或者找出大文件中的参数集以便于后续处理,你可能只想读取文件的一小部分,或者逐块的对文件进行迭代

1
2
result = pd.read_csv('files\ex6.csv')
result

  • 如果只想读取几行,可以用nrows进行指定
    1
    2
    3
    #只读取前五行
    result = pd.read_csv('files\ex6.csv',nrows = 5)
    result

  • 要逐块读取文件,需要设置chunksize(行数):
    read_csv返回的TextParser对象可以使你根据chunksize对文件进行逐块迭代。
    1
    2
    3
    4
    5
    6
    7
    chunker = pd.read_csv('files\ex6.csv',chunksize = 1000)
    tot = Series([])#定义一个空的Series
    for piece in chunker:#迭代
    tot = tot.add(piece['key'].value_counts(),fill_value = 0)
    #计算key列的每个值得出现次数
    tot = tot.sort_values(ascending = False)
    tot[:10]

您的支持将鼓励我继续创作!