python - CSV Python输出:为列表中的每个项目输出一次而不是一次不匹配的字段
问题描述
我已经尝试解决这个问题大约一年了,我真的对此感到筋疲力尽,所以如果这个解释有点粗略,请原谅我。
我不能包含工作数据,但可以准确地想象 2 个 csv 文件,第一列都填充了值(序列号/电话号码/姓名,无关紧要 - 只是值)。在两个 csv 文件之间,一些值将匹配,而其他值将仅包含在一个或另一个中(Timmy 在两个文件中并且是匹配的,Robert 仅在文件 1 中并且与文件 2 中的任何名称都不匹配)。
我可以成功地输出一个存在于两个 csv 文件中的 csv 值(即两个文件都包含“Value78”,输出文件将只包含一次“Value78”)。当我尝试将 else 语句附加到我的 if 条件以处理不匹配的项目时,程序将为它不匹配的每个项目输出 1 个条目(100% 有意义,匹配发生一次,但除此之外每隔一个比较结果匹配是不匹配的)。我无法设想一种结构或方法来保存不匹配的字段,以便它们可以输出一次并且不会超出我的终端或输出文件。
我的目标是输出两个 csv 文件,匹配项和不匹配项,不匹配项的每个值只有一个条目。
无论如何,进入代码:
import csv
MYUNITS = 'MyUnits.csv'
VENDORUNITS = 'VendorUnits.csv'
MATCHES = 'Matches.csv'
NONMATCHES = 'NonMatches.csv'
with open(MYUNITS,mode='r') as MFile,
open(VENDORUNITS,mode='r') as VFile,
open(MATCHES,mode='w') as OFile,
open(NONMATCHES,mode'w') as NFile:
MyReader = csv.reader(MFile,delimiter=',',quotechar='"')
MyList = list(MyReader)
VendorReader = csv.reader(VFile,delimiter=',',quotechar='"')
VList = list(VendorReader)
for x in range(len(MyList)):
for y in range(len(VList)):
if str(MyList[x][0]) == str(VList[y][0]):
OFile.write(MyList[x][0] + '\n')
else:
pass
“其他:通过”是过滤掉不匹配的逻辑正在逃避我的地方。从此 else 语句的输出将写入非匹配值 (len(VList) - 1) 次,用于生成 1 个匹配的迭代,整个 len(VList) 用于不匹配的迭代。我尝试过使用计数器并且仅在计数器等于 len(VList) 时才输出(在 else 语句中递增,在第二个 for 循环的范围内写入输出),但收到的输出与我尝试输出非-火柴。
解决方案
Sorry, I had some issues with my PC. I was able to solve my own question the night I posted. The solution I used is so simple I'm kicking myself for not figuring it out way sooner:
import csv
MYUNITS = 'MyUnits.csv'
VENDORUNITS = 'VendorUnits.csv'
MATCHES = 'Matches.csv'
NONMATCHES = 'NonMatches.csv'
with open(MYUNITS,mode='r') as MFile,
open(VENDORUNITS,mode='r') as VFile,
open(MATCHES,mode='w') as OFile,
open(NONMATCHES,mode'w') as NFile:
MyReader = csv.reader(MFile,delimiter=',',quotechar='"')
MyList = list(MyReader)
VendorReader = csv.reader(VFile,delimiter=',',quotechar='"')
VList = list(VendorReader)
for x in range(len(MyList)):
tmpStr = ''
for y in range(len(VList)):
if str(MyList[x][0]) == str(VList[y][0]):
tmpStr = '' #Sets to blank so comparison fails, works because break
OFile.write(MyList[x][0] + '\n')
break
else:
tmp = str(MyList[x][0])
if tmp != '':
NFile.write(tmp + '\n')
推荐阅读
- c - 将 char 子数组转换为整数
- javascript - 如何根据百分比调整窗口内宽?
- git - 如何将“repo init/sync”迁移到“git”服务器?
- c - 为什么两个进程(父子进程)都指向相同的代码和数据段?
- amazon-web-services - 为什么 Chrome 从 AWS CloudFront 分配中看到 SSL 但看不到 firefox 或 edge
- node.js - Sequlize连接两个具有相同外键的表
- mysql - 如何在计划的时间限制到期时从节点中删除 MySQL DB 中的数据
- android - Expo SDK 38:Facebook 安装跟踪和 Branch.io AAID 跟踪在 Android 迁移后被破坏
- ios - Swift - 使用 Firestore 将数据从 VC 传递到详细 VC
- data-structures - 计算二叉搜索树的高度