如果与列表中的元素匹配,请从csv文件中删除特定行-python/windows

如果与列表中的元素匹配,请从csv文件中删除特定行-python/windows,python,csv,Python,Csv,我有一个csv文件,每行有一个名称和url(在第一列)。 另一方面,我有一个来自脚本的名字列表。 我想删除csv文件中包含列表中名称的行。 这听起来很简单,但我尝试了几个选项,但都不起作用 csv格式为: John Doe, johndoe.blog.com Jane Doe, janedoe.blog.com Jim Foe, jimfoe.blog.com 名单如下: not_ok_name= [John Doe , Jim Foe] csv文件的输出应为: Jane Doe, jane

我有一个csv文件,每行有一个名称和url(在第一列)。 另一方面,我有一个来自脚本的名字列表。 我想删除csv文件中包含列表中名称的行。 这听起来很简单,但我尝试了几个选项,但都不起作用

csv格式为:

John Doe, johndoe.blog.com
Jane Doe, janedoe.blog.com
Jim Foe, jimfoe.blog.com
名单如下:

not_ok_name= [John Doe , Jim Foe]
csv文件的输出应为:

Jane Doe, janedoe.blog.com
在最后一次尝试中,我尝试了以下解决方案:

count= 0
while count< len(not_ok_name):
    writer = csv.writer(open('corrected.csv'))
    for row in csv.reader('myfile.csv.csv'):
        if not row[0].startswith(not_ok_name[count]):
            writer.writerow(row)
    writer.close()
我希望这能有所帮助。 谢谢

编辑2: 这里有一段代码部分完成了这项工作。它删除了一个名称。也许这有助于为整个列表开发一个

reader = csv.reader(open("myfile.csv", "rb"), delimiter=',')
with open('corrected.csv', 'wb') as outfile:
    writer = csv.writer(outfile)
    for line in reader:
        #for item in Names:
        if not any ("Jim Foe" in x for x in line):
            writer.writerow(line)
            print line

再次感谢。

试试这个。它使用生成器排除
not_ok_name
列表中的名称

import csv
with open("C:/path/a.csv","rU") as f,open("C:/path/des.csv","wb") as w:
    not_ok_name= ["John Doe" , "Jim Foe"]
    reader = csv.reader(f)
    for row in f:
        name,other = row.split(",")
        if name not in not_ok_name:
            w.write(row)

谢谢你的密码。它创建b.csv(我假设这是“目标”文件),但不删除“不确定”名称列表。你说它不删除“不确定”名称列表是什么意思。我进行了测试,只得到了b csv中的jane done行。是的,你可以给它取任何名字@DiegoI测试了几次,两个文件都是一样的。没有区别。你有什么建议?@Diego,这没有道理。当我运行它时,它只写Jane Doe和她的电子邮件地址。你运行得怎么样?如果将行的print语句放在
w.write(row)'后面,会发生什么。您的
中的姓名是否与文件中的姓名完全匹配?我使用打印行进行了测试。它打印.csv中的“每一行”。名字很好。我不知道发生了什么…完全困惑。谢谢你的建议。它会创建corrected.csv,但仍包含要删除的名称。它在现有行之间添加一个空行。不知道为什么。测试了几次,它生成的输出没有任何变化。你认为会发生什么?您的代码和@DanielJimenez代码在我看来都很好。@Diego:我用python 3.4.2进行了测试,完全符合您的要求。我使用的是python 2.7。你认为会有什么不同吗?@Diego:那真的不应该有那么大的不同。嗯,
“Jim Foe”
在任何一行中都不存在。“所以我希望所有的行都出现在你的输出中,你是对的,”丹尼尔希门尼斯也指出。您将如何重新编写代码?好的,在我的解决方案中,我对列入黑名单的名字进行了
设置
,并检查该黑名单中是否存在该名字(在每行中找到);并且仅当在黑名单中找不到名字时才将行写入输出
import csv
with open("C:/path/a.csv","rU") as f,open("C:/path/des.csv","wb") as w:
    not_ok_name= ["John Doe" , "Jim Foe"]
    reader = csv.reader(f)
    for row in f:
        name,other = row.split(",")
        if name not in not_ok_name:
            w.write(row)
not_ok_name = ["John", "Jim"]
not_ok_name = set(not_ok_name)  # sets give us O(1) lookup times

with open('myfile.csv') as infile, open('corrected.csv', 'w') as outfile:
    writer = csv.writer(outfile)
    for name, url in csv.reader(infile):  # for each row in the input file
        fname = name.split(None, 1)[0]
        if fname in not_ok_name:
            continue  # if the first name is in the list, ignore the row
        writer.writerow([name, url])