Python替换文件逗号为点后丢失大量数据,求解决方法
问题排查与解决方案
首先,咱们来拆解下你的脚本为什么会出现大面积数据丢失的问题:
核心问题分析
全局列表未清空
你把list = []定义在了所有文件循环的外面,这意味着处理完第一个文件后,列表里会保留第一个文件的所有行;处理第二个文件时,又会把第二个文件的行追加进去,以此类推。处理100万行的大文件时,内存占用会急剧飙升,很容易因为内存不足导致程序中途崩溃,最终只写入了部分内容(也就是你看到的365行)。而且后续的文件还会被写入之前所有文件的累积内容,完全不符合你的需求。多余的条件判断
你加了if ',' in line:才会把替换后的行加入列表,这会导致没有逗号的行直接被丢弃——哪怕你的数据里大部分行都有逗号,只要有一行没有,就会丢失。而且这个判断完全没必要,直接对每一行执行替换操作就好,没有逗号的行也不会被改变。使用内置函数名作为变量名
你用了list作为变量名,这覆盖了Python的内置list类型,虽然不一定直接导致当前问题,但这是非常不好的编程习惯,可能会引发意想不到的错误。直接覆盖原文件的风险
你直接打开原文件进行写入操作,如果程序中途崩溃,原文件会被损坏,连备份都没有。
修复后的脚本方案
我推荐两种修复方式,优先选第二种,因为它更高效、更安全:
方案一:每个文件单独维护列表
把列表的定义移到每个文件的循环内部,确保每次处理新文件时列表都是空的:
import glob for filename in glob.glob("inputfile/*"): # 用lines代替list,避免覆盖内置函数 lines = [] with open(filename, 'r') as searchfile: for line in searchfile: # 直接替换,不需要判断是否有逗号 replaced_line = line.replace(",", ".") lines.append(replaced_line) # 用with语句自动关闭文件,确保内容写入 with open(filename, 'w') as f: f.writelines(lines)
方案二:逐行处理+临时文件(更推荐)
这种方式不需要把所有行加载到内存,处理大文件更高效,而且用临时文件可以避免原文件损坏:
import glob import os for filename in glob.glob("inputfile/*"): # 创建临时文件存储处理后的内容 temp_file = filename + ".tmp" with open(filename, 'r') as infile, open(temp_file, 'w') as outfile: for line in infile: # 逐行替换并写入临时文件 outfile.write(line.replace(",", ".")) # 用临时文件替换原文件,原子操作更安全 os.replace(temp_file, filename)
为什么这个方案能解决问题?
- 方案一确保每个文件的处理都是独立的,不会累积其他文件的内容,也避免了内存过载的问题。
- 方案二则完全不需要把所有行存在内存里,逐行处理的方式对内存友好,而且临时文件的方式能保证即使程序中途出错,原文件也不会被破坏。
内容的提问来源于stack exchange,提问作者Cashoo
相关产品推荐
相关产品推荐

