如何应用案例不敏感过滤器

时间:2018-06-07 20:48:56

标签: python csv

所以我有CSV1:

Name, City, Country  
David, Los Angeles, US    
Peter, Chicago, US  
Mark, Chicago, US  
Brian, New York, US  
Paul, Los Angeles, US  
Andy, Boston, US  
Chris, Dallas, US  

和CSV2:

City, Name, Country  
PETER, Chicago, US  
Adam, Florida, US  
MARK, Chicago, US  
James, Austin, US  
BRIAN, New York, US  

我想删除冗余名称。城市和国家是什么并不重要,因为我只需要将名称写入输出csv文件。所以在这种情况下,对于BRIAN和brian,它将删除冗余数据并只采用一个名称(brian)。同时,我希望将CSV1但不是CSV2的数据(' Name')也打印到输出文件中。所以,基本上,它是一个不区分大小写的过滤器。像这样:

Name:
David  
Peter  
Mark  
Brian   
Paul  
Andy    
Chris  

我试过这段代码:

import csv

# load second file as lookup table
data2 = {}
data1 = {}
with open('CSV2.csv', 'r') as csvinput:
    reader = csv.reader(csvinput)
    for row in csvinput:
        data2[row[1]] = row

# now process first file against it
with open("CSV1.csv", 'r') as lookuplist:
    reader1 = csv.reader(lookuplist)
    for col in lookuplist:
        data1[col[0]] = col
        if col[0] not in data2:
            print(col[0])
        if col.lower()[0] == data2.lower()[1]:
            print('Matches')

这是我得到的错误:

AttributeError: 'dict' object has no attribute 'lower'

我知道我创建的列表有问题但是我无法弄清楚它是否实际上比较了两列的小写并打印MATCHES,因为我想先验证它。 / p>

4 个答案:

答案 0 :(得分:2)

一件事

if col.lower()[0] == data2.lower()[1]:

应该是:

if col[0].lower() == data2[1].lower():

这就是造成错误的原因

AttributeError: 'dict' object has no attribute 'lower'

修改

解决评论中提到的KeyError:

for k, v in data2:
    if data2[k].lower() == col[0].lower():
        print('Matches')

您也可以通过变量v(代表dict中的每个值)进行比较,但我使用了按键访问索引以明确该功能。

答案 1 :(得分:1)

似乎无需导入csv,因为您可以通过分割逗号轻松提取信息。此外,最好添加一个检查,以便“名称”不被视为有效名称。

我不知道这是否是一个要求,但是你需要用第三个文件进行过滤,我更喜欢定义一个我们可以用参数调用的函数来立即构建一个不用的列表。

def build_unduped_names(names_repository, file_name):
    with open(file_name) as csvinput:
        for row in csvinput:
            exploded_row = row.split(',')
            if exploded_row[0].lower() == 'name':
                continue
            names_repository[exploded_row[0].lower()] = True


file_names = [
    'CSV1.csv',
    'CSV2.csv',
]

unduped = {}
for file_name in file_names:
    build_unduped_names(unduped, file_name)

print(set(unduped))

答案 2 :(得分:0)

试试这个:

csv1names = [(line.split()[0]).title() for line in csv1file]
csv2names = [(line.split()[0]).title() for line in csv2file]

filtered = [name if name not in csv2names for name in csv1names]

然后,您只需将filtered的内容写入您的文件即可。

答案 3 :(得分:0)

class CompressedRotatingFileHandler(logging.handlers.RotatingFileHandler):
    def doRollover(self):
        """
        Do a rollover and zip
        """
        if self.stream:
            self.stream.close()
        if self.backupCount > 0:
            for i in range(self.backupCount - 1, 0, -1):
                sfn = "%s.%d.gz" % (self.baseFilename, i)
                dfn = "%s.%d.gz" % (self.baseFilename, i + 1)
                if os.path.exists(sfn):
                    # print "%s -> %s" % (sfn, dfn)
                    if os.path.exists(dfn):
                        os.remove(dfn)
                    os.rename(sfn, dfn)
            dfn = self.baseFilename + ".1.gz"
            if os.path.exists(dfn):
                os.remove(dfn)
            with open(self.baseFilename, 'rb') as f_in, gzip.open(dfn, 'wb') as f_out:
                shutil.copyfileobj(f_in, f_out)
            # os.rename(self.baseFilename, dfn)
            # print "%s -> %s" % (self.baseFilename, dfn)
        self.mode = 'w'
        self.stream = self._open()

将这些名称写入所需的csv文件