系列文章目录
提示:仅记录个人的学习心得,欢迎交流
(占位,以后再补 ……………………)
前言
对python语言基础中记忆不牢的进行总结,希望自己能坚持下去!为了学习计算机视觉做准备!
本次介绍本书第六章的内容。关于文件的操作都是些常见的操作,阅读别人代码时可能很容易的了解功能,但是自己使用的时候往往会犯难,所以重点要掌握怎么用,能完成哪些操作,加油!
一、文本格式数据的读写
1.1 文本文件读写的基本操作
将表格型数据读取为DataFrame对象是pandas的重要特性。
csv文件就是以逗号为分隔符的文件,系统默认是以excle表格的形式打开。其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。
table文件就是表格形式的数据,有三个重点:a)表格模式;b)每列必须有名字; c)不同列的数据类型可以不一样,但同一列数据类型必须一样。
我们常用的可能就是read_csv()、read_table()两个函数,通过传递这些函数中的某些参数可以实现一些特定的功能:
import numpy as np
import pandas as pd
result = pd.read_csv('./ex1.csv',na_values='NULL')
print(result)
>>> something a b c d message
0 one 1 2 3.0 4 NaN
1 two 5 6 NaN 8 world
2 three 9 10 11.0 12 foo
# 在字典中可以指定不同的缺失值标识
sentinels = {'message':['foo','NA'],'something':['two']}
print(pd.read_csv('./ex1.csv', na_values=sentinels))
>>> something a b c d message
0 one 1 2 3.0 4 NaN
1 two 5 6 NaN 8 world
2 three 9 10 11.0 12 foo
如果table文件的分割符不是逗号,而实不同数量的空格时,则需要用到参数sep= ' \s+ '(这是一个正则表达式可以处理数量不同的空格为分隔符时的情况。同理sep=分隔每行的字符序列或正则表达式。
1.2 分块读入文本文件
当处理大型文件或者找出正确的参数集来正确处理大文件时,你可能需要读入文件的一个小片段或者按小块遍历文件。
import numpy as np
import pandas as pd
pd.options.display.max_rows = 10
result = pd.read_csv('./ex2.csv')
print(result)
>>> one two three four key
0 0.467976 -0.038649 -0.295344 -1.824726 L
1 -0.358893 1.404453 0.704965 -0.200638 B
2 -0.501840 0.659254 -0.421691 -0.057688 G
3 0.204886 1.074134 1.388361 -0.982404 R
4 0.354628 -0.133116 0.283763 -0.837063 Q
... ... ... ... ... ..
2994 0.068804 1.322759 0.802346 0.223618 0
2995 2.311896 -0.417070 -1.409599 -0.515821 H
2996 -0.479893 -0.650419 0.745152 -0.646038 U
2997 0.523331 0.787112 0.486066 1.093156 A
2998 -0.362559 0.598894 -1.843201 0.887292 Y
[2999 rows x 5 columns]
tot = pd.Series([])
for piece in result:
tot = tot.add(piece['key'].value_counts(), fill_value=0)
tot = tot.sort_values(ascending=False)
print(tot)
>>> O 132.0
X 116.0
L 109.0
F 108.0
H 107.0
...
8 46.0
3 46.0
5 43.0
1 40.0
2 39.0
Length: 36, dtype: float64
如果要分块读入文件,可以使用参数chunksize此时read_csv所返回的这个TextParser对象使你可以根据chunksize对文件进行逐块迭代。get_chunk(size)函数可以获取size大小的chunk(下标从0开始)。
1.3 将数据写入文本格式
主要是使用.to_csv()函数,和设定该函数的相关参数完成写入文本的目的。
参数介绍:① sep= :设置分隔符
② na_rep= :对缺失值进行标注的标识值
③ index=False, hearder=False :写入的不写入行、列的标签。
④ colums=[] :按照所给定的列表顺序写入文件
1.4 使用分隔格式
对于大多数表格类型的文件read_table()函数都可以从硬盘中读取文件。但是对于有些分隔符不规则,或者对于一行或者时多行错误的文件,read_table()函数就不起作用。对于任何带有单字符分隔符的文件,你可以使用python的内建csv模块。
import csv
f = open('../pydata-book-3rd-edition/examples/ex7.csv')
reader = csv.reader(f)
for lines in reader:
print(lines)
>>> ['a', 'b', 'c']
['1', '2', '3']
['1', '2', '3']
之后,就可以进行一些必要的处理,以将数据整理为需要的形式。
import csv
f = open('../pydata-book-3rd-edition/examples/ex7.csv')
lines = list(csv.reader(f))
print(lines)
>>> [['a', 'b', 'c'], ['1', '2', '3'], ['1', '2', '3']]
header, values = lines[0], lines[1:]
data_dict = {h: v for h, v in zip(header, zip(*values))}
print(data_dict)
>>> {'a': ('1', '1'), 'b': ('2', '2'), 'c': ('3', '3')}
CSV文件有多种不同的风格,若果需要根据不同的分隔符、字符串引用约定或行终止符定义一种新的形式的格式时,我们可以用csv.Dialect 定义一个简单的子类;也可以不必定义子类,直接将CSV方言参数传入csv.reader的关键字参数:
"""使用csv.Dialect定义一个子类"""
class my_dialect(csv.Dialect):
lineterminator = '\n'
delimiter = ';'
quotechar = '"'
quoting = csv.QUOTE_MINIMAL
reader = csv.reader(f, dialect=my_dialect)
print(reader)
>>> <_csv.reader object at 0x00000144617E85E0>
"""直接将CSV语支参数传入csv.reader"""
reader = csv.reader(f, delimiter='|')
print(reader)
>>> <_csv.reader object at 0x00000278FED185E0>
写入文件的时候可以使用csv.wirter(),这个函数可以接受的参数和csv.reader()类似。
1.5 JSON数据
Json已经成为Web浏览器和其他用用间通过HTTP请求发送数据的标准形式。比CSV等表格文本更为自由。除了它空值NULL和列表末尾不允许有逗号等一些细微差别,JSON更接近的python代码
Python中的标准库json,可以使用json.loads()方法将json对象转换为python对象, 也可以使用json.dumps()方法转换回python对象。
pandas.read_json可以自动将JSON数据集按照指定的次序转换为Series或DataFrame。pandas.read_json的默认选项是假设JSON数组中的每个对象是表里的一行。 如果要从pandas中数据导出为JSON,可以对Series和DataFrame使用to_json()方法。
# 命令行运行
$ cat ../pydata-book-3rd-edition/examples/example.json
[{"a": 1, "b": 2, "c": 3},
{"a": 4, "b": 5, "c": 6},
{"a": 7, "b": 8, "c": 9}]
import pandas as pd
data = pd.read_json('../pydata-book-3rd-edition/examples/example.json')
print(data)
>>> a b c
0 1 2 3
1 4 5 6
2 7 8 9
1.6 XML和HTML:网络抓取
pandas.read_html()函数
(这部分介绍的太简单了吧,也没看懂......)