求助:Python实现给70万行文本文件每行拼接指定字符串
问题分析与解决方案
你的代码出现无限循环、生成10GB超大文件的核心原因是同时用两种方式操作同一个文件:
- 一边用
fileinput.input()读取原文件内容 - 一边用
r+模式打开同一个文件进行写入
这种操作会导致文件指针混乱:fileinput会持续读取文件内容,而你写入的新内容会被fileinput再次读取,形成无限循环,最终文件被不断追加内容,变得越来越大。另外,r+模式的读写指针是同一个位置,边读边写很容易破坏原有文件的结构,尤其处理大文件时风险极高。
针对你的需求(将每行中的.com替换为.com/products/all.atom),推荐两种安全的处理方式:
方式1:读写分离(推荐大文件使用)
创建临时文件写入处理后的内容,完成后替换原文件,避免直接修改原文件导致数据丢失:
import os # 定义替换规则和目标文件 text_to_search = ".com" text_to_replace = ".com/products/all.atom" file_to_process = "你的文件路径.txt" # 替换成你的实际文件路径 # 创建临时文件路径 temp_file_path = file_to_process + ".tmp" # 逐行读取原文件,处理后写入临时文件 with open(file_to_process, 'r', encoding='utf-8') as infile, open(temp_file_path, 'w', encoding='utf-8') as outfile: for line in infile: # 只替换每行第一个.com(避免一行有多个.com时重复替换) modified_line = line.replace(text_to_search, text_to_replace, count=1) outfile.write(modified_line) # 用临时文件替换原文件(建议先备份原文件再执行此步骤) os.replace(temp_file_path, file_to_process) print("处理完成!")
方式2:使用fileinput原地修改
利用fileinput的inplace=True参数,它会自动处理临时文件和替换原文件,代码更简洁:
import fileinput # 定义替换规则和目标文件 text_to_search = ".com" text_to_replace = ".com/products/all.atom" file_to_process = "你的文件路径.txt" # inplace=True会自动原地修改文件,无需手动处理临时文件 with fileinput.input(file_to_process, inplace=True, encoding='utf-8') as f: for line in f: # 替换后直接打印,fileinput会把打印内容写入原文件 print(line.replace(text_to_search, text_to_replace, count=1), end='') print("处理完成!")
额外注意事项
- 处理70万行的大文件时,一定要用逐行读取(上面的代码都是逐行处理,不会把整个文件加载到内存),避免内存溢出。
- 如果你的文件有特殊编码,记得在
open或fileinput中指定对应的encoding参数(比如gbk、utf-8等)。 - 建议在处理前备份原文件,避免意外情况导致数据丢失。
内容的提问来源于stack exchange,提问作者Syed Aashir
相关产品推荐
相关产品推荐

