我有一个csv文件格式的大型PC库存。我想写一个代码,帮助我找到所需的信息。具体来说,我想输入用户名的名称或部分名称(用户名位于文件的第5列),代码为我提供该计算机的名称(计算机名称位于文件中的第二列)。我的代码不起作用,我不知道是什么问题。谢谢你的帮助,我很感激!
import csv #import csv library
#open PC Inventory file
info = csv.reader(open('Creedmoor PC Inventory.csv', 'rb'), delimiter=',')
key_index = 4 # Names are in column 5 (array index is 4)
user = raw_input("Please enter employee's name:")
rows = enumerate(info)
for row in rows:
if row == user: #name is in the PC Inventory
print row #show the computer name
答案 0 :(得分:2)
这里有三个问题。
首先,从rows = enumerate(info)
开始,row
中的每个rows
都将成为行号和实际行的元组。
其次,实际行本身是一系列列。
因此,如果要将user
与(索引,行)元组的第五列进行比较,则需要执行以下操作:
if row[1][key_index] == user:
或者,更清楚:
for index, row in rows:
if row[key_index] == user:
print row[1]
或者,如果您实际上不需要行号,请不要使用枚举:
for row in info:
if row[key_index] == user:
print row[1]
但这只会让您遇到第三个问题:您希望能够搜索名称或名称的一部分。因此,您需要in
运算符:
for row in info:
if user in row[key_index]:
print row[1]
将整个内容读入可搜索的数据结构会更清楚:
inventory = { row[key_index]: row for row in info }
然后您不需要for
循环来搜索用户;你可以这样做:
print inventory[user][1]
但是,不幸的是,这对于进行子字符串搜索不起作用。您需要更复杂的数据结构。如果您只需要前缀搜索,那么trie或任何已排序/可二分的结构都可以工作;如果你需要任意子串搜索,你需要更高级的东西,这可能不值得做。
您可以考虑使用数据库。例如,使用SQL数据库(如sqlite3
),您可以执行以下操作:
cur = db.execute('SELECT Computer FROM Inventory WHERE Name LIKE %s', name)
导入CSV文件和编写数据库不是太,如果你要针对单个CSV文件运行大量搜索,那么它可能是值得的。 (另外,如果您当前正在通过在Excel或LibreOffice中打开CSV,修改它并重新导出它来编辑文件,您只需将Excel / LO电子表格附加到数据库进行编辑。)否则,它将只是让事情变得更加复杂。
答案 1 :(得分:0)
enumerate
返回索引元素对的迭代器。你真的不需要它。此外,您忘记使用key_index
:
for row in info:
if row[key_index] == user:
print row
答案 2 :(得分:0)
如果不知道文件的样子,很难说出错了,但我很确定错误是:
for row in info:
if row[key_Index] == user: #name is in the PC Inventory
print row #show the computer name
您确定了列的位置,但忘记从您与用户进行比较的每一行中获取该列,因此最后您要将字符串与列表进行比较。
并且您不需要枚举,默认情况下您会遍历行。