利用python进行数据分析:文本格式数据的读写,分块读入文本文件

访问数据时使用各类工具的第一步,我们重点关注使用 pandas 进行数据输入和输出,输入和输出通常有以下几种类型:读取文本文件及硬盘上其他更高效的格式文件,从数据库中载入数据,与网络资源进行交互(比如 Web API )

6.1文本格式数据的读写

将表格型数据读取为 dataframe 对象是pandas 的重要特性。

在这里插入图片描述
这些函数的可选参数主要有:

  • 索引:将一或多个列作为返回的dataframe ,从文件或用户出获得列名,或没有列名
  • 类型推断和数据转换:包括用户自定义的值转换,和自定义的缺失值符号列表。
  • 日期时间解析:包括组合功能,也包括将分散再多个列上的日期和时间信息组合成结果中的单个列。
  • 迭代:支持对大型文件的分块迭代。
  • 未清洗数据问题:跳过行、页脚、注释以及其他次要数据,比如使用逗号分隔千位的数字。

关于python对csv 文件的操作可以看看我以前的文章啊脑补链接

import csv
headers=('a','b','c','d','message')
data=[(1,2,3,4,'hello'),
     (5,6,7,8,'world'),
     (8,10,11,12,'foo')]
with open('ex2.csv','w',encoding='utf-8',newline='') as f:
    writer=csv.writer(f)
    writer.writerow(headers)
    writer.writerows(data)

with open('ex2.csv','r',encoding='utf-8') as f:        # 当然可以用excel 来创建一个表,再jupyter notebook 中
    reader=csv.reader(f)                               # 使用 !type ex2.csv 来查看
    for each in reader:
        print(each)
['a', 'b', 'c', 'd', 'message']
['1', '2', '3', '4', 'hello']
['5', '6', '7', '8', 'world']
['8', '10', '11', '12', 'foo']


df=pd.read_csv('ex2.csv')         # 使用read_csv 的方法读入 dataframe 中
df
   a	b	c	d	message
0	1	2	3	4	hello
1	5	6	7	8	world
2	8	10	11	12	foo

df=pd.read_table('ex2.csv',sep=',')       # 我们也可以使用 read_table 方法并指定分隔符,

!type ex1.csv       # 这个是不包含表头 行的
1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo

# 要读取这样的文件,需要选择一些选项,可利用允许pandas自动分配默认列名,也可以自己指定列名
pd.read_csv('ex1.csv',header=None)
	0	1	2	3	4
0	1	2	3	4	hello
1	5	6	7	8	world
2	9	10	11	12	foo

pd.read_csv('ex1.csv')
	1	2	3	4	hello    # 这把第一行就当头了。。。
0	5	6	7	8	world
1	9	10	11	12	foo

pd.read_csv('ex1.csv',names=['a','b','c','d','message'])
   a	b	c	d	message
0	1	2	3	4	hello
1	5	6	7	8	world
2	9	10	11	12	foo



# 如果你想要 message 列成为返回dataframe 的索引,你可以指定位置4 的列为索引,或‘message’ 传入 index_col
pd.read_csv('ex1.csv',names=['a','b','c','d','message'],index_col=4)
	   a	b	c	d
message				           
hello	1	2	3	4
world	5	6	7	8
foo	9	10	11	12

!type ex1.csv
key1,key2,value1,value2
one,a,1,2
one,b,3,4
one,c,5,6
one,d,7,8
two,a,9,10
two,b,11,12
two,c,13,14
two,d,15,16

pd.read_csv('ex1.csv',index_col=['key1','key2']) # 从多个列中形成一个分层索引,需要传入一个包含列序号,列名的列表
      value1	value2
key1	key2		
one	a	1	2
    b	3	4
    c	5	6
    d	7	8
two	a	9	10
    b	11	12
    c	13	14
    d	15	16


list(open('ex3.txt')) # 这些字段通过不同数量的空格分开,传入一个正则作为分隔符
[' A B C\n', 'aaa 1 2 3\n', 'bbb 3 5 6\n', 'ccc 7 8 9\n', 'ddd 10 11 12\n']
pd.read_table('ex3.txt',sep='\s+')        # 匹配空白字符
   A	B	C 
aaa	1	2	3          # 由于列名的数量比数据的列数少了一个,默认将第一列当作了dataframe 的索引。
bbb	3	5	6
ccc	7	8	9
ddd	10	11	12


# 解析函数有很多附加参数帮助你除了各种发生异常的文件格式

list(open('ex3.csv',encoding='utf-8'))
['# 额\n',
 ' A B C\n',
 ' # 可不可以把我去了\n',
 ' # 啊\n',
 'aaa 1 2 3\n',
 'bbb 3 5 6\n',
 'ccc 7 8 9\n',
 'ddd 10 11 12\n']

pd.read_csv('ex3.csv',skiprows=[0,2,3])      # 跳过这三行
     A B C
0	aaa 1 2 3
1	bbb 3 5 6
2	ccc 7 8 9
3	ddd 10 11 12

# 缺失值要么不显示,要么用一些标识值,pandas 中常用 NA NULL
!type ex2.csv
a,b,c,d,message
1,2,3,4,hello
5,6,7,8,world
8,10,11,12,foo
13,NA,15,16,NA
result=pd.read_csv('ex2.csv')
   a	b	c	d	message
0	1	2.0	3	4	hello
1	5	6.0	7	8	world
2	8	10.0	11	12	foo
3	13	NaN	15	16	NaN
pd.isnull(result)
	a	b	c	d	message
0	False	False	False	False	False
1	False	False	False	False	False
2	False	False	False	False	False
3	False	True	False	False	True


pd.read_csv('ex2.csv',na_values=['hello'])     # 需要NA 来替换的序列
   a	b	c	d	message
0	1	2.0	3	4	NaN          # 这里把原来的 hello 替换成了 NAN
1	5	6.0	7	8	world
2	8	10.0	11	12	foo
3	13	NaN	15	16	NaN

sentinels={'message':['hello','foo'],'a':[1]}         # 再字典中,每列可以指定不同的缺失值标识
pd.read_csv('ex2.csv',na_values=sentinels)
   a	b	c	d	message
0	NaN	2.0	3	4	NaN
1	5.0	6.0	7	8	world
2	8.0	10.0	11	12	NaN
3	13.0	NaN	15	16	NaN

在这里插入图片描述
在这里插入图片描述

6.1.1 分块读入文本文件

当处理大型文件或找出正确的参数集来正确处理大文件时,你可能需要读入文件的一个小片段或者按照小块遍历文件。

再尝试大文件之前,我们可以先对pandas 的显示设置进行调整,使之更加紧凑。

pd.options.display.max_rows=10

pd.read_csv('ex6.csv')         # 额,10000行,确实是大文件。https://github.com/wesm/pydata-book 可以下载下来看看
	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
...	...	...	...	...	...
9995	2.311896	-0.417070	-1.409599	-0.515821	L
9996	-0.479893	-0.650419	0.745152	-0.646038	E
9997	0.523331	0.787112	0.486066	1.093156	K
9998	-0.362559	0.598894	-1.843201	0.887292	G
9999	-0.096376	-1.012999	-0.657431	-0.573315	NaN
10000 rows × 5 columns

pd.read_csv('ex6.csv',nrows=5)     # 只读取前五行

chunker=pd.read_csv('ex6.csv',chunksize=1000)         # 分块,指定chunksize 作为每一块的行数,
chunker
<pandas.io.parsers.TextFileReader at 0x1868c0319c8>


# read_csv 返回的 TextParser 对象允许你根据 chunksize 历遍文件。
# 例如,我们历遍 ex6.csv 并对 'key' 列聚合获得计数值
tot=pd.Series([])
for piece in chunker:
    tot=tot.add(piece['key'].value_counts(),fill_value=0)     # 就是获得key 列各值的个数,,
tot=tot.sort_values(ascending=False)
tot[:10]
E    368.0
X    364.0
L    346.0
O    343.0
Q    340.0
M    338.0
J    337.0
F    335.0
K    334.0
H    330.0
dtype: float64

有内味了。。。。。。。

猜你喜欢

转载自blog.csdn.net/weixin_46192930/article/details/106539325