Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python 按行读取文本文件 缓存 和 非缓存实现

Python 按行读取文本文件 缓存 和 非缓存实现

原创
作者头像
代码伴一生
修改于 2021-11-02 03:28:03
修改于 2021-11-02 03:28:03
1.7K00
代码可运行
举报
文章被收录于专栏:代码伴一生代码伴一生
运行总次数:0
代码可运行

需求

最近项目中有个读取文件的需求,数据量还挺大,10万行的数量级。

java 使用缓存读取文件是,会相应的创建一个内部缓冲区数组在java虚拟机内存中,因此每次处理的就是这一整块内存。

简单的想:就是如果不用缓存,每次都要硬盘–虚拟机缓存–读取;有了缓存,提前读了一段放在虚拟机缓存里,可以避免频繁将硬盘上的数据读到缓存里。

因为对内存的操作肯定是比硬盘的操作要快的。

对了,java还有映射内存,可以解决大文件读写的问题。

思路

大文件读写不能一次全部读入内存,这样会导致耗尽内存。(但是在内存允许的情况下,全部读入内存是不是速度更快??) 对于大文件可以一行一行读取,因为我们处理完这行,就可以把它抛弃。

我们也可以一段一段读取大文件,实现一种缓存处理。每次读取一段文件,将这段文件放在缓存里,然后对这段处理。这会比一行一行快些。

方法1:一行一行读取

我们可以打开一个文件,然后用for循环读取每行,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def method1(newName):
    s1 = time.clock()
    oldLine = '0'
    count = 0
    for line in open(newName):
        newLine =  line
        if (newLine != oldLine):
            #判断是不是空行
            if newLine.strip():
                nu = newLine.split()[0]
                oldLine = newLine
                count += 1
    print "deal %s lines" %(count)
    e1 = time.clock()
    print "cost time " + str(e1-s1)

我们测试一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fileName = 'E:\\pythonProject\\ruisi\\correct_re.txt'
method1(fileName)

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
deal 218376 lines
cost time 0.288900734402

方法1.1 一行一行读取的变形

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def method11(newName):
    s1 = time.clock()
    oldLine = '0'
    count = 0
    file = open(newName)
    while 1:
        line = file.readline()
        if not line:
            break
        else:
            if line.strip():
                newLine =  line
                if (newLine != oldLine):
                    nu = newLine.split()[0]
                    oldLine = newLine
                    count += 1
    print "deal %s lines" %(count)
    e1 = time.clock()
    print "cost time " + str(e1-s1)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
deal 218376 lines
cost time 0.371977884619

耗时和方法1差不多,比方法1稍微多些。

方法2:一行一行,使用fileinput模块

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def method2(newName):
    s1 = time.clock()
    oldLine = '0'
    count = 0
    for line in fileinput.input(newName):
        newLine =  line
        if newLine.strip():
            if (newLine != oldLine):
                nu = newLine.split()[0]
                oldLine = newLine
                count += 1
    print "deal %s lines" %(count)
    e1 = time.clock()
    print "cost time " + str(e1-s1)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
deal 218376 lines
cost time 0.514534051673

这儿的耗时差不多是方法1的两倍。

借助缓存,每次读取1000行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def method3(newName):
    s1 = time.clock()
    file = open(newName)
    oldLine = '0'
    count = 0
    while 1:
        lines = file.readlines(10*1024)
        #print len(lines)
        if not lines:
            break
        for line in lines:
            if line.strip():
                newLine =  line
                if (newLine != oldLine):
                    nu = newLine.split()[0]
                    oldLine = newLine
                    count += 1
    print "deal %s lines" %(count)
    e1 = time.clock()

Note readlinessizehint() 参数是限定字节大小,不是行数。 注意默认有个内部缓冲区大小是8KB,如果设定值小于 8*1024。那么都是按照8KB来的。print len(lines)输出大概都为290。 只有当设定值大于8KB,上面的print len(lines)才会发生变化。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
deal 218376 lines
cost time 0.296652349397

这儿的性能还没方法1,表现好。可以调整每次读取的行数,比如500,1000等等,可以达到不同的耗时。

方法4 一次性全部读到内存里

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def method4(newName):
    s1 = time.clock()
    file = open(newName)
    oldLine = '0'
    count = 0
    for line in file.readlines():
        if line.strip():
            newLine =  line
            if (newLine != oldLine):
                nu = newLine.split()[0]
                oldLine = newLine
                count += 1
    print "deal %s lines" %(count)
    e1 = time.clock()
    print "cost time " + str(e1-s1)

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
deal 218376 lines
cost time 0.30108883108

结论

推荐使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with open('foo.txt', 'r') as f:
    for line in f:
        # do_something(line)

对于大文件可以使用索引,这个索引记录下每行开头的位置,之后就可以用file.seek()定位了。如果文件内容修改了,还需要重新建立索引。这个索引可以有很多种方法建立,但是都需要将文件遍历一次。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python 读取文本文件的内容
数据存储方式有很多种。如果数据的数据量比较大、数据类型繁多且要求便于搜索,我们一般会选择存储到数据库中。如果数据内容只是一些的文本信息,我们可以将数据存储到 TXT 、JSON、CSV 等文本文件中。类似存储小说、日志内容等场景,一般是将内容存储到文本文件中。数据已经存储到 txt 文件中,那该如何读取了?本文的主要内容是讲解如何读取文本文件的内容。
猴哥yuri
2018/08/16
2.6K0
如何使用Python读取文本文件并回答问题?
要使用Python读取文本文件并回答问题,您可以按照以下步骤进行:打开文本文件—读取文件内容—解析文件内容以回答问题—根据问题提取所需信息并给出答案。其实大体上使用Python读取文本文件并回答问题也就这几个步骤,前期部署也是很重要得,但是如果遇到下面这样得问题,其实也很好解决。
华科云商小徐
2024/02/21
5160
Python处理TXT文件完全指南 | Python文本操作教程
用户11638464
2025/08/06
1320
Python-codecs-01-读取文本文件
系统:Windows 7 语言版本:Anaconda3-4.3.0.1-Windows-x86_64 编辑器:pycharm-community-2016.3.2
zishendianxia
2019/10/23
9810
Python-codecs-01-读取文本文件
Java 读取文本文件
我想用Java 读取文本文件(txt)中的字符,但是对Java的文件操作不怎么熟悉,于是开始翻官方文档,解决了如何从文件中读取一行或者全部数据的问题。
全栈程序员站长
2022/06/25
2.1K0
Java 读取文本文件
Python读取文件的最后一行(非空行)
利用Python读取文件(针对大文件和小文件两种)的首行(第一行)和末行(最后一行)。脚本借鉴了前人的两种处理思路(在下面的脚本中有注释说明引用出处),并修正了原先两种处理方法中如果文件末尾含有多个空行而返回空行的问题。
py3study
2020/01/07
4.7K0
Python读取txt文件完整教程 - 从基础到高级技巧
Python内置的open()函数是处理文件的基础。该函数返回一个文件对象,可用于读取或写入文件。
用户11750067
2025/08/08
2330
Python: 分块读取文本文件
在处理大文件时,逐行或分块读取文件是很常见的需求。下面是几种常见的方法,用于在 Python 中分块读取文本文件:
华科云商小徐
2024/07/05
6350
使用 Python 拆分文本文件的最快方法是什么?
在 Python 中拆分文本文件可以通过多种方式完成,具体取决于文件的大小和所需的输出格式。在本文中,我们将讨论使用 Python 拆分文本文件的最快方法,同时考虑代码的性能和可读性。
很酷的站长
2023/02/18
3.1K0
使用 Python 拆分文本文件的最快方法是什么?
Python 怎么读取文件?Python 怎么导入数据?
在 Python 的世界里,读取文件和导入数据是极为基础且重要的操作,无论是进行数据分析、处理文本,还是开发各类应用,都离不开这两项技能。今天,咱们就来深入探讨一下 Python 在这方面的各种门道。
用户11176925
2025/08/08
2180
python统计文件行数
需求: 需要统计一个文件的行数. 讨论: 最简单的办法是把文件读入一个大的列表中,然后统计列表的长度.如果文件的路径是以参数的形式filepath传递的,那么只用一行代码就可以完成我们的需求了: count = len(open(filepath,'rU').readlines()) 如果是非常大的文件,上面的方法可能很慢,甚至失效.此时,可以使用循环来处理: count = -1 for count, line in enumerate(open(thefilepath, 'rU')):     pass count += 1 另外一种处理大文件比较快的方法是统计文件中换行符的个数'\n
py3study
2020/01/10
2.3K0
使用Python统计文件下代码行数
#/usr/bin/env python # -*- coding:utf-8 -*- # Author:Wangj import os import time basedir = 'H:/python/MultiQC/' filelists = [] # 指定想要统计的文件类型 whitelist = ['php', 'py'] #遍历文件, 递归遍历文件夹中的所有 def getFile(basedir): global filelists for parent,dirnames,fil
菲宇
2019/08/14
1.2K0
Python文件操作
Python作为一种高效且易于学习的编程语言,提供了一系列强大的文件操作功能,使得用户能够轻松地实现文件的读取、写入和管理。本章将详细讲解文件的编码以及读取、写入和追加操作。
Heaven645
2024/07/25
3291
Python文件操作
Python入门之用Python统计代码行
Pycharm每天都要写很多代码,如何统计每天的代码行数呢?作为一个目标十万行的coder,要想想办法! 题目:有个目录,里面是你自己写过的程序,统计一下你写过多少行代码。包括空行和注释,但是要分别列出来。 首先分析一下思路捋一下大象装冰箱的步骤,从一个给定的目录统计该目录下所有的代码行大致需要以下7个步骤: 1. 遍历该目录下所有的文件。 2. 判断文件是否以“.py”结尾。(以python代码为例) 3. 打开.py文件(切忌勿用W+,W+会清空文件内容) 4. 循环读取文件的每一行 5. 判断每一行
Jetpropelledsnake21
2018/05/03
1.3K0
Python入门之用Python统计代码行
用Python实现大文本文件切割
在实际工作中,有些场景下,因为产品既有功能限制,不支持特大文件的直接处理,需要把大文件进行切割处理。
py3study
2020/01/09
3.3K0
Python实现一个代码行数统计工具
我们经常想要统计项目的代码行数,但是如果想统计功能比较完善可能就不是那么简单了, 今天我们来看一下如何用python来实现一个代码行统计工具。
一墨编程学习
2018/12/14
1.7K0
python 实现协同过滤推荐算法
测试数据 http://grouplens.org/datasets/movielens/
全栈程序员站长
2022/07/25
6380
python 实现协同过滤推荐算法
如何使用Java逐行读取大文本文件?
这是一个示例,该示例具有完整的错误处理并支持Java 7之前的字符集规范。使用Java 7,您可以使用try-with-resources语法,从而使代码更简洁。
用户7886150
2020/12/11
3.2K0
python读取txt文件
在Python中,你可以使用内置的open函数来打开和读取文本文件。以下是一个简单的例子:
很酷的站长
2024/01/01
9560
python读取txt文件
面试宝典_Python.运维开发.000
面试题目: 1. 用PYTHON实现tail -f功能,默认显示最后15行,实时输出新增行? 解题思路: 1. 此需求在很多场景中都有遇到,而且在各大群中也被讨论过,虽然有现成的模版如pyinoti
py3study
2020/01/07
6090
相关推荐
Python 读取文本文件的内容
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验