所有csv列之间通用

时间:2014-08-18 12:59:14

标签: python csv

我有一个csv文件。

table1    table2    table3  table4   table5
paper     paper     pen     book     book
pen       pencil    pencil  charger  apple
apple     pen       charger beatroot sandle
beatroot  mobile    apple   pen      paper
sandle    book      paper   paper

我需要在所有列中找到类似的条目。在这种情况下,输出将是:

paper

列可能会增加或减少。

对于2列相似性,可以使用:

# reading csv file and converting it to dictionary
with open(input_file, 'r') as csvin:
    reader=csv.DictReader(csvin)
    data={k.strip():[v] for k,v in reader.next().items()}
    for line in reader:
        for k,v in line.items():
            k=k.strip()
            data[k].append(v)

# iterating the dictionary for each 2 columns
for a, b in itertools.combinations(data, 2):
    # to get common species names
    common = set(data[a]) & set(data[b])

但是,我不明白如何从所有列中获取类似的值。

1 个答案:

答案 0 :(得分:4)

您可以使用csv.readerskipinitialspace=True跳过空格,然后压缩行以获取列,我们使用itertools.izip_longest因为缺少最后一列中的值。转换集合中的列并使用set.intersection

进行交集
from itertools import izip_longest
import csv

with open('test') as f:
    reader = csv.reader(f, delimiter=' ', skipinitialspace=True)
    cols = map(set, izip_longest(*reader))

print set.intersection(*cols)

注意你的文件不正确是一个csv,如果你的列中缺少值不是最后一个,这将不正确地解释你的输入。至少考虑使用不是空格的分隔符。

实施例

使用StringIO解析字符串并显示它适用于测试用例:

from itertools import izip_longest
import csv
import StringIO

data='''table1    table2    table3  table4   table5
paper     paper     pen     book     book
pen       pencil    pencil  charger  apple
apple     pen       charger beatroot sandle
beatroot  mobile    apple   pen      paper
sandle    book      paper   paper'''

f = StringIO.StringIO(data)
reader = csv.reader(f, delimiter=' ', skipinitialspace=True)
cols = map(set, izip_longest(*reader))

print set.intersection(*cols)

输出

set(['paper'])