加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 删除巨大的csv中已知的确切行

发布时间:2020-12-16 23:02:34 所属栏目:Python 来源:网络整理
导读:我有一个~2亿行,7列csv文件.我需要删除第2636759行. 这个文件是7.7GB,超过内存容量.我对R最熟悉,但也可以在 python或bash中做到这一点. 我无法在一次操作中读取或写入此文件.在磁盘上以增量方式构建此文件的最佳方法是什么,而不是尝试在内存中执行此操作?
我有一个~2亿行,7列csv文件.我需要删除第2636759行.
这个文件是7.7GB,超过内存容量.我对R最熟悉,但也可以在 python或bash中做到这一点.

我无法在一次操作中读取或写入此文件.在磁盘上以增量方式构建此文件的最佳方法是什么,而不是尝试在内存中执行此操作?

我试图在SO上找到它,但只能找到如何使用足够小的文件来读取/写入内存,或者使用位于文件开头的行.

解决方法

一个python解决方案:
import os
with open('tmp.csv','w') as tmp:

    with open('file.csv','r') as infile:
        for linenumber,line in enumerate(infile):
            if linenumber != 10234:
                tmp.write(line)

# copy back to original file. You can skip this if you don't
# mind (or prefer) having both files lying around           
with open('tmp.csv','r') as tmp:
    with open('file.csv','w') as out:
        for line in tmp:
            out.write(line)

os.remove('tmp.csv') # remove the temporary file

这会复制数据,如果磁盘空间有问题,这可能不是最佳数据.如果不首先将整个文件加载到RAM中,则写入将更复杂

关键是python自然支持处理files as iterables.这意味着它可以被懒惰地评估,你永远不需要一次把整个东西保存在内存中

我喜欢这个解决方案,如果您的主要关注点不是原始速度,因为您可以用任何条件测试替换行亚麻布!= VALUE,例如,过滤掉包含特定日期的行

test = lambda line : 'NOVEMBER' in line
with open('tmp.csv','w') as tmp:
    ...
    if test(line):
    ...

In-place read-writes和memory mapped file objects(可能相当快)将需要更多的簿记

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读