根据另一个csv中的另一个值在csv列中写入值

时间:2013-07-09 19:50:40

标签: python csv python-2.7

我正在尝试搜索csv文件中特定列中的所有行,以查看它们是否包含另一个csv文件中的字符串。如果它们包含该字符串,我想将相应的值写入另一个特定列。

例如file1:

Search Value,Location
UK,United Kingdom
United Kingdom,United Kingdom
United States,United States
Hong Kong,Hong Kong
Florida,"Florida, United States"

和file2:

Name,Default,Geo Location
DRE UK,,
Production United States,,
Development Hong Kong,,
United Kingdom Sales,,
Florida Marketing,,

我想找到一些行,其中file2中的Name包含file1中Search Value的字符串,然后将file1中Location的相应值写入file2中的Geo Location。所以结果是这样的:

Name,Default,Geo Location
DRE UK,,United Kingdom
Production United States,,United States
Development Hong Kong,,Hong Kong
United Kingdom Sales,,United Kingdom
Florida Marketing,,"Florida, United States"

我正在寻找答案,我遇到了loop through rows of one csv file to find corresponding data in another。我基于此开始了代码,但我不知道这是不是正确的事情而且我被卡住了。

import csv

file1reader = csv.reader(open('file1.csv','rb'))
file2reader = csv.reader(open('file2.csv','rb'))
writer=csv.writer(open('file3.csv','wb'))

header1 = file1reader.next() #header
header2 = file2reader.next() #header


for Search Value, Location in file1reader:
    for Name, Default, Geo Location in file2reader:
        if Search Value in Name: # found it

提供的数据是我想要做的一个例子。实际的文件会很大,所以请记住这一点。

感谢任何帮助。

修改

如果我想在最终输出(file3.csv)中包含file2.csv中的原始行,这些行也与条件不匹配,我该怎么做?

示例如果file2是这样的,我也希望包含非匹配行:

Name,Default,Geo Location
DRE UK,,
Production United States,,
Development Hong Kong,,
United Kingdom Sales,,
Florida Marketing,,
Stuff,,Somewhere
More Stuff,,

2 个答案:

答案 0 :(得分:1)

以下是使用DictReaderDictWriter类的简单示例:

from csv import DictReader, DictWriter

with open('file1.csv') as fin1,\
     open('file2.csv') as fin2,\
     open('file3.csv', 'wb') as fout:

    reader1 = DictReader(fin1)
    reader2 = DictReader(fin2)

    writer = DictWriter(fout, fieldnames=reader2.fieldnames)
    writer.writeheader()

    for line2 in reader2:
        outline = dict(line2)
        fin1.seek(0) # resets the reader1 iterator
        for line1 in reader1:
            if line1['Search Value'] in line2['Name']:
                outline['Geo Location'] = line1['Location']
        writer.writerow(outline)

这个算法的复杂性是O(n 2 ),所以,就像@maged指出的那样,它的效率不高。

答案 1 :(得分:0)

您的解决方案是正确的。

另一个解决方案是将文件加载到内存中,在哈希表/字典结构中以提高性能(避免O(n ^ 2))。但是,由于你正在使用大型文件,并且你没有完全匹配,它将使这个解决方案不太理想。

您还可以尝试将文件加载到哈希表结构中,并将其写入文件,以避免内存错误(类似于搜索索引器)。对于你想做的事情来说,这似乎有些过分。