如果与列表中的元素匹配,请从csv文件中删除特定行-python/windows
我有一个csv文件,每行有一个名称和url(在第一列)。 另一方面,我有一个来自脚本的名字列表。 我想删除csv文件中包含列表中名称的行。 这听起来很简单,但我尝试了几个选项,但都不起作用 csv格式为:如果与列表中的元素匹配,请从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
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])