使用来自文本文件的数据交叉匹配和删除csv中的行

时间:2013-09-20 21:49:53

标签: python csv python-2.7 text matching

我有一个问题,我不知道目前如何实现。我需要从csv中删除行,这取决于来自两列的匹配数据。

所以如果文本文件是:

London
James Smith, John Oliver, John-Smith-Harrison

Paris
Hermione, Trevor Wilson

New York city
Charlie Chaplin, Ned Stark, Thoma' Becket, Ryan-Dover

然后csv将基于将City名称与第二列匹配以及匹配第9列中的名称来删除行。

我希望这是相对容易的功能。如果有人可以提供如何做到这一点的例子,将不胜感激。亲切的问候AEA

1 个答案:

答案 0 :(得分:1)

这是一个例子。它假设csv文件被称为'input.csv'并且它写入了与'Paris','Trevor Wilson'不匹配的文件'output.csv'。

它使用itertools docs中的grouper食谱将行组合成3个组。

请注意,csv文件的语法差别很大,因为没有明确定义的标准。如果您的真实输入文件与您发布的示例不匹配,则值得查看csv模块的文档。例如,我使用skipinitialspace选项告诉解析器在分隔符后立即忽略空格。

import csv
from itertools import *

# see recipies section in itertools docs
# http://docs.python.org/2/library/itertools.html
def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

with open('input.csv') as f:
    data = csv.reader(f, skipinitialspace=True)
    with open('output.csv', 'w') as output_f:
        output = csv.writer(output_f)
        for city, names, blank in grouper(data, 3, []):
            if not (city[0] == 'Paris' and 'Trevor Wilson' in names):
                output.writerow(city)
                output.writerow(names)
                output.writerow('')