python - 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”的用户的所有行(用户名或名字和姓氏)。
解决方案
如果您在首次创建 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
此代码正在测试完全匹配。我添加了“不耐烦”以强调测试“耐心”是否只是字符串中的某个位置可能会出现问题。
推荐阅读
- javascript - 在 setState 中使用变量 - 反应
- javascript - VueJS 道具 - 我怎样才能避免“类”属性继承?
- vba - 在单元格范围内复制粘贴值
- c++ - 在异步 TCP 服务器的上下文中从 N 头访问数据时的线程安全
- java - 迭代 List<> 中包含的 HashMap<> 以将 map 中包含的数组变量添加为 java 中的值
- java - 如何输入字符串数据?
- javascript - 币安 API Hmac 签名
- apache-kafka - 在日志压缩的情况下,Kafka 回复如何工作?
- java - 如何将此 switch 语句交换为多态方法?
- java - 通过单击另一个 JFrame 窗口中的按钮打开一个新的 JFrame 窗口