如何使用python读取一个2G的csv文件?

论坛 期权论坛 知乎     
知乎de用户   2019-8-18 00:57   12192   4
转载声明:本文由互联网用户自发贡献,部分转载来源来自知乎(zhihu.com),强烈建议您访问知乎查看完整内容。本社区不拥有所有权,也不承担任何法律责任。如有侵权,请联系optbbs@163.com。一经查实,即刻删除。
小白在项目中遇到的问题,csv文件太大(2G),使用csvreader读取一直报内存错误,应该怎么办?
分享到 :
0 人收藏

4 个回复

倒序浏览
2#
热心回应  16级独孤 | 2019-8-18 00:57:46 发帖IP地址来自
Python 的标准库 csv 的 reader 返回的就是个generator,你用 functool 里的 islice 截一百万行就好
3#
热心回应  16级独孤 | 2019-8-18 00:57:47 发帖IP地址来自
用Dask 处理csv大文件。
社区专栏
4#
热心回应  16级独孤 | 2019-8-18 00:57:48 发帖IP地址来自
读大文件时一次读入整个文件就容易内存溢出,如
  1. with open('/path/to/file') as f:     content = f.read()     print content
复制代码
调用read()会一次性读取文件的全部内容,要防止这种情况发生,考虑反复调用read(size)方法,每次最多读取size个字节的内容,如下:
  1. with open('/path/to/file') as f:     while True:         chunk_data = f.read(1024)         if not chunk_data:             break         print chunk_data
复制代码
回答你的问题:要读一百万行写入新的文件,可以用readline,一次读取一行,边读边写,如下
  1. with open('/path/to/input') as fi, open('/path/to/output/' as fo:     for i in xrange(1000000):         chunk_data = fi.readline()         if not chunk_data:             break         fo.write(content)
复制代码
5#
热心回应  16级独孤 | 2019-8-18 00:57:49 发帖IP地址来自
其实好多回答有点宽泛,例如我就需要csv文件按行读取,而且每行例如是个list,每个字段的数据是需要做数据分析的,所以我需要按行读取,不是简单的将整个文件读出来就完事了,读取后需要做数据处理;
百度到一个答案感觉可能是我需要的,如下:
需要的注意的点有:1. 在读完若干行数据以后,需要获取一下当前这个file  object的位置,Python提供了.tell()方法来获取这个值;2.  读取文件的时候需要知道上一会读到什么地方了,并且从那里继续往下读,用到了.seek()方法;3.  readline()方法在读到文件末尾的时候只会返回一个空字符,所以需要对这个空字符做一点处理。
def readcsv2list(filename, rows, last_position, max_line):
    fileobj = open(filename, 'rb')
fileobj.seek(last_position)#seek定义文件读取的开始位置
    datalines = []
    for i in range(max_line):
        line_itme = fileobj.readline()
        if len(line_itme) > 0:
            datalines.append(line_itme)
        else:
            break
    csvreader = csv.reader(datalines)
    retlist = []
    for row in csvreader:
        clist = []
        selected_rows = [ic for ic in range(len(row)) if ic not in rows]
        for c in selected_rows:
            clist.append(row[c])
        retlist.append(clist)
    current_position = fileobj.tell()
    fileobj.close()
    return retlist, current_position
Python,尤其是低版本(例如我们用的2.4.3),对于在程序里面显式地del一些变量(通常是个大list之类),是不会立刻释放内存的,所以对于处理数据量比较大的case的时候就需要特别注意内存的使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:55334
帖子:27423
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP