1

我有大量 csv 格式的数据列表,我需要根据匹配的两个参数从中删除行。

我要删除的数据列表如下所示:

London,James Smith
London,John Oliver
London,John-Smith-Harrison
Paris,Hermione
Paris,Trevor Wilson
New York City,Charlie Chaplin
New York City,Ned Stark
New York City,Thoma' Becket
New York City,Ryan-Dover

然后,主 csv 将根据将城市名称与第二列匹配以及将名称与第 9 列中的名称匹配来删除一行。

如果两者都匹配,请删除主 csv 中的行(请注意,此处未提供此 csv 示例)。

4

2 回答 2

5

我验证了以下内容可根据您提供/描述的数据类型的需要进行工作:

import csv
from cStringIO import StringIO

# parse the data you're about to filter with
with open('filters.csv', 'rb') as f:
    filters = {(row[0], row[1]) for row in csv.reader(f, delimiter=',')}

out_f = StringIO()  # use e.g. `with open('out.csv', 'wb') as out_f` for real file output
out = csv.writer(out_f, delimiter=',')

# go thru your rows and see if the pair (row[1], row[8]) is
# found in the previously parsed set of filters; if yes, skip the row
with open('data.csv', 'rb') as f:
    for row in csv.reader(f, delimiter=','):
        if (row[1], row[8]) not in filters:
            out.writerow(row)

# for debugging only
print out_f.getvalue()  # prints the resulting filtered CSV data

注意: is {... for ... in ...}set-comprehension 语法;根据您的 Python 版本,您可能需要将其更改为等效版本set(... for ... in ...)才能正常工作。

于 2013-09-27T23:31:19.103 回答
1

如果第 2 列和第 9 列中的元素分别不在列表 L1 和 L2 中,您可以逐行读取数据并将行追加到列表中。

ext = "C:\Users\Me\Desktop\\test.txt"
readL = []

f = open(ext)

for line in f:
    listLine = line.strip().split(',')
    if(listLine[2] in L1 or listLine[9] in L2):
        continue
    readL += [listLine]


f.close()
于 2013-09-28T01:44:41.830 回答