【Python】 如何用Python高效计算大文件的行数

基本原理

在Python中,计算一个文件的行数通常意味着需要逐行读取文件,这在处理大文件时可能会非常耗时。然而,如果我们只关心行数,而不需要文件的具体内容,有一些更高效的技巧可以利用。

文件指针和缓冲区

Python的文件操作默认使用缓冲区,这意味着文件的读取操作会先在内存中的缓冲区进行,而不是直接从磁盘读取。通过合理地管理文件指针,我们可以减少不必要的磁盘I/O操作。

file对象的readline方法

file对象的readline方法用于读取文件的一行,直到遇到换行符\n。在读取完文件的最后一行后,readline方法将返回一个空字符串。

Dumb方法

最直接的方法是打开文件,然后逐行读取,直到文件结束。这种方法简单但效率低下。

def count_lines(file_path):
    with open(file_path, 'r') as file:
        lines = 0
        for line in file:
            lines += 1
    return lines
Smart方法

更高效的方法是利用文件的元数据信息。在UNIX系统中,文件的元数据包括了“inode”大小,这通常与文件内容的大小成正比。通过比较文件的当前大小和逐行读取后的文件大小,我们可以估算出行数。

代码示例

示例1:直接逐行读取
def count_lines_dumb(file_path):
    with open(file_path, 'r') as file:
        return sum(1 for _ in file)

# 运行结果
print(count_lines_dumb('large_file.txt'))
示例2:利用文件元数据
import os

def count_lines_smart(file_path):
    with open(file_path, 'r') as file:
        start_pos = file.tell()
        file.seek(0, os.SEEK_END)
        end_pos = file.tell()
        file.seek(start_pos)
        lines = 0
        while file.readline():
            lines += 1
    return (end_pos - start_pos) // (lines + 1)

# 运行结果
print(count_lines_smart('large_file.txt'))
示例3:使用mmap模块

对于非常大的文件,可以使用mmap模块,它允许我们以内存映射的方式读取文件,这样可以减少内存的使用。

import mmap

def count_lines_mmap(file_path):
    with open(file_path, 'r') as file:
        with mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ) as mm:
            lines = mm.count(b'\n')
            if mm[-1:] != b'\n':
                lines += 1
    return lines

# 运行结果
print(count_lines_mmap('large_file.txt'))

注意事项

  • 在使用mmap时,需要确保文件在读取过程中不会发生变化,否则可能会导致不可预测的结果。
  • count_lines_smart方法的准确性依赖于文件内容的均匀性,如果文件中有极端的情况(如极长的行),可能会影响估算结果。
  • 直接逐行读取(count_lines_dumb)虽然简单,但在处理大文件时效率低下。

结论

在处理大文件时,选择合适的方法计算行数非常重要。直接逐行读取虽然直观,但在大文件面前效率不高。利用文件的元数据信息可以提高效率,而mmap模块则为超大文件提供了另一种高效的解决方案。根据实际情况选择最合适的方法,可以显著提高程序的性能。

>
> 【痕迹】QQ+微信朋友圈和聊天记录分析工具1.0.4 (1)纯Python语言实现,使用Flask后端,本地分析,不上传个人数据。
>
> (2)内含QQ、微信聊天记录保存到本地的方法,真正实现自己数据自己管理。
>
> (3)数据可视化分析QQ、微信聊天记录,提取某一天的聊天记录与大模型对话。
>
> 下载地址:https://www.alipan.com/s/x6fqXe1jVg1
>

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你的 txt 文件非常大,逐读取文件可能会非常慢。在这种情况下,你可以使用一种更高效的方法来获取文件数,也就是二分查找法。 具体来说,你可以利用文件指针来跳转到文件的中间位置,然后向后扫描,计算出当前位置前面的数。然后,你可以根据当前位置前面的数来判断应该向前还是向后跳转,直到找到文件的末尾。这个方法的时间复杂度为 O(log n),比逐读取文件的时间复杂度 O(n) 要快得多。 下面是一个使用二分查找法来获取文件数的 Python 代码示例: ```python def count_lines(filename): with open(filename, "rb") as f: f.seek(0, 2) # 将文件指针跳到文件末尾 end = f.tell() start = 0 while start < end: mid = (start + end) // 2 # 将文件指针跳转到中间位置 f.seek(mid) if f.read(1) == b'\n': # 如果中间位置是一个换符,则向前移动一个位置 mid -= 1 f.seek(mid) # 向后扫描,计算中间位置前面的数 while f.read(1) != b'\n' and mid > start: mid -= 1 f.seek(mid) if mid == start: return mid end = mid return end ``` 这个函数会打开指定的文件,并使用二分查找法来计算文件数。你可以调用这个函数来获取超大文件数,比如: ```python filename = "large_file.txt" line_count = count_lines(filename) print("Total number of lines:", line_count) ``` 注意,这个方法假定文件中的都是以换符 \n 结尾的。如果你的文件使用不同的分隔符,你需要相应地修改代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值