Python比对两个CSV输出差异的代码却打印相同内容,问题出在哪?
CSV比对异常问题排查与修复方案
核心问题原因
- 行首尾隐形字符不匹配:你提供的示例行末尾存在多余空格,且不同系统的换行符(Windows为
\r\n、Linux/macOS为\n)会导致读取出的行内容存在肉眼不可见的差异,Python的in运算符会严格匹配所有字符,因此会判定逻辑上相同的行内容不一致。 - 遍历逻辑不符合预期:你最初的写法仅会输出csv2独有的行,修改后的写法仅会输出csv1独有的行,无法同时输出两个文件各自独有的内容。
修复后代码
基础版(小文件适用)
对每行内容先做清洗再比对,同时输出两个文件的独有行:
# 读取文件时清洗每行首尾的空白、换行符,过滤空行 with open('csv1.csv', 'r', encoding='utf-8') as t1, open('csv2.csv', 'r', encoding='utf-8') as t2: fileone = [line.strip() for line in t1.readlines() if line.strip()] filetwo = [line.strip() for line in t2.readlines() if line.strip()] with open('csv3.csv', 'w', encoding='utf-8') as outFile: # 写入csv2独有的行 for line in filetwo: if line not in fileone: outFile.write(line + '\n') # 写入csv1独有的行,若仅需某一侧独有内容可删除本段 for line in fileone: if line not in filetwo: outFile.write(line + '\n')
优化版(大文件适用)
用集合存储清洗后的行,比对效率更高:
with open('csv1.csv', 'r', encoding='utf-8') as t1, open('csv2.csv', 'r', encoding='utf-8') as t2: set_one = set(line.strip() for line in t1.readlines() if line.strip()) set_two = set(line.strip() for line in t2.readlines() if line.strip()) # 取两个集合的对称差,即仅在一个文件中存在的行 diff_lines = set_one.symmetric_difference(set_two) with open('csv3.csv', 'w', encoding='utf-8') as outFile: for line in diff_lines: outFile.write(line + '\n')
内容的提问来源于stack exchange,提问作者gabediq
相关产品推荐
相关产品推荐

