如何在Python中处理20GB大文本文件:按ID合并多行至单行
处理大文本文件的格式转换(逐行处理,低内存占用)
因为你的文件有20GB,绝对不能一次性加载到内存里,所以我们用逐行读取+处理的方式,这样内存占用只和单条行的大小有关,完全可行。
核心思路
- 同时打开源文件和目标文件,用Python的
with语句自动管理文件资源,不用手动操心关闭。 - 逐行读取源文件的每一行,避免加载整个文件。
- 对每一行进行分割、分组处理:把原行里的「数字+文本」组提取出来,转换成「数字, 文本」的格式,再把所有组拼接成新行。
- 把处理后的新行实时写入目标文件。
代码实现
根据你给出的格式示例,这里分两种常见情况(看你是否需要保留文本里的空格):
情况1:保留文本中的空格(比如原Some text转成Some text)
with open('your_input_file.txt', 'r', encoding='utf-8') as infile, open('your_output_file.txt', 'w', encoding='utf-8') as outfile: for line in infile: # 去掉行首尾的空白和换行符 cleaned_line = line.strip() if not cleaned_line: outfile.write('\n') continue # 按空格分割成单个元素的列表 tokens = cleaned_line.split() processed_segments = [] index = 0 while index < len(tokens): # 提取当前数字(假设数字是纯数字格式) current_num = tokens[index] index += 1 # 收集后续的文本内容,直到遇到下一个数字或行尾 text_elements = [] while index < len(tokens) and not tokens[index].isdigit(): text_elements.append(tokens[index]) index += 1 # 合并文本元素,保留空格 combined_text = ' '.join(text_elements) # 格式化为「数字, 文本」的形式 processed_segments.append(f"{current_num}, {combined_text}") # 把所有处理好的段拼接成一行,写入文件 new_line = ' '.join(processed_segments) + '\n' outfile.write(new_line)
情况2:去掉文本中的空格(比如原Some text转成sometext)
只需要把上面代码里的combined_text = ' '.join(text_elements)改成:
combined_text = ''.join(text_elements)
注意事项
- 编码设置:如果你的文件不是UTF-8编码,记得把
encoding='utf-8'改成对应的编码(比如gbk)。 - 数字判断:代码里用
tokens[index].isdigit()判断是否是数字,如果你的数字包含负号或小数点,需要调整判断逻辑(比如用try-except尝试转成int/float)。 - 文本含数字:如果你的文本内容里本身包含数字(比如
text 3),这个简单的数字判断会把它当成新的条目开头,这时候你需要更明确的规则来区分条目开头的数字和文本里的数字,比如原格式里的数字是连续递增的?或者有固定分隔符?如果是这种情况,可以补充细节,我再调整代码。
内容的提问来源于stack exchange,提问作者user5236897
相关产品推荐
相关产品推荐

