首页 > 解决方案 > Python和csv阅读器:无法打印文本文件中没有包含特定字符串的字段的所有行

问题描述

我有以下 repl.it 程序,无法让程序的一部分工作(逻辑错误)

上下文是约会网站的上下文。在“matchmagic”子例程中,我希望能够检索数据库中没有 keystrength 变量的所有行。

换句话说,如果用户输入“耐心”,那么文本文件中不包含该词的每一行都会显示(即所有不耐心的用户),因为我们要为匹配进行对比个性。

整个程序在这里:

https://repl.it/@oiuwdeoiuas/Matchmakingskills-1

该计划的相关部分是:

def matchmagic():
    wordfound=False
    print("===Creating Match===")
    while wordfound==False: 
        with open("dating.txt","r") as f:
            keystrength=input("Enter one of your key strengths:")
            reader=csv.reader(f)
            for row in reader:
                for field in row:
                    if field != keystrength:
                        print(row)
                        wordfound=True
                                   
    search()
                
mainmenu()

我在这里尝试的很明显,但我认为以下内容存在问题:

                   if field != keystrength:
                            print(row)
                            wordfound=True

它打印所有行,而不是识别不包含已识别 keystrength 的行。

CSV 样本:

Joe,Bloggs,JoeBbird,open123,M,jblogs@gmail.com,10/10/20,Christian,patience,0

FName,LName,Username,password,Gender,email,dob,Religion, keystrength ,contactcount

在上面的例子中,如果这个用户已经登录,他们的 keystrength 是“patience”,并且程序应该返回在他们的文件中没有列出“patience”的用户的所有行(用户名或名字和姓氏)。

标签: pythonlistcsv

解决方案


如果您在首次创建 CSV 文件时为其添加标题行,则可以使用csv.DictReader读取行并使用列名进行过滤。这很好,因为您的 CSV 和您的代码自文档。因此,只需测试一列,您的代码可能是:

import csv

def matchmagic():
    print("===Creating Match===")
    keystrength=input("Enter one of your key strengths:").upper()
    with open("dating.txt","r") as f:
        reader=csv.DictReader(f)
        return [row for row in reader if row["keystrength"].upper()!=keystrength]

result = matchmagic()
for r in result:
    print(r.values())

约会.txt

FName,LName,Username,password,Gender,email,dob,Religion,keystrength,contactcount
Joe,Bloggs,JoeBbird,open123,M,jblogs@gmail.com,10/10/20,Christian,patience,0
Darth,Vader,vader6599,open123,M,dvader@deathstar.com,10/10/20,Sith,impatience,0

此代码正在测试完全匹配。我添加了“不耐烦”以强调测试“耐心”是否只是字符串中的某个位置可能会出现问题。


推荐阅读