问题
该代码无法正确识别输入(项目)。即使CSV文件中存在这样的值,它也只会转储到我的失败消息中。谁能帮我确定我做错了什么?
背景
我正在开发一个小程序,要求用户输入(此处未提供功能),搜索CSV文件(项目)中的特定列并返回整行。CSV数据格式如下所示。我已经从实际数量(49个字段名称,18000
+行)中缩短了数据。
码
import csv
from collections import namedtuple
from contextlib import closing
def search():
item = 1000001
raw_data = 'active_sanitized.csv'
failure = 'No matching item could be found with that item code. Please try again.'
check = False
with closing(open(raw_data, newline='')) as open_data:
read_data = csv.DictReader(open_data, delimiter=';')
item_data = namedtuple('item_data', read_data.fieldnames)
while check == False:
for row in map(item_data._make, read_data):
if row.Item == item:
return row
else:
return failure
CSV结构
active_sanitized.csv
Item;Name;Cost;Qty;Price;Description
1000001;Name here:1;1001;1;11;Item description here:1
1000002;Name here:2;1002;2;22;Item description here:2
1000003;Name here:3;1003;3;33;Item description here:3
1000004;Name here:4;1004;4;44;Item description here:4
1000005;Name here:5;1005;5;55;Item description here:5
1000006;Name here:6;1006;6;66;Item description here:6
1000007;Name here:7;1007;7;77;Item description here:7
1000008;Name here:8;1008;8;88;Item description here:8
1000009;Name here:9;1009;9;99;Item description here:9
笔记
我对Python的经验还很少,但是我认为这是一个很好的问题,以便学习更多。
我确定了打开(并包装为闭合函数)CSV文件,通过DictReader读取数据(以获取字段名称)的方法,然后创建一个命名元组以能够快速选择所需的输出列(项目,成本,价格,名称)。列顺序很重要,因此使用DictReader和namedtuple。
尽管可以对每个字段名称进行硬编码,但我认为,如果程序可以在打开文件时读取它们,那么在处理具有相同列名但具有不同列组织的相似文件时,它将大有帮助。
研究
您有三个问题:
_make
遍历字典键而不是值,从而产生错误的结果(item_data(Item='Name', Name='Price', Cost='Qty', Qty='Item', Price='Cost', Description='Description')
)。for row in (item_data(**data) for data in read_data):
if row.Item == str(item):
return row
return failure
这可以解决当前的问题-我们将检查字符串,并且仅在没有匹配项的情况下才返回(尽管您可能希望开始将字符串转换为数据中的整数,而不是针对字符串/
int问题进行此修正) 。
我还改变了循环的方式-
使用生成器表达式使语法更自然,对dict中的命名属性使用常规构造语法。与使用_make
和相比,此方法更清晰易读map()
。它还可以解决问题3。
问题内容: 该查询将在数据库中搜索特定的列名。我想更进一步,并在返回的列中搜索特定值。 有任何想法吗? 非常感谢 问题答案: 没有此类搜索的系统表。鉴于您可以尝试此目的 谢谢 马诺吉
问题内容: 我有这个: 有没有一种方法可以获取更新的列表作为结果,而不是就地更新原始列表? 问题答案: 我得到的最短信息:
假设我有一个应用程序,有许多不同的实体,它们之间没有关系。 我想创建一个搜索,查询所有这些,但返回一个统一的类型,即: 你认为有办法让它起作用吗?
我试图创建一个java程序,它可以读取一个名为file1.txt的文件,存储它的字符串,并将这些字符串搜索到另一个名为file2.txt的文件,如果没有找到匹配,则从file1.txt打印特定的字符串。 现在我可以从file1.txt获得数据,但无法搜索file1的数据,例如在file2.txt中搜索单词“home” 请看这里的file1.txt包含Homee,而file2.txt有Home,所以
问题内容: 我正在尝试使用php创建一个脚本,该脚本将在文本文件中搜索并获取整行并回显它。 我有一个名为“ numorder.txt”的文本文件(.txt),并且在该文本文件中有几行数据,每5分钟会有新行出现(使用cron作业)。数据类似于: 我将如何创建一个php脚本来搜索数据“ aullah1”,然后抓起整行并回显它?(一旦回显,它应该显示“ 2 aullah1”(不带引号)。 如果我没有清楚
问题内容: 我可以使用一个ResultSet方法搜索一个ResultSet并检查它是否具有特定的值/元素吗? 与方法类似。 如果没有,则无需键入搜索方法,我将做一个:) 提前致谢。 问题答案: 不要在Java端进行搜索。这不必要地很慢,并且占用内存。您基本上是在接手数据库的设计工作。只需让DB完成它设计的工作即可:借助SQL语言的强大功能,选择并返回所需的数据。 开始学习SQL子句。例如,要检查用