我有一个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])
但是,我不明白如何从所有列中获取类似的值。
答案 0 :(得分:4)
您可以使用csv.reader
和skipinitialspace=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'])