python 在大文件里面删除某一行,比较有效率的方法

  用 python 处理一个文本时,想要删除其中中某一行,常规的思路是先把文件读入内存,在内存中修改后再写入源文件。

但如果要处理一个很大的文本,比如GB级别的文本时,这种方法不仅需要占用很大内存,而且一次性读入内存时耗费时间,还有可能导致内存溢出。

  所以,需要用另外一个思路去处理。

  我们可以使用 open() 方法把需要修改的文件打开为两个文件,然后逐行读入内存,找到需要删除的行时,用后面的行逐一覆盖。实现方式见以下代码。

 1 with open(‘file.txt‘, ‘r‘) as old_file:
 2     with open(‘file.txt‘, ‘r+‘) as new_file:
 3
 4         current_line = 0
 5
 6         # 定位到需要删除的行
 7         while current_line < (del_line - 1):
 8             old_file.readline()
 9             current_line += 1
10
11         # 当前光标在被删除行的行首,记录该位置
12         seek_point = old_file.tell()
13
14         # 设置光标位置
15         new_file.seek(seek_point, 0)
16
17         # 读需要删除的行,光标移到下一行行首
18         old_file.readline()
19
20         # 被删除行的下一行读给 next_line
21         next_line = old_file.readline()
22
23         # 连续覆盖剩余行,后面所有行上移一行
24         while next_line:
25             new_file.write(next_line)
26             next_line = old_file.readline()
27
28         # 写完最后一行后截断文件,因为删除操作,文件整体少了一行,原文件最后一行需要去掉
29         new_file.truncate()
时间: 2024-10-10 06:10:37

python 在大文件里面删除某一行,比较有效率的方法的相关文章

python实现将文件中的每一行文本记录,保存到MongoDB数据库,并防止重复插入

文本如下: #日期 流水号 被浏览页面URL 第×页 访问者IP 访问时间 是否入口 操作系统 浏览器 语言 时区 屏幕分辨率 屏幕色彩位数 省份 城市 接入商 上网场所 是否安装ALEXA 2014-7-17 11452775496 http://www.imaibo.net/space/178120 1 59.41.23.101 2014-7-17 13:38:14 0 Windows XP Chrome 21.0.82014-7-17 11452775466 http://www.imai

python处理大文件的内存问题

摘要: 同学们时常会遇到要处理大文件的情况,现在是大数据时代,有些文件动辄几十个G,我们在处理这样文件的时候一不小心就把内存撑爆了,或者程序被强制kill掉了. 原因是你一次性把文件的所有内容都读取到内存里面了.python里面有方法可以一段一段的读文件. 正文: 没错,就是用iterator,又叫迭代器,实例代码如下. cat test.py f = open('data', 'r') for line in f: line = line.split(";;") lines.appe

python读取大文件

最近在学习python的过程中接触到了python对文件的读取.python读取文件一般情况是利用open()函数以及read()函数来完成: f = open(filename,'r') f.read() 这种方法读取小文件,即读取远远大小小于内存的文件显然没有什么问题.但是如果是将一个10G大小的日志文件读取,即文件大于内存的大小,这么处理就有问题了,会造成MemoryError ... 也就是发生内存溢出. 发生这种错误的原因在于,read()方法执行操作是一次性的都读入内存中,显然文件大

python读取大文件的方法

python计算文件的行数和读取某一行内容的实现方法 :最简单的办法是把文件读入一个大的列表中,然后统计列表的长度.如果文件的路径是以参数的形式filepath传递的,那么只用一行代码就可以完成我们的需求了: 1.http://blog.csdn.net/shudaqi2010/article/details/54017766 2.https://www.cnblogs.com/yu-zhang/p/5949696.html 3.http://blog.csdn.net/churximi/art

python对大文件的增量读取

欢迎关注我的豆瓣http://www.douban.com/note/484517776/ 对于很多大文件的增量读取,如果遍历每一行比对历史记录的输钱或者全都加载到内存通过历史记录的索引查找,是非常浪费资源的,网上有很多人的技术博客都是写的用for循环readline以及一个计数器去增量读取,这样是十分脑残的,假如文件很大,遍历一次太久.  我们需要了解获取文件句柄的基本理论,其中包含的指针操作等.  原理是这样子,linux的文件描述符的struct里有一个f_pos的这么个属性,里面存着文件

python 读取大文件

要读取个大文件,文件大概是3G左右,担心read会出现内存溢出的情况,网上找了个靠谱的用法: with open(...) as f: for line in f: <do something with line> The with statement handles opening and closing the file, including if an exception is raised in the inner block. The for line in f treats the

python读取大文件【一行一行读取】

with open('e:/content.txt') as f: for line in f: if '==3346628==' in line: …………

python学习——大文件分割与合并

在平常的生活中,我们会遇到下面这样的情况: 你下载了一个比较大型的游戏(假设有10G),现在想跟你的同学一起玩,你需要把这个游戏拷贝给他. 然后现在有一个问题是文件太大(我们不考虑你有移动硬盘什么的情况),假设现在只有一个2G或4G的优盘,该怎么办呢? 有很多方法,例如winrar压缩的时候分成很多小卷,这里不累述. 在学习python之后,我们自己就可以解决这个问题啦. 我们可以自己写一个脚本去分割合并文件,将文件分割成适合优盘大小的小文件,在拷贝,然后再合并. 下面是文件分割脚本: 1 im

python 读取大文件越来越慢(判断 key 在 map 中,千万别用 in keys())

背景: 今天乐乐姐写代码,读取一个四五百兆的文件,然后做一串的处理.结果处理了一天还没有出来结果.问题出在哪里呢? 解决: 1. 乐乐姐打印了在不同时间点的时间,直接print time() 即可.发现一个规律,执行速度是越来越慢的. 2. 为什么会越来越慢呢? 1)可能原因1,GC 的问题,有篇文章里面写,python list append 的时候会越来越慢,解决方案是禁止GC: 使用 gc.disable()和gc.enable() 2)改完上面,仍然不行,然后看到一篇文章里面写,可能是因