如何应用不区分大小写的fi

2024-04-26 14:41:16 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有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:

^{pr2}$

我想删除多余的名字。城市和国家是什么并不重要,因为我只需要将名称写入输出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'

我知道我正在创建的列表有问题,但是我不知道它是否真的比较两列的小写字母并打印匹配项,因为我想先验证它。在


Tags: csvnameinascollowerreaderrow
3条回答

试试这个:

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的内容写入文件。在

似乎没有必要导入csv,因为您可以通过在逗号上拆分来轻松提取信息。另外,最好添加一个检查,这样“Name”就不会被认为是有效的名称。在

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

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

一方面

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

应该是:

^{pr2}$

这就是导致错误的原因

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

编辑

要解决注释中提到的KeyError:

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

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

相关问题 更多 >