python - 我的代码旨在比较 Python 中的两个 CSV 并打印差异是打印相似之处 - 我的代码有什么问题?
问题描述
我目前有两个 CSV。我正在尝试扫描它们中的每一个,比较这些行,如果其中有一行不在另一行中,我想将该行打印到新的 CSV 中。就目前而言,这是我的代码:
# compares the two files
with open('csv1.csv', 'r') as t1, open('csv2.csv', 'r') as t2:
fileone = t1.readlines()
filetwo = t2.readlines()
# scans through the two files and writes differences to new csv
with open('csv3.csv', 'w') as outFile:
for line in filetwo:
if line not in fileone:
outFile.write(line)
csv1 有 201 行,而 csv2 有 156 行,所以我希望 csv3 有 45 个结果,但是它有 156 个(整个 csv2)。我尝试将逻辑切换到
for line in fileone:
if line not in filetwo:
outfile.write(line)
但这只是让 csv3 为空。
任何帮助,将不胜感激!
我使用的代码也来自Python:比较两个 csv 文件并打印出差异
这是一个出现在两者中但仍显示在 csv3 中的行的示例
,MAJOR,MAJOR_CODE,
0,Accountancy,ACCT,
1,Aerospace Engineering,AERO
解决方案
您可以使用set
数据结构,特别是它的symmetric_difference()
方法。
使用理由set
:
- 该
symmetric_difference()
方法完全符合您的要求:返回任一集合中的项目,但不返回两者。 - 查找速度很快,所以即使您不想使用
symmetric_difference()
,它也会比使用 快得多line not in list_1
。
s_file1 = set(fileone)
s_file2 = set(filetwo)
s_file3 = s_file1.symmetric_difference(s_file2)
然后,您可以将 的元素写入s_file3
输出文件。
注意:集合是无序的,所以这不会保持你的行的顺序。集合也消除了重复,因此如果一行在 file1 中出现两次但在 file2 中出现零次,则重复将被删除,并且您只会在输出中得到该行一次。
如果您关心顺序和重复,并且您的文件很大,那么创建集合然后使用它们来检查循环中的成员可能会更快。
diff_lines = []
for line in fileone:
if not line in s_file2:
diff_lines.append(line)
for line in filetwo:
if not line in s_file1:
diff_lines.append(line)
然后写入diff_lines
您的输出(或直接写入输出而不是附加到diff_lines
)。
推荐阅读
- c++ - 检查字符是否需要按下 Shift 键
- java - 在 Rest Template 中为端点配置不同的超时
- php - 使用表单中的字符串作为存储过程中的参数(SQL Server)
- python - 我在尝试制作一个表格来显示文件中的统计信息时遇到问题
- c# - 关于 Firebase 实时数据库安全规则的问题
- c++ - 通过引入不相关的调用运算符 - clang vs gcc 奇怪地解决了模棱两可的调用运算符重载
- c# - 我可以使用 ConcurrentQueue 执行任务吗
通过将任务(方法)作为 ConcurrentQueue.Enqueue 的参数自动传递? - material-ui - 材质 UI 修剪文本搜索
- python - BertTokenizer.from_pretrained 出现“连接错误”错误
- user-interface - 大型科技公司如何制作他们的软件 GUI?