数据加载,存储与文件格式(非完整版)

读取文本格式的数据

pandas提供了一些用于将表格型数据读取为DataFrame对象的函数
其中read_csv和read_table用的比较多

  • pandas中的解析函数
函数说明
read_csv从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为逗号
read_table从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为制表符(“\t”)
read_fwf读取定宽列格式数据(也就是说,没有分割符)
read_clipboard肚脐剪贴板中的数据,可以看做read_table的剪贴板。在将网页转换为表格是很有用

这些函数的选项可以划分为以下几个大类:

  • 索引:将一个或多个;列当作返回的DataFrame处理,以及是否从文件、用户获取列名。
  • 类型推断和数据转换:包括用户定义值的转换、缺失值标记列表等。
  • 日期解析:包括组合功能,比如将分散在多个列中的日期时间信息组合成结果中的单个列。
  • 迭代:支持对大文件进行逐块迭代。
  • 不规整数据问题:跳过一些行、页脚、注释或其他一些不重要的东西(比如由成千上万个逗号隔开的数值数据)

csv文件是默认以,为分割符.可以通过命令行cat来读取文件内容.

In [4]: cat Data/python/1.csv
a,b,c,d,message
1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo

同样的我们也可以用pandas的函数进行读取.

In [6]: result=pd.read_csv('Data/python/1.csv')

In [7]: result

Out[7]: 
    a   b   c   d   message
    
0  1   2   3   4         hello

1  5   6   7   8        worlld

2  9  10  11  12         foo

我们也可以用read_table,只不过需要指定分隔符而已

In [8]: result=pd.read_table('Data/python/1.csv',sep=',')

In [9]: result

Out[9]: 

     a   b   c   d    message
    
0  1   2   3   4         hello

1  5   6   7   8        worlld

2  9  10  11  12         foo

当没有标题行时,读入该数据文件有两个方法:(你可以让pandas为其分配默认的列名,亦可以自己定义列名)

In [10]: result=pd.read_csv('Data/python/1.csv',header=None)

In [11]: result

Out[11]: 

    X.1 X.2 X.3 X.4      X.5
    
0  1   2   3   4         hello

1  5   6   7   8        worlld

2  9  10  11  12         foo
In [12]: result=pd.read_csv('Data/python/1.csv',names=['a','b','c','d','message'])

In [13]: result

Out[13]: 

     a   b   c   d    message
    
0  1   2   3   4         hello

1  5   6   7   8        worlld

2  9  10  11  12         foo

当然,你也可以根据message来做索引读取文件,这里就不过多介绍了

  • read_csv/read_table函数的参数

参数说明

path表示文件系统位置、URL、文件型对象的字符串
sep/delimiter用于对行中各字段进行拆分的字符序列或正则表达式
header用作列名的行号。如果没有header行就应该设置为None
index_col用作行索引的列编号或列名,可以是单个名称/数字或由多个名称/数字组成的列表
names用于结果的列名列表,结合header = None
skiprows需要忽略的行数(从文件开始处算起),或需要跳过的行号;列表
na_values一组用于替换NA的值
comment用于将注释信息从行尾拆分出去的字符 (一个或多个)
parse_dates尝试将数据解析为日期
nrows需要读取的行数(从文件开始处算起)
skip_footer需要忽略的行数
converters由列号/列名跟函数之间的映射关系组成的字典。例如:{‘foo’:f}会对foo列的所有值应用函数f

逐块读取文本文件
用于你只想读取文件的部分或逐块对文件进行迭代

In [ ]: result=pd.read_csv('Data/python/1.csv')

In [ ]: result

Out[ ]: 
<class 'pandas.core.frame.DataFrame'>
Int64Index:  10000  entries, 0  to  9999
Data  columns:
one          10000    non-null  values
two          10000    non-null  values
three        10000    non-null  values
four         10000    non-null  values
key          10000    non-null  values
dtype :     float64(4),  object(1)

#如果只想读取几行,通过nrows进行指定即可

将数据写出到文本格式

In[]: data = pd.read_csv('ex5.csv')
In[]: data.to_csv('out.csv') # 将data中的数据写出到当前目录中的out.csv中
In[]: data.to_csv(sys.stdout, sep='|') # 打印到屏幕
In[]: data.to_csv(sys.stdout, na_rep='NULL') # 空字符处显示为NULL
In[]: data.to_csv(sys.stdout, index=False, header=False) # 禁用行和列的标签
In[]: data.to_csv(sys.stdout, index=False, cols=['a', 'b', 'c']) # 按照指定的顺序显示列
# Series中的to_csv方法
In [39]: dates = pd.date_range('1/1/2000', periods = 7)

In [40]: dates
Out[40]: 
DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-03', '2000-01-04', '2000-01-05', '2000-01-06', '2000-01-07'], dtype='datetime64[ns]', freq='D')
In [45]:test = Series(np.arange(7), index = dates)

In [46]: test
Out[46]: 
2000-01-01    0
2000-01-02    1
2000-01-03    2
2000-01-04    3
2000-01-05    4
2000-01-06    5
2000-01-07    6

手工处理分隔符

In [50]: cat ex7.csv
"a","b","c"
"1","2","3"
"1","2","3","4"

In [51]: import csv
In [52]: f = open('ex7.csv')
In [53]: reader = csv.reader(f)
In [54]: for line in reader:
    ...:     print line
    ...:     
['a', 'b', 'c']
['1', '2', '3']
['1', '2', '3', '4']

# 可以对数据做一些处理
In[]: lines = list(csv.reader(open('ex7.csv')))
In[]: header, values = lines[0], lines[1:]
In[]: data_dict = {h:v for h,v in zip(header, zip(*values))}

JSON数据
JSON:JavaScript 对象表示法(JavaScript Object Notation)。JSON 是存储和交换文本信息的语法。类似 XML, 比 XML 更小、更快,更易解析,是一种比表格型文本格式灵活得多的数据格式:

obj="""{"name":"Wes",
        "place_lived":["United States","Spain","Germany"],
        "pet":null,
        "siblings":[{"name":"Scott","age":25,"pet":"Zuko"},{"name":"Katie","age":33,"pet":"Cisco"}]}"""

•JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
•JSON 是轻量级的文本数据交换格式
•JSON 独立于语言
•JSON 具有自我描述性,更易理解

JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。

JSON语法:
JSON 语法是 JavaScript 对象表示法语法的子集。

  • 数据在名称/值对中:{“name”: “James”}
  • 数据由逗号分隔:{“name”: “James”,“age”,12}
  • 花括号保存对象{“name”: “James”,“age”,12}
  • 方括号保存数组:

{
“employees”: [
{ “firstName”:”John” , “lastName”:”Doe” },
{ “firstName”:”Anna” , “lastName”:”Smith” },
{ “firstName”:”Peter” , “lastName”:”Jones” }
]
}

JSON 值:
JSON 值可以是:

  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true 或 false)
  • 数组(在方括号中)
  • 对象(在花括号中) null

JSON 文件:
JSON 文件的文件类型是 “.json”
JSON 文本的 MIME 类型是 “application/json”

XML和HTML:Web信息收集
Python有许多可以读写HTML和XML格式数据的库,lxml就是其中之一,它能够高效且可靠地解析大文件。找到希望获取的URL,利用urllibs将其打开,然后用lxml解析得到的数据流:

from lxml.html import parse
from urllib.request import urlopen
parsed=parse(urlopen('https://finance.yahoo.com/q/op?s=AAPL+Options'))
doc=parsed.getroot()

通过这个对象,你可以获取特定类型的所有HTML标签(tag)。使用文档根节点的findall方法以及一个XPath:

links=doc.findall('.//a')
links[15:20]
[<Element a at 0x137db5479f8>,
 <Element a at 0x137db547a48>,
 <Element a at 0x137db547a98>,
 <Element a at 0x137db547ae8>,
 <Element a at 0x137db547b38>]

要得到URL和链接文本,你必须使用各对象的get方法(针对URL)和text_content方法(针对显示文本):

lnk=links[28]
lnk
<Element a at 0x137db547e08>

二进制数据格式

实现数据的二进制格式存储最简单的办法之一是使用Python内置的pickle序列化。为了使用方便,pandas对象都有一个用于将数据以pickle形式保存到磁盘上的save方法:

frame = pd.read_csv('ch06/ex1.csv')
frame
      a   b   c   d   message
 0   1   2   3   4        hello
 1   5   6   7   8       world
 2   9  10  11  12        foo
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值