Python内存不够怎么办!!!pandas.read_csv中的那些有用参数

最近因为各种事情用Python处理文件,经常遇到文件太大,内存不够的问题,在此整理了以下几种办法。

pandas 读文件失败–》分块处理

有些时候使用pd.read_csv函数读文件会非常尴尬,读到一半内存就不够了,这时候可以使用其提供的分块读取的功能

不想看我废话可以直接-》pd.read_csv函数官方文档

方案一:chunksize 参数(int, optional)

使用chunksize后pd.read_csv将会返回一个可以迭代的TextFileReader对象。
chunksize的值代表了每次迭代对象的数量

data=pd.read_csv('bigdata.csv',chunksize=4)
data

当我们需要从这个TextFileReader对象中取值时,可以使用for循环。值得注意的是,如果文件有7行,chunksize=3,对于第三次迭代将会只返回第7行,如果函数化处理的的时候记得不要出bug。

for chunk in data:
	print(chunk)

Python内存不够怎么办!!!pandas.read_csv中的那些有用参数_第1张图片

方案二:iterator参数 (bool, default False)

返回的也是TextFileReader 对象,但是使用的时候和chunksize参数略有不同,需要使用get_chunk()。括号内的数值定义了每次返回的行数

同样的也需要注意最后一次迭代

data=pd.read_csv('bigdata.csv',iterator=True)
data.get_chunk(3)

Python内存不够怎么办!!!pandas.read_csv中的那些有用参数_第2张图片

方案三:指定数据类型-- dytpe 参数(Type name or dict of column -> type, optional)

有时候会发现生成并保存了了一个csv文件,最后读取的时候发现总是内存不足不能读取。该现象的出现是由于Python中的 read_csv 函数必须要读取所有行才能确定每一类的数据类型(dtype),据说在读取的时候默认以字符串格式读入,当读取完最后一行后才会更改其类型(参考资料)。

以字符串格式读入时,内存占用比较大,在这时候可能会出现内存不足的问题。所以我们只需要让pandas在读取的时候就按照对应的格式读取就不会出现该问题。

可以直接传入pandas支持的类型,具体有哪些请见 pandas官方文档,也可以传入numpy支持的类型(如下)

#直接设置
pd.read_csv('test.csv',dtype={"user_id": np.int16, "username": object})  

# 或者以字典形式传入
typemap={"user_id": np.int16,
		 "username": object}
pd.read_csv('test.csv',dtype=typemap)

或许你会说加粗样式本来就不确定每一列的类型怎么办,当然也有一些技巧。就是下面要说的usecols,读一行判定一行的dtype,最后汇总。

方案四:只需要读取特定行-- usecols 参数(list-like or callable, optional)

usecols 可以指定读取的列,其中的参数可以是 列名或者列序号, 注意在同时使用列序号、header=0读取时的输出

usecols: list-like or callable, optional
Return a subset of the columns. If list-like, all elements must either be positional (i.e. integer indices into the document columns) or strings that correspond to column names provided either by the user in names or inferred from the document header row(s). For example, a valid list-like usecols parameter would be [0, 1, 2] or [‘foo’, ‘bar’, ‘baz’]. Element order is ignored, so usecols=[0, 1] is the same as [1, 0]. To instantiate a DataFrame from data with element order preserved use pd.read_csv(data, usecols=[‘foo’, ‘bar’])[[‘foo’, ‘bar’]] for columns in [‘foo’, ‘bar’] order or pd.read_csv(data, usecols=[‘foo’, ‘bar’])[[‘bar’, ‘foo’]] for [‘bar’, ‘foo’] order.
If callable, the callable function will be evaluated against the column names, returning names where the callable function evaluates to True. An example of a valid callable argument would be lambda x: x.upper() in [‘AAA’, ‘BBB’, ‘DDD’]. Using this parameter results in much faster parsing time and lower memory usage.

你可能感兴趣的:(笔记)