Python学习笔记:ad_csv分块读取⼤⽂件
python怎么读csv数据(chunksize、i。。。
⼀、背景
⽇常数据分析⼯作中,难免碰到数据量特别⼤的情况,动不动就2、3千万⾏,如果直接读进 Python 内存中,且不说内存够不够,读取的时间和后续的处理操作都很费劲。
Pandas 的 read_csv 函数提供2个参数:chunksize、iterator ,可实现按⾏多次读取⽂件,避免内存不⾜情况。
使⽤语法为:
* iterator : boolean, default False
返回⼀个TextFileReader 对象,以便逐块处理⽂件。
* chunksize : int, default None
⽂件块的⼤⼩, See IO Tools docs for more informationon iterator and chunksize.
测试数据⽂件构建:
import pandas as pd
import numpy as np
import os
os.chdir(r'C:\Users\111\Desktop')
np.random.seed = 2021
df_size = 1000 # 10000000
df = pd.DataFrame({
'a': np.random.rand(df_size),
'b': np.random.rand(df_size),
'c': np.random.rand(df_size),
'd': np.random.rand(df_size),
'e': np.random.rand(df_size)
})
df.head()
<_csv('data.csv')
⼆、指定 chunksize 分块读取⽂件
import pandas as pd
reader = pd.read_csv('data.csv', sep=',', chunksize=10)
# <pandas.io.parsers.TextFileReader at 0x1fc81f905e0>
for chunk in reader:
# df = chunk
# 对 chunk 进⾏数据处理
print(type(chunk), chunk.shape)
'''
<class 'frame.DataFrame'> (10, 6)
<class 'frame.DataFrame'> (10, 6)
<class 'frame.DataFrame'> (10, 6)
<class 'frame.DataFrame'> (10, 6)
<class 'frame.DataFrame'> (10, 6)
'''
for chunk in reader:
# df = chunk
# 对 chunk 进⾏数据处理
lumns)
三、指定 iterator=True
指定 iterator=True 也可以返回⼀个可迭代对象 TextFileReader 。
iterator=True 和 chunksize 可以同时指定使⽤。
reader = pd.read_csv('data.csv', sep=',', iterator=True)
data = _chunk(5) # 返回N⾏数据块
data
'''
Unnamed: 0 a b c d e
0 0 0.289972 0.717806 0.886283 0.522148 0.976798
1 1 0.25495
2 0.04807
3 0.464765 0.138978 0.983041
2 2 0.634708 0.533182 0.855981 0.456156 0.620018
3 3 0.812648 0.024870 0.536520 0.894937 0.102704
4 4 0.699629 0.03830
5 0.379534 0.876242 0.906875
'''
get_chunk(size) -- 返回⼀个N⾏的数据块
每次执⾏获取N⾏数据,再次执⾏,获取下⼀个数据块
filePath = r'data_csv.csv'
f = open(filePath, encoding='utf-8')
reader = pd.read_csv(f, sep=',', iterator=True)
data1 = _chunk(5)
data2 = _chunk(6)
f.close()
读取未知数据⽂件(超⼤⽂件,⼏GB)前⼏⾏,进⾏数据类型观察、列标签观察等。
四、其他技巧
1.获取⽂件⾏数
count = 0
file = open('data_csv.csv', 'r', encoding='utf-8')
while 1:
buffer = ad(8*1024*1024) # 可⼤概设置
if not buffer:
break
count += unt('\n')
print(count)
file.close()
再根据⾏数估算内存可读进多少数据,将原始数据进⾏划分为多少块?
2.分块拆分⽂件
import pandas as pd
reader = pd.read_csv('data_csv.csv', sep=',', chunksize=2000000)
for i, chunk in enumerate(reader):
print(i, ' ', len(chunk))
<_csv('./data/data_' + str(i) + '.csv', index=False)
Python 路径加⼀点是当前路径,加两点是上⼀级路径。
3.合并数据
import pandas as pd
df = [pd.read_csv('./data/data_' + str(i) + '.csv') for i in range(5)] # 列表推导式
data = pd.concat(df, axis=0).reset_index(drop=True) # 合并
data.head()
data.tail()
当 axis = 0 时,pd.concat 实现列对齐合并。
4.分块读取⽂件
import feather
import pandas as pd
filePath = r'data_csv.csv'
def read_csv_feature(filePath):
# 读取⽂件
f = open(filePath, encoding='utf-8')
reader = pd.read_csv(f, sep=',', iterator=True)
loop = True
chunkSize = 1000000
chunks = []
while loop:
try:
chunk = _chunk(chunkSize)
chunks.append(chunk)
except StopIteration:
loop = False
print('Iteration is END')
df = pd.concat(chunks, axis=0, ignore_index=True) f.close()
return df
data = read_csv_feature(filePath)
参考链接:
参考链接:
参考链接:
参考链接:
参考链接:
参考链接:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论