如何从大文件指定行区间逐词读取并分存至数组
解决方案
核心思路
逐词读取时无需放弃行号追踪——可以在读取字符/单词的过程中,同步统计换行符的数量,以此确定当前所在的行区间,进而将单词分配到对应数组。这种方式无需先整行读取再分词,一次遍历就能完成行号统计和单词分类。
逐字符读取实现示例(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
相关产品推荐
相关产品推荐

