You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从大文件指定行区间逐词读取并分存至数组

解决方案

核心思路

逐词读取时无需放弃行号追踪——可以在读取字符/单词的过程中,同步统计换行符的数量,以此确定当前所在的行区间,进而将单词分配到对应数组。这种方式无需先整行读取再分词,一次遍历就能完成行号统计和单词分类。

逐字符读取实现示例(Python)

def split_words_by_line_ranges(file_path):
    array1 = []
    array2 = []
    array3 = []
    current_line = 1
    buffer = []
    
    with open(file_path, 'r', encoding='utf-8') as f:
        while True:
            char = f.read(1)
            if not char:
                # 处理文件末尾剩余的单词
                if buffer:
                    word = ''.join(buffer)
                    if current_line <= 1_000_000:
                        array1.append(word)
                    elif current_line <= 2_000_000:
                        array2.append(word)
                    else:
                        array3.append(word)
                break
            
            if char.isspace():
                if buffer:
                    word = ''.join(buffer)
                    # 根据当前行号分配单词
                    if current_line <= 1_000_000:
                        array1.append(word)
                    elif current_line <= 2_000_000:
                        array2.append(word)
                    else:
                        array3.append(word)
                    buffer = []
                # 遇到换行符,行号+1
                if char == '\n':
                    current_line += 1
            else:
                buffer.append(char)
    
    return array1, array2, array3

优化方案:按行块读取+分词

如果逐字符读取效率不足,可采用按行块批量读取的方式。每次读取固定行数的块,统计块的起止行号,再对块内内容批量分词,最后按行号范围分配单词。这种方式兼顾IO效率和行号追踪,代码复杂度更低:

def split_words_by_line_blocks(file_path, block_size=1000):
    array1 = []
    array2 = []
    array3 = []
    start_line = 1
    
    with open(file_path, 'r', encoding='utf-8') as f:
        while True:
            lines = f.readlines(block_size)
            if not lines:
                break
            end_line = start_line + len(lines) - 1
            
            # 处理当前块的行
            for line in lines:
                words = line.strip().split()
                if start_line <= 1_000_000:
                    array1.extend(words)
                elif start_line <= 2_000_000:
                    array2.extend(words)
                else:
                    array3.extend(words)
                start_line += 1
    
    return array1, array2, array3

补充说明

  • 若单词分隔符不止空格(如标点),可调整判断逻辑,比如将char.isspace()改为if char in [' ', '\t', '\n', ',', '.']来适配场景。
  • 两种方案均为单遍遍历文件,内存占用可控,适合处理300万行的大文件。

内容的提问来源于stack exchange,提问作者Dos Uzumaki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:20:44