Python 如何根据匹配数据从csv中删除行

Python 如何根据匹配数据从csv中删除行,python,python-2.7,csv,match,Python,Python 2.7,Csv,Match,我有一个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-D

我有一个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将根据城市名称与第二列的匹配以及名称与第九列中的名称的匹配删除一行


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

我验证了以下内容是否适用于您提供/描述的数据类型:

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

注意:
{…for…in…}
设置为理解语法;根据您的Python版本,您可能需要将其更改为等效的
集(…for…in…
),以使其正常工作。

我验证了以下内容,以便根据您所提供/描述的数据类型正常工作:

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

注意:
{…for…in…}
设置为理解语法;根据您的Python版本,您可能需要将其更改为等效的
集(…for…in…
),以使其正常工作。

如果第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()

若第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()

把问题说得更清楚可能会有用。嗨,谢谢你的回答,我能做些什么让它更清楚呢。显然,尽可能清楚地说明手头的问题符合我的利益。善良的AEAI只是不确定你是否在努力解决某个问题,或者只是想让某人为你编写代码(我在下面做了:P)。你现在已经试过了吗?是的,谢谢,工作并接受:)可能有助于更清楚地说明这个问题。嗨,谢谢你的回答,我该怎么做才能把它说得更清楚呢。显然,尽可能清楚地说明手头的问题符合我的利益。AEAI只是不确定你是否在为某件事挣扎,或者只是想让某人为你编写代码(我在下面做了:P)。你现在已经试过了吗?是的,谢谢,工作正常,接受了:)确保在使用csv模块打开文件时使用
'rb'
'wb'
。引用:
在有区别的平台上,它必须使用“b”标志打开。
对于Python 3使用
newline='
。确保在使用csv模块打开文件时使用
'rb'
'wb'
。引用:
在有区别的平台上,它必须使用“b”标志打开。
对Python 3使用
换行=''
。我相信他说过,如果在过滤器列表中,第2行和第9行都位于同一行,则跳过该行;你的代码做了一些不同的事情;在示例代码段中使用惯用且格式良好的Python也是很有教育意义的:)此外,
ext
变量的内容由于反斜杠而格式不正确;您的代码没有显示如何实际解析
L1
L2
的内容;而
listLine[2]
是第三排,但他说是第二排;它应该是
readL.append(listLine)
等等。。。显然,看起来你只是在寻找廉价代表。我相信他说,如果第2行和第9行都在过滤器列表的同一行中,跳过该行;你的代码做了一些不同的事情;在示例代码段中使用惯用且格式良好的Python也是很有教育意义的:)此外,
ext
变量的内容由于反斜杠而格式不正确;您的代码没有显示如何实际解析
L1
L2
的内容;而
listLine[2]
是第三排,但他说是第二排;它应该是
readL.append(listLine)
等等。。。看起来你只是想找个便宜的推销员。