首页 > 解决方案 > 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 循环的范围内写入输出),但收到的输出与我尝试输出非-火柴。

标签: pythoncsv

解决方案


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')

推荐阅读