{eval=Array;=+count(Array);}

问答专栏Q & A COLUMN

如何使用Python读取大文件?

TangpjTangpj 回答0 收藏2
收藏问题

3条回答

funnyZhang

funnyZhang

回答于2022-06-28 15:56

我先假设题主问的大文件在1G~20G左右,这应该算常规的大文件。平常我在做机器学习模型时候我喜欢先在本机上做玩具模型,里面有个步骤就是经常要读取文件数据,也差不多这么一个数据量。

一般来说,Python读取大文件的方式可以使用原生的open函数或者pandas的read_csv函数都可以达到目的。

open函数

Python读取文件一般是用open函数读取,例如f=open(xx,"r")后f.read()就可以轻松读取到文本内容。

如果像数据比较大的情况下,可以用read(参数)或者readline()的方式进行迭代读取,具体代码如下:

read_csv()

read_csv是Python中一个很有名的数据分析工具包pandas里面的函数,它既可以读取txt也可以读取csv格式文件。read_csv中有个参数是chunksize,通过指定一个chunksize分块大小来读取文件。具体代码如下:

还有一个参数是iterator,可以把文件对象变为可迭代对象,只要iterator=True即可,具体代码如下:

当然我内存只有8G所以读取会比较慢,所以花了点时间研究了一下后有了上面这些奇淫技巧读取速度后确实快了不少。当然如果大家有更好的方法或建议欢迎在评论区探讨交流,互相学习学习。


如果你对学习人工智能和科技新闻感兴趣,欢迎订阅我的头条号。我会在这里发布所有与科技、科学以及机器学习有关的有趣文章。偶尔也回答有趣的问题,有问题可随时在评论区回复和讨论,看到即回。

(码字不易,若文章对你帮助可点赞支持~)

评论0 赞同0
  •  加载中...
zzbo

zzbo

回答于2022-06-28 15:56

这里以读取txt大文件为例,简单介绍一下Python是如何读取大文件的,系统内存在8G左右,txt文件的大小为5G,实验环境win10+python3.6+pycharm2018,主要内容如下:

1.首先,按照最原始的方法读取txt文件,即用open函数直接打开txt文件,一次将所有数据读入到内存中,这里如果文件大于系统运行内存,会直接报Memery Error错误,测试代码如下,非常简单:

运行这个程序,读取花费时间大概在41s左右,如下:

2.最基本的方法,为了提高读取速度,以二进制方式打开文件,测试代码如下,对上面的代码只需要稍微修改一下就行,open打开时,设置方式为rb:

运行这个程序,截图如下,读取时间大概在7s左右,明显比直接读取快6倍左右:

3.为了更快的提高读取速度,这里我们在read读取文件的时候,可以按块大小读取,每次读取一定大小的块,依次循环,直到整个文件读完,测试代码如下,也非常简单:

运行这个程序,截图如下,读取时间大概在3.5s左右,比上面直接读取快2倍左右:

4.这里还有一种提高读取的方法就是使用with open打开文件,把文件对象视为一个迭代器,系统会自动使用缓冲IO和内存管理,所以读取速度也会有一定提升,测试代码如下:

运行程序,读取时间大概在26s左右,比直接读取快1倍左右,如下:

5.当然,对于其他类型的大文件,像CSV,Excel等,读取时也可以按块读取,速度也会有明显的提升,基本代码如下,每次读取一定块大小的文件,直到整个文件读完:

至此,我们就完成了使用Python读取大文件。总的来说,基本思想就是按块读取,每次只读取一定块大小的数据,这样读取速度会有明显提升,网上也有相关教程和资料,介绍的非常详细,感兴趣的话,可以搜一下,希望以上分享的内容能对你有所帮助吧,也欢迎大家评论、留言进行补充。

评论0 赞同0
  •  加载中...
Tangpj

Tangpj

回答于2022-06-28 15:56

之前使用Python读取超大CSV文件时,出现MemoryError错误,甚至死机。。。呕心沥血潜心研究后,发现使用pandas的read_csv模块通过分块读取,可以完美解决针对超大CSV文件进行数据分析处理时的内存不足问题,分享一下。

pandas 安装

Anaconda是一个开源的Python发行版本,其包含了conda、Python、numpy、pandas等180多个科学包及其依赖项。建议直接安装Anaconda2 或 Anaconda3 ,最好装64位。

下载地址如下:

https://www.anaconda.com/

read_csv官方文档链接:

http://pandas.pydata.org/pandas-docs/stable/io.html#io-read-csv-table

从官方文档中我们注意到chunksize 、iterator两个参数,下面我们就这两个参数做详细介绍 。

Iteration

iterator : boolean, default False

Return TextFileReader object for iteration or getting chunks with get_chunk().

chunksize : int, default None

Return TextFileReader object for iteration. See iterating and chunking below.

read_csv——chunksize参数介绍

read_csv中有个参数chunksize,通过指定一个chunksize分块大小来读取文件,返回的是一个可迭代的对象TextFileReader,分块处理可以避免将所有的文件载入内存,仅在使用的时候读入所需内容。数据的处理和清洗通常使用分块的方式处理,可以大大降低内存的使用,同时耗时要相对长一些。

输出

read_csv——iterator参数

指定iterator=True 也可以返回一个可迭代对象TextFileReader。

输出


其他方式

除了通过分块避免一次性将全部内容加载至内存中,还可以尝试如下方式读取超大csv文件进行数据分析、处理。

  1. 对数据进行降维
  2. 增大机器内存或使用spark集群(pyspark)


若对你有帮助,点赞支持哦。

评论0 赞同0
  •  加载中...

相关问题

最新活动

您已邀请0人回答 查看邀请

我的邀请列表

  • 擅长该话题
  • 回答过该话题
  • 我关注的人
向帮助了您的网友说句感谢的话吧!
付费偷看金额在0.1-10元之间
<