python读取超大文件 linecache_Read a large file with python

本文介绍了使用Python读取大文件的两种方法:利用with结构结合缓冲io和使用生成器。同时提到了Linux下split命令对文件的分割。还详细讲解了linecache模块,它能优化文件读取速度,减少I/O操作。通过示例展示了如何统计大文件中特定字符串出现的次数,并强调了Python在处理大文件时的效率优势。
摘要由CSDN通过智能技术生成

python读取大文件

较pythonic的方法,使用with结构

文件可以自动关闭

异常可以在with块内处理

with open(filename, 'rb') as f:

for line in f:

最大的优点:对可迭代对象 f,进行迭代遍历:for line in f,会自动地使用缓冲io(buffered io)以及内存管理,而不必担心任何大文件的问题。

there should be one – and preferably only one – obvious way to do it.

使用生成器generator

如果想对每次迭代读取的内容进行更细粒度的处理,可以使用yield生成器来读取大文件

def readinchunks(file_obj, chunksize=2048):

"""

lazy function to read a file piece by piece.

default chunk size: 2kb.

"""

while true:

data = file_obj.read(chunksize)

if not data:

break

yield data

f = open('bigfile')

for chunk in readinchunks(f):

do_something(chunk)

f.close()

linux下使用split命令(将一个文件根据大小或行数平均分成若干个小文件)

wc -l blm.txt # 读出blm.txt文件一共有多少行

# 利用split进行分割

split -l 2482 ../blm/blm.txt -d -a 4 blm_

# 将 文件 blm.txt 分成若干个小文件,每个文件2482行(-l 2482),文件前缀为blm_ ,系数不是字母而是数字(-d),后缀系数为四位数(-a 4)

# 按行数分割

split -l 300 large_file.txt new_file_prefix

# 文件大小分割

split -b 10m server.log waynelog

# 对文件进行合并:使用重定向,'>' 写入文件 , '>>' 追加到文件中

cat file_prefix* > large_file

在工作中的日常: 用户信息,log日志缓存,等都是大文件

补充:linecache模块

当读取一个文件的时候,python会尝试从缓存中读取文件内容,优化读取速度,提高效率,减少了i/o操作

linecache.getline(filename, lineno) 从文件中读取第几行,注意:包含换行符

linecache.clearcache() 清除现有的文件缓存

linecache.checkcache(filename=none) 检查缓存内容的有效性,可能硬盘内容发生改变,更新了,如果没有参数,将检查缓存中的所有记录(entries)

import linecache

linecache.getline(linecache.__file__, 8)

题目:

现给一个文件400m(该文件是由/etc/passwd生成的),统计其中root字符串出现的次数

import time

sum = 0

start = time.time()

with open('file', 'r') as f:

for i in f:

new = i.count('root')

sum+=new

end = time.time()

print(sum, end-start)

注:有时候这个程序比c,shell快10倍,原因就是,python会读取cache中的数据,使用缓存在内部进行优化,减少i/o,提高效率

希望与广大网友互动??

点此进行留言吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值